Skip to content
  • Martin von Zweigbergk's avatar
    copies: filter out copies grafted from another branch · 2803f94b7431
    Martin von Zweigbergk authored
    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 1d6d1a15a963. 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).
    
    Differential Revision: https://phab.mercurial-scm.org/D10120
    2803f94b7431