# HG changeset patch # User Sushil khanchi # Date 2019-02-13 10:20:14 # Node ID 7694b685bb10ab11976713d3f305d0949bc5581b # Parent fc4b7a46fda1ffada5ff3deb8871b3dd94029182 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 diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -608,7 +608,7 @@ def _fullcopytracing(repo, c1, c2, base) 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 @@ def _fullcopytracing(repo, c1, c2, base) 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, diff --git a/tests/test-copies.t b/tests/test-copies.t --- a/tests/test-copies.t +++ b/tests/test-copies.t @@ -554,8 +554,9 @@ Grafting revision 4 on top of revision 2 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 @@ Test which demonstrate that fullcopytrac 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)