diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -1971,8 +1971,13 @@ ``write()`` can be called successfully. """ wvfs = self._repo.wvfs - if wvfs.isdir(self._path) and not wvfs.islink(self._path): - wvfs.removedirs(self._path) + f = self._path + if wvfs.isdir(f) and not wvfs.islink(f): + wvfs.rmtree(f, forcibly=True) + for p in reversed(list(util.finddirs(f))): + if wvfs.isfileorlink(p): + wvfs.unlink(p) + break def setflags(self, l, x): self._repo.wvfs.setflags(self._path, l, x) diff --git a/tests/test-pathconflicts-basic.t b/tests/test-pathconflicts-basic.t --- a/tests/test-pathconflicts-basic.t +++ b/tests/test-pathconflicts-basic.t @@ -35,6 +35,7 @@ [1] $ hg update --clean . 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ rm a~853701544ac3+ Basic update - local directory conflicts with remote file @@ -46,13 +47,19 @@ abort: untracked files in working directory differ from files in requested revision [255] $ hg up --clean file - abort: *: '$TESTTMP/repo/a' (glob) - [255] + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (activating bookmark file) + +Repo state is ok -Repo is in a very bad state now - recover manually - - $ rm -r a - $ hg up -q --clean 0 + $ hg sum + parent: 1:853701544ac3 + file + branch: default + bookmarks: *file + commit: (clean) + update: 2 new changesets (update) + phases: 4 draft Basic update - untracked file conflicts with remote directory @@ -62,6 +69,9 @@ a: replacing untracked file 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (activating bookmark dir) + $ cat a.orig + untracked + $ rm -f a.orig Basic clean update - local directory conflicts with changed remote file @@ -73,11 +83,17 @@ abort: *: '$TESTTMP/repo/a' (glob) [255] $ hg up --clean file2 - abort: *: '$TESTTMP/repo/a' (glob) - [255] + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (activating bookmark file2) + +Repo state is ok -Repo is in a very bad state now - recover manually + $ hg sum + parent: 2:f64e09fac717 + file2 + branch: default + bookmarks: *file2 + commit: (clean) + update: 1 new changesets, 2 branch heads (merge) + phases: 4 draft - $ rm -r a - $ hg up -q --clean 0 -