Patchwork D8531: flags: account for flag change when tracking rename relevant to merge

login
register
mail settings
Submitter phabricator
Date May 16, 2020, 8:11 p.m.
Message ID <differential-rev-PHID-DREV-v2xunuvfhtkpmj7vsbgm-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46320/
State Superseded
Headers show

Comments

phabricator - May 16, 2020, 8:11 p.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

BRANCH
  stable

REVISION DETAIL
  https://phab.mercurial-scm.org/D8531

AFFECTED FILES
  mercurial/copies.py
  tests/test-merge-exec.t

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-merge-exec.t b/tests/test-merge-exec.t
--- a/tests/test-merge-exec.t
+++ b/tests/test-merge-exec.t
@@ -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 ..
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -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