This is an archive of the discontinued Mercurial Phabricator instance.

copies: filter out copies grafted from another branch
ClosedPublic

Authored by martinvonz on Mar 5 2021, 7:41 PM.

Details

Summary

Consider this simple history:

@  3 modify y
|
o  2 copy x to y, modify x
|
| o  1 copy x to y, modify x
|/
o  0 add x

If we now rebase commit 3 onto 1, Mercurial will look for copies
between commit 2 and commit 1. It does that by going backwards from 2
to 0 and then forwards from 0 to 1. It will find that x was copied to
y, since that was what happened on the path between them (namely in
commit 1). That leads Mercurial to do a 3-way merge between y@3 and
y@1 with x@2 as base. We want to use y@2 as base instead. That's also
what happened until commit 1d6d1a15. This patch fixes the regression
by adding another filtering step when chaining copies via a
diffbase. The new filtering step removes copies that were the same
between the two branches (same source and destination, but not
necessarily the same contents).

Diff Detail

Repository
rHG Mercurial
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.