diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -244,6 +244,21 @@ class dirstate(object): def normallookup(self, f): 'mark a file normal, but possibly dirty' + if self._pl[1] != nullid and f in self._map: + # if there is a merge going on and the file was either + # in state 'm' or dirty before being removed, restore that state. + entry = self._map[f] + if entry[0] == 'r' and entry[2] in (-1, -2): + source = self._copymap.get(f) + if entry[2] == -1: + self.merge(f) + elif entry[2] == -2: + self.normaldirty(f) + if source: + self.copy(source, f) + return + if entry[0] == 'm' or entry[0] == 'n' and entry[2] == -2: + return self._dirty = True self._changepath(f, 'n', True) self._map[f] = ('n', 0, -1, -1, 0) diff --git a/tests/test-confused-revert.out b/tests/test-confused-revert.out --- a/tests/test-confused-revert.out +++ b/tests/test-confused-revert.out @@ -22,6 +22,7 @@ abort: uncommitted merge - please provid undeleting a forgetting b %%% should show b unknown and a marked modified (merged) +M a ? b %%% should show foo-b foo-b diff --git a/tests/test-merge-remove b/tests/test-merge-remove --- a/tests/test-merge-remove +++ b/tests/test-merge-remove @@ -27,3 +27,10 @@ cp bar B hg rm -f foo1 bar hg debugstate --nodates hg st -qC + +echo '% readding foo1 and bar' +cp F foo1 +cp B bar +hg add -v foo1 bar +hg debugstate --nodates +hg st -qC diff --git a/tests/test-merge-remove.out b/tests/test-merge-remove.out --- a/tests/test-merge-remove.out +++ b/tests/test-merge-remove.out @@ -13,3 +13,12 @@ copy: foo -> foo1 R bar R foo1 foo +% readding foo1 and bar +adding bar +adding foo1 +n 0 -2 bar +m 644 14 foo1 +copy: foo -> foo1 +M bar +M foo1 + foo