[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