Mercurial > hg-stable
changeset 42204:31abb9d713af
copies: don't include copies that are not in source in directory move
I've been working on a rewrite of mergecopies(). I compared the output
of the rewritten version with the current version. I noticed that
between FIREFOX_NIGHTLY_59_END and FIREFOX_BETA_60_BASE in the
mozilla-unified repo, there were many copies that the current version
detected that the rewritten version did not. One example was
js/src/gc/Iteration.h -> js/src/gc/PublicIterators.h. Then I realized
that js/src/gc/Iteration.h doesn't even exist in
FIREFOX_NIGHTLY_59_END.
This patch adds a filtering step for the "fullcopy" dict. It turns out
that that change also affects the test for issue5020 in
test-merge-criss-cross.t. The 'dm' action no longer happens there. At
first I thought that the test case change meant that this patch was
broken, but I think it's actually correct tha the 'dm' action should
not happen there. The result of the bid merge is still the same.
I suspect this filtering is a better solution for the issue than
41f6af50c0d8 (merge: fix crash on criss cross merge with dir move and
delete (issue5020), 2017-01-31). I also suspect that it was broken
just a few months earlier by a005c33d0bd7 (mergecopies: add logic to
process incomplete data, 2016-10-04). Note that bid merge had been
enabled for a few years at that point, since 19903277f035 (merge: use
bid merge by default (BC), 2014-10-01).
This patch is still just a workaround. It will be cleaned up soon
(with the rewrite of mergecopies()). But doing this in a separate
patch makes later patches easier to understand and gives a place to
explain why this is changing.
Differential Revision: https://phab.mercurial-scm.org/D6244
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 12 Apr 2019 22:03:04 -0700 |
parents | 7815cf0ea88b |
children | beec7fc6adec |
files | mercurial/copies.py tests/test-merge-criss-cross.t |
diffstat | 2 files changed, 7 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/copies.py Sat Apr 13 00:24:17 2019 -0700 +++ b/mercurial/copies.py Fri Apr 12 22:03:04 2019 -0700 @@ -682,6 +682,11 @@ if len(fl) == 2 and fl[0] == fl[1]: copy[fl[0]] = of # not actually divergent, just matching renames + # Sometimes we get invalid copies here (the "and not remotebase" in + # _checkcopies() seems suspicious). Filter them out. + for dst, src in fullcopy.copy().items(): + if src not in mb: + del fullcopy[dst] if fullcopy and repo.ui.debugflag: repo.ui.debug(" all copies found (* = to merge, ! = divergent, " "% = renamed and deleted):\n")
--- a/tests/test-merge-criss-cross.t Sat Apr 13 00:24:17 2019 -0700 +++ b/tests/test-merge-criss-cross.t Fri Apr 12 22:03:04 2019 -0700 @@ -423,17 +423,10 @@ d1/b unmatched files in other: d2/b - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'd1/b' -> dst: 'd2/b' - checking for directory renames - discovered dir src: 'd1/' -> dst: 'd2/' - pending file src: 'd1/a' -> dst: 'd2/a' - pending file src: 'd1/b' -> dst: 'd2/b' resolving manifests branchmerge: True, force: False, partial: False ancestor: 11b5b303e36c, local: c0ef19750a22+, remote: 6ca01f7342b9 - d2/a: remote directory rename - move from d1/a -> dm - d2/b: remote directory rename, both created -> m + d2/b: remote created -> g calculating bids for ancestor 154e6000f54e searching for copies back to rev 3 @@ -453,8 +446,7 @@ auction for merging merge bids d1/a: consensus for r d1/b: consensus for r - d2/a: consensus for dm - d2/b: picking 'get' action + d2/b: consensus for g end of auction d1/a: other deleted -> r