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