dirstate.remove: during merges, remember the previous file state
We encode the previous state as a negative file size (AFAICS, previous
versions of hg always have size == 0 when state == 'r').
We save the state of 'm'erged and dirty files, because they're the
two states that indicate that a file has to be committed on a merge
to correctly record per-file history.
--- a/mercurial/dirstate.py Tue Mar 18 04:07:39 2008 -0300
+++ b/mercurial/dirstate.py Tue Mar 18 04:07:39 2008 -0300
@@ -270,8 +270,15 @@
'mark a file removed'
self._dirty = True
self._changepath(f, 'r')
- self._map[f] = ('r', 0, 0, 0, 0)
- if f in self._copymap:
+ size = 0
+ if self._pl[1] != nullid and f in self._map:
+ entry = self._map[f]
+ if entry[0] == 'm':
+ size = -1
+ elif entry[0] == 'n' and entry[2] == -2:
+ size = -2
+ self._map[f] = ('r', 0, size, 0, 0)
+ if size == 0 and f in self._copymap:
del self._copymap[f]
def merge(self, f):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-merge-remove Tue Mar 18 04:07:39 2008 -0300
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+hg init repo
+cd repo
+
+echo foo > foo
+echo bar > bar
+hg ci -qAm 'add foo bar'
+
+echo foo2 >> foo
+echo bleh > bar
+hg ci -m 'change foo bar'
+
+hg up -qC 0
+hg mv foo foo1
+echo foo1 > foo1
+hg cat foo >> foo1
+hg ci -m 'mv foo foo1'
+
+hg merge
+hg debugstate --nodates
+hg st -q
+
+echo '% removing foo1 and bar'
+cp foo1 F
+cp bar B
+hg rm -f foo1 bar
+hg debugstate --nodates
+hg st -qC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-merge-remove.out Tue Mar 18 04:07:39 2008 -0300
@@ -0,0 +1,15 @@
+merging foo1 and foo
+1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+n 0 -2 bar
+m 644 14 foo1
+copy: foo -> foo1
+M bar
+M foo1
+% removing foo1 and bar
+r 0 -2 bar
+r 0 -1 foo1
+copy: foo -> foo1
+R bar
+R foo1
+ foo