diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -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, 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 @@ 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)