dirstate.remove: during merges, remember the previous file state
authorAlexis S. L. Carvalho <alexis@cecm.usp.br>
Tue, 18 Mar 2008 04:07:39 -0300
changeset 6297 fed1a9c22076
parent 6296 a9e6b8875805
child 6298 53cbb33e1269
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.
mercurial/dirstate.py
tests/test-merge-remove
tests/test-merge-remove.out
--- 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