Patchwork [08,of,12,v2] checkcopies: handle divergences contained entirely in tca::ctx

login
register
mail settings
Submitter Gábor Stefanik
Date Oct. 16, 2016, 3:15 p.m.
Message ID <73b55839aca7019d88cc.1476630945@GSTEFANIK.NavnGo.local>
Download mbox | patch
Permalink /patch/17137/
State Accepted
Headers show

Comments

Gábor Stefanik - Oct. 16, 2016, 3:15 p.m.
# HG changeset patch
# User Gábor Stefanik <gabor.stefanik@nng.com>
# Date 1476266043 -7200
#      Wed Oct 12 11:54:03 2016 +0200
# Node ID 73b55839aca7019d88cc9885e43244fb1e6d68ab
# Parent  e61355cb337ab5328e4cf5d0f153821600c53e72
checkcopies: handle divergences contained entirely in tca::ctx

During a graftlike merge, _checkcopies runs from ctx to tca, possibly
passing over the merge base. If there is a rename both before and after
the base, then we're actually dealing with divergent renames.
If there is no rename on the other side of tca, then the divergence is
contained entirely in the range of one _checkcopies invocation, and
should be detected "in the loop" without having to rely on the other
_checkcopies pass.

Patch

diff -r e61355cb337a -r 73b55839aca7 mercurial/copies.py
--- a/mercurial/copies.py	Thu Oct 13 02:19:43 2016 +0200
+++ b/mercurial/copies.py	Wed Oct 12 11:54:03 2016 +0200
@@ -564,9 +564,8 @@ 
     # traversed backwards.
     #
     # In the case there is both backward and forward renames (before and after
-    # the base) this is more complicated as we must detect a divergence. This
-    # is currently broken and hopefully some later code update will make that
-    # work (we use 'backwards = False' in that case)
+    # the base) this is more complicated as we must detect a divergence.
+    # We use 'backwards = False' in that case.
     backwards = base != tca and f in mb
     getfctx = _makegetfctx(ctx)
 
@@ -600,6 +599,12 @@ 
                 data['copy'][of] = f
             elif of in mb:
                 data['copy'][f] = of
+            else: # divergence w.r.t. graft CA on one side of topological CA
+                for sf in seen:
+                    if sf in mb:
+                        assert sf not in data['diverge']
+                        data['diverge'][sf] = [f, of]
+                        break
             return
 
     if of in mb:
diff -r e61355cb337a -r 73b55839aca7 tests/test-graft.t
--- a/tests/test-graft.t	Thu Oct 13 02:19:43 2016 +0200
+++ b/tests/test-graft.t	Wed Oct 12 11:54:03 2016 +0200
@@ -982,6 +982,9 @@ 
 
   $ HGEDITOR="echo D1 >" hg graft -r 'desc("D0")' --edit
   grafting 3:b69f5839d2d9 "D0"
+  note: possible conflict - f3b was renamed multiple times to:
+   f3d
+   f3a
   warning: can't find ancestor for 'f3d' copied from 'f3b'!
 
 Set up the repository for some further tests