Patchwork [2,of,2] keyword: handle resolve to either parent

login
register
mail settings
Submitter Christian Ebert
Date Dec. 21, 2014, 11:52 p.m.
Message ID <e7163a330a46fb540e9a.1419205934@1.0.0.127.in-addr.arpa>
Download mbox | patch
Permalink /patch/7189/
State Accepted
Headers show

Comments

Christian Ebert - Dec. 21, 2014, 11:52 p.m.
# HG changeset patch
# User Christian Ebert <blacktrash@gmx.net>
# Date 1419166979 0
#      Sun Dec 21 13:02:59 2014 +0000
# Node ID e7163a330a46fb540e9a04b865cc72103c9c8718
# Parent  a43065a3286da13b13c52405d080230e5cf32002
keyword: handle resolve to either parent

Merged files are considered modified at commit time even if only 1 parent
differs. In this case we must use the change context of this parent for
expansion.

The issue went unnoticed for long because it is only apparent until the next
update to the merge revision - except in test-keyword where it was always
staring us in the face.
Augie Fackler - Dec. 22, 2014, 8:52 p.m.
On Sun, Dec 21, 2014 at 11:52:14PM +0000, Christian Ebert wrote:
> # HG changeset patch
> # User Christian Ebert <blacktrash@gmx.net>
> # Date 1419166979 0
> #      Sun Dec 21 13:02:59 2014 +0000
> # Node ID e7163a330a46fb540e9a04b865cc72103c9c8718
> # Parent  a43065a3286da13b13c52405d080230e5cf32002
> keyword: handle resolve to either parent

Sure, queued.

>
> Merged files are considered modified at commit time even if only 1 parent
> differs. In this case we must use the change context of this parent for
> expansion.
>
> The issue went unnoticed for long because it is only apparent until the next
> update to the merge revision - except in test-keyword where it was always
> staring us in the face.
>
> diff --git a/hgext/keyword.py b/hgext/keyword.py
> --- a/hgext/keyword.py
> +++ b/hgext/keyword.py
> @@ -264,8 +264,17 @@ class kwtemplater(object):
>              if util.binary(data):
>                  continue
>              if expand:
> +                parents = ctx.parents()
>                  if lookup:
>                      ctx = self.linkctx(f, mf[f])
> +                elif self.restrict and len(parents) > 1:
> +                    # merge commit
> +                    # in case of conflict f is in modified state during
> +                    # merge, even if f does not differ from f in parent
> +                    for p in parents:
> +                        if f in p and not p[f].cmp(ctx[f]):
> +                            ctx = p[f].changectx()
> +                            break
>                  data, found = self.substitute(data, f, ctx, re_kw.subn)
>              elif self.restrict:
>                  found = re_kw.search(data)
> diff --git a/tests/test-keyword.t b/tests/test-keyword.t
> --- a/tests/test-keyword.t
> +++ b/tests/test-keyword.t
> @@ -1062,13 +1062,13 @@ conflict: keyword should stay outside co
>    foo
>    >>>>>>> other: 85d2d2d732a5  - test: simplemerge
>
> -resolve to local
> +resolve to local, m must contain hash of last change (local parent)
>
>    $ hg resolve -t internal:local -a
>    (no more unresolved files)
>    $ hg commit -m localresolve
>    $ cat m
> -  $Id: m 800511b3a22d Thu, 01 Jan 1970 00:00:00 +0000 test $
> +  $Id: m 88a80c8d172e Thu, 01 Jan 1970 00:00:00 +0000 test $
>    bar
>
>  Test restricted mode with transplant -b
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/hgext/keyword.py b/hgext/keyword.py
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -264,8 +264,17 @@  class kwtemplater(object):
             if util.binary(data):
                 continue
             if expand:
+                parents = ctx.parents()
                 if lookup:
                     ctx = self.linkctx(f, mf[f])
+                elif self.restrict and len(parents) > 1:
+                    # merge commit
+                    # in case of conflict f is in modified state during
+                    # merge, even if f does not differ from f in parent
+                    for p in parents:
+                        if f in p and not p[f].cmp(ctx[f]):
+                            ctx = p[f].changectx()
+                            break
                 data, found = self.substitute(data, f, ctx, re_kw.subn)
             elif self.restrict:
                 found = re_kw.search(data)
diff --git a/tests/test-keyword.t b/tests/test-keyword.t
--- a/tests/test-keyword.t
+++ b/tests/test-keyword.t
@@ -1062,13 +1062,13 @@  conflict: keyword should stay outside co
   foo
   >>>>>>> other: 85d2d2d732a5  - test: simplemerge
 
-resolve to local
+resolve to local, m must contain hash of last change (local parent)
 
   $ hg resolve -t internal:local -a
   (no more unresolved files)
   $ hg commit -m localresolve
   $ cat m
-  $Id: m 800511b3a22d Thu, 01 Jan 1970 00:00:00 +0000 test $
+  $Id: m 88a80c8d172e Thu, 01 Jan 1970 00:00:00 +0000 test $
   bar
 
 Test restricted mode with transplant -b