changeset 18895:ed676ed67a5c

manifestmerge: handle workdir removed, remote removed with flags This can happen when a file with flags is removed or deleted in the working directory and also not present in m2. The obvious solution is to add a __delitem__ override to manifestdict that removes the file from flags if necessary, but that has a significant performance cost in some cases, e.g. hg status --rev rev1 --rev rev2 <file>.
author Siddharth Agarwal <sid0@fb.com>
date Wed, 10 Apr 2013 12:34:42 -0700
parents ed46c2b98b0d
children 4085c9fafb8e
files mercurial/merge.py tests/test-update-issue1456.t
diffstat 2 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/merge.py	Wed Apr 10 12:31:07 2013 -0700
+++ b/mercurial/merge.py	Wed Apr 10 12:34:42 2013 -0700
@@ -246,7 +246,13 @@
         if n12:
             n1, n2 = n12
         else: # file contents didn't change, but flags did
-            n1 = n2 = m1[f]
+            n1 = n2 = m1.get(f, None)
+            if n1 is None:
+                # Since n1 == n2, the file isn't present in m2 either. This
+                # means that the file was removed or deleted locally and
+                # removed remotely, but that residual entries remain in flags.
+                # This can happen in manifests generated by workingctx.
+                continue
         if fl12:
             fl1, fl2 = fl12
         else: # flags didn't change, file contents did
--- a/tests/test-update-issue1456.t	Wed Apr 10 12:31:07 2013 -0700
+++ b/tests/test-update-issue1456.t	Wed Apr 10 12:34:42 2013 -0700
@@ -6,9 +6,16 @@
 
   $ echo foo > foo
   $ hg ci -qAm0
-  $ chmod +x foo
-  $ hg ci -m1
+  $ echo toremove > toremove
+  $ echo todelete > todelete
+  $ chmod +x foo toremove todelete
+  $ hg ci -qAm1
+
+Test that local removed/deleted, remote removed works with flags
+  $ hg rm toremove
+  $ rm todelete
   $ hg co -q 0
+
   $ echo dirty > foo
   $ hg up -c
   abort: uncommitted local changes
@@ -18,11 +25,13 @@
   dirty
   $ hg st -A
   M foo
+  C todelete
+  C toremove
 
 Validate update of standalone execute bit change:
 
   $ hg up -C 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ chmod -x foo
   $ hg ci -m removeexec
   nothing changed
@@ -30,7 +39,7 @@
   $ hg up -C 0
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg up
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg st
 
   $ cd ..