changeset 41932:7694b685bb10

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
author Sushil khanchi <sushilkhanchi97@gmail.com>
date Wed, 13 Feb 2019 15:50:14 +0530
parents fc4b7a46fda1
children 2eee280a1354
files mercurial/copies.py tests/test-copies.t
diffstat 2 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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)