copies: handle a case when both merging csets are not descendant of merge base
authorSushil khanchi <sushilkhanchi97@gmail.com>
Wed, 13 Feb 2019 15:50:14 +0530
changeset 41932 7694b685bb10
parent 41931 fc4b7a46fda1
child 41933 2eee280a1354
copies: handle a case when both merging csets are not descendant of merge base This patch fix the behaviour of fullcopytracing algorithm in the case when both the merging csets are not the descendant of merge base. Although it seems to be the rare case when both the csets are not descendant of merge base. But it can be seen in most of cases of content-divergence in evolve extension, where merge base is the common predecessor. Previous patch added a test where this algorithm can fail to continue because of an assumption that only one of the two csets can be dirty. This patch fix that error. For refrence I suggest you to look into the previous discussion held on a patch sent by Pulkit: https://phab.mercurial-scm.org/D3896 Differential Revision: https://phab.mercurial-scm.org/D5963
mercurial/copies.py
tests/test-copies.t
--- a/mercurial/copies.py	Thu Feb 14 16:09:43 2019 +0530
+++ b/mercurial/copies.py	Wed Feb 13 15:50:14 2019 +0530
@@ -608,7 +608,7 @@
     if dirtyc1:
         _combinecopies(data2['incomplete'], data1['incomplete'], copy, diverge,
                        incompletediverge)
-    else:
+    if dirtyc2:
         _combinecopies(data1['incomplete'], data2['incomplete'], copy, diverge,
                        incompletediverge)
 
@@ -647,7 +647,13 @@
     for f in bothnew:
         _checkcopies(c1, c2, f, base, tca, dirtyc1, limit, both1)
         _checkcopies(c2, c1, f, base, tca, dirtyc2, limit, both2)
-    if dirtyc1:
+    if dirtyc1 and dirtyc2:
+        remainder = _combinecopies(both2['incomplete'], both1['incomplete'],
+                                   copy, bothdiverge, bothincompletediverge)
+        remainder1 = _combinecopies(both1['incomplete'], both2['incomplete'],
+                                   copy, bothdiverge, bothincompletediverge)
+        remainder.update(remainder1)
+    elif dirtyc1:
         # incomplete copies may only be found on the "dirty" side for bothnew
         assert not both2['incomplete']
         remainder = _combinecopies({}, both1['incomplete'], copy, bothdiverge,
--- a/tests/test-copies.t	Thu Feb 14 16:09:43 2019 +0530
+++ b/tests/test-copies.t	Wed Feb 13 15:50:14 2019 +0530
@@ -554,8 +554,9 @@
       b
      +baba
   
-Test which demonstrate that fullcopytracing algorithm can fail to handle a case when both the csets are dirty
-----------------------------------------------------------------------------------------------------------
+Test to make sure that fullcopytracing algorithm don't fail when both the merging csets are dirty
+(a dirty cset is one who is not the descendant of merge base)
+-------------------------------------------------------------------------------------------------
 
   $ newrepo
   $ echo a > a
@@ -628,6 +629,5 @@
 Now if we trigger a merge between cset revision 3 and 6 using base revision 4, in this case
 both the merging csets will be dirty as no one is descendent of base revision:
 
-  $ hg graft -r 6 --base 4 --hidden 2>&1 | grep "AssertionError"
-  AssertionError
-
+  $ hg graft -r 6 --base 4 --hidden -t :other
+  grafting 6:99802e4f1e46 "added willconflict and d" (tip)