[PATCH STABLE] templater: don't overwrite the keyword mapping in runsymbol() (issue4362)

Augie Fackler raf at durin42.com
Mon Nov 3 21:23:28 CST 2014


On Nov 3, 2014, at 8:40 PM, Matt Harbison <matt_harbison at yahoo.com> wrote:

> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1415034483 18000
> #      Mon Nov 03 12:08:03 2014 -0500
> # Branch stable
> # Node ID a96d95a52e71cb48df9d361768b5bf9ddfa4b673
> # Parent  72a89cf86fcd78dfa500031b5734147e6b830fbc
> templater: don't overwrite the keyword mapping in runsymbol() (issue4362)

Queued for stable with enthusiasm. Fixes some other templater stuff that had been vexing me greatly.

> 
> This keyword remapping was introduced in e06e9fd2d99f as part of converting
> generator based iterators into list based iterators, mentioning "undesired
> behavior in template" when a generator is exhausted, but doesn't say what and
> introduces no tests.
> 
> The problem with the remapping was that it corrupted the output for keywords
> like 'extras', 'file_copies' and 'file_copies_switch' in templates such as:
> 
>    $ hg log -r 142b5d5ec9cc --template "{file_copies % ' File: {file_copy}\n'}"
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
>    File: mercurial/changelog.py (mercurial/hg.py)
> 
> What was happening was that in the first call to runtemplate() inside runmap(),
> 'lm' mapped the keyword (e.g. file_copies) to the appropriate showxxx() method.
> On each subsequent call to runtemplate() in that loop however, the keyword was
> mapped to a list of the first item's pieces, e.g.:
> 
>   'file_copy': ['mercurial/changelog.py', ' (', 'mercurial/hg.py', ')']
> 
> Therefore, the dict for the second and any subsequent items were not processed
> through the corresponding showxxx() method, and the first item's data was
> reused.
> 
> The 'extras' keyword regressed in de7e6c489412, and 'file_copies' regressed in
> 0b241d7a8c62 for other reasons.  The common thread of things fixed by this seems
> to be when a list of dicts are passed to the templatekw._hybrid class.
> 
> diff --git a/mercurial/templater.py b/mercurial/templater.py
> --- a/mercurial/templater.py
> +++ b/mercurial/templater.py
> @@ -153,8 +153,6 @@
>         return v(**mapping)
>     if isinstance(v, types.GeneratorType):
>         v = list(v)
> -        mapping[key] = v
> -        return v
>     return v
> 
> def buildfilter(exp, context):
> diff --git a/tests/test-convert-hg-source.t b/tests/test-convert-hg-source.t
> --- a/tests/test-convert-hg-source.t
> +++ b/tests/test-convert-hg-source.t
> @@ -16,6 +16,12 @@
>   $ hg copy foo baz
>   $ hg ci -m 'make bar and baz copies of foo' -d '2 0'
>   created new head
> +
> +Test that template can print all file copies (issue4362)
> +  $ hg log -r . --template "{file_copies % ' File: {file_copy}\n'}"
> +   File: bar (foo)
> +   File: baz (foo)
> +
>   $ hg bookmark premerge1
>   $ hg merge -r 1
>   merging baz and foo to baz
> diff --git a/tests/test-graft.t b/tests/test-graft.t
> --- a/tests/test-graft.t
> +++ b/tests/test-graft.t
> @@ -478,6 +478,12 @@
>   date:        Thu Jan 01 00:00:00 1970 +0000
>   summary:     2
> 
> +Test that template correctly expands more than one 'extra' (issue4362)
> +  $ hg -R ../converted log -r 7 --template "{extras % ' Extra: {extra}\n'}"
> +   Extra: branch=default
> +   Extra: convert_revision=ef0ef43d49e79e81ddafdc7997401ba0041efc82
> +   Extra: source=e0213322b2c1a5d5d236c74e79666441bee67a7d
> +
> The transplant case
>   $ hg -R ../converted log -r tip --template "{rev}: {node}\n{join(extras, '\n')}\n"
>   21: fbb6c5cc81002f2b4b49c9d731404688bcae5ade
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list