templater: do not pre-evaluate generator keyword at runsymbol (issue4868) stable
authorYuya Nishihara <yuya@tcha.org>
Thu, 08 Oct 2015 23:24:38 +0900
branchstable
changeset 26535 d3712209921d
parent 26503 5a84a453b503
child 26564 bed9e6c706f6
child 26813 b66e3ca0b90c
templater: do not pre-evaluate generator keyword at runsymbol (issue4868) It was introduced by e06e9fd2d99f, but the important code was removed by a3c2d9211294. So there was no positive effect other than exhausting memory. The problem spotted by e06e9fd2d99f is that you can't use a generator keyword more than once. For example, in hgweb template, "{child} {child}" doesn't work because the first "{child}" consumes the generator. But as a3c2d9211294 says, the fix was wrong because it could overwrite a callable keyword that returns a generator. Also the fix didn't work for a generator of generator such as "{diff}" keyword. So, the proper fix for that problem would be to not put a generator in a keyword table. Instead, it should be a factory of a generator. Note that this should fix the memory issue in hgweb, but my firefox killed by OOM in place. Be careful to not use a modern web browser to test the issue4868.
mercurial/templater.py
--- a/mercurial/templater.py	Mon Oct 05 10:43:16 2015 -0600
+++ b/mercurial/templater.py	Thu Oct 08 23:24:38 2015 +0900
@@ -227,8 +227,6 @@
             v = ''
     if callable(v):
         return v(**mapping)
-    if isinstance(v, types.GeneratorType):
-        v = list(v)
     return v
 
 def buildtemplate(exp, context):