Mercurial > hg
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)