# HG changeset patch # User Pierre-Yves David # Date 1589654276 -7200 # Node ID d452acc8cce87b54e9a7ed4781d3ebba9fbc3f38 # Parent 9438c84d1dce8eeec41cf18b145c6df297c48037 flags: account for flag change when tracking rename relevant to merge There are some logic filtering rename to the one relevant to the merge. That logic was oblivious of flag change, leading to exec flag being dropped when merged with a renamed. There are two others bugs affecting this scenario. This patch fix the was where there is not modification involved except for the flag change. Fixes for the other bug are coming in later changesets. Differential Revision: https://phab.mercurial-scm.org/D8531 diff -r 9438c84d1dce -r d452acc8cce8 mercurial/copies.py --- a/mercurial/copies.py Sat May 16 20:37:44 2020 +0200 +++ b/mercurial/copies.py Sat May 16 20:37:56 2020 +0200 @@ -534,9 +534,9 @@ # thing in pathcopies(): pathcopies(x, y) can return a copy where the # destination doesn't exist in y. pass - elif m2[src] != mb[src]: - if not _related(c2[src], base[src]): - return + elif mb[src] != m2[src] and not _related(c2[src], base[src]): + return + elif mb[src] != m2[src] or mb.flags(src) != m2.flags(src): # modified on side 2 for dst in dsts1: copy[dst] = src diff -r 9438c84d1dce -r d452acc8cce8 tests/test-merge-exec.t --- a/tests/test-merge-exec.t Sat May 16 20:37:44 2020 +0200 +++ b/tests/test-merge-exec.t Sat May 16 20:37:56 2020 +0200 @@ -111,29 +111,25 @@ merge them (from the rename side) $ hg merge 'desc("make a executable")' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (false !) - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (true !) + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg st --copies - M z (false !) - a (false !) + M z + a $ [ -x z ] || echo "executable bit lost" - executable bit lost (true !) merge them (from the chmod side) $ hg up -C 'desc("make a executable")' 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg merge 'desc("rename a to z")' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (false !) - 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (true !) + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg st --copies M z - a (false !) + a R a $ [ -x z ] || echo "executable bit lost" - executable bit lost (true !) $ cd ..