# HG changeset patch # User Alexis S. L. Carvalho # Date 2008-03-18 07:07:39 # Node ID fed1a9c22076c0832eb9be86a6310b7f247fd6d6 # Parent a9e6b8875805749f0d31c72a19d15dccff0e4f27 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. diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -270,8 +270,15 @@ class dirstate(object): '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): diff --git a/tests/test-merge-remove b/tests/test-merge-remove new file mode 100755 --- /dev/null +++ b/tests/test-merge-remove @@ -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 diff --git a/tests/test-merge-remove.out b/tests/test-merge-remove.out new file mode 100644 --- /dev/null +++ b/tests/test-merge-remove.out @@ -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