diff --git a/mercurial/dirstateguard.py b/mercurial/dirstateguard.py --- a/mercurial/dirstateguard.py +++ b/mercurial/dirstateguard.py @@ -37,7 +37,7 @@ self._narrowspecbackupname = ('narrowspec.backup.%s.%d' % (name, id(self))) repo.dirstate.savebackup(repo.currenttransaction(), self._backupname) - narrowspec.savebackup(repo, self._narrowspecbackupname) + narrowspec.savewcbackup(repo, self._narrowspecbackupname) self._active = True def __del__(self): @@ -56,12 +56,12 @@ self._repo.dirstate.clearbackup(self._repo.currenttransaction(), self._backupname) - narrowspec.clearbackup(self._repo, self._narrowspecbackupname) + narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname) self._active = False self._closed = True def _abort(self): - narrowspec.restorebackup(self._repo, self._narrowspecbackupname) + narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname) self._repo.dirstate.restorebackup(self._repo.currenttransaction(), self._backupname) self._active = False diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py --- a/mercurial/narrowspec.py +++ b/mercurial/narrowspec.py @@ -185,10 +185,23 @@ return util.rename(repo.svfs.join(backupname), repo.svfs.join(FILENAME)) -def clearbackup(repo, backupname): +def savewcbackup(repo, backupname): if repository.NARROW_REQUIREMENT not in repo.requirements: return - repo.svfs.unlink(backupname) + vfs = repo.vfs + vfs.tryunlink(backupname) + util.copyfile(vfs.join(DIRSTATE_FILENAME), vfs.join(backupname), + hardlink=True) + +def restorewcbackup(repo, backupname): + if repository.NARROW_REQUIREMENT not in repo.requirements: + return + util.rename(repo.vfs.join(backupname), repo.vfs.join(DIRSTATE_FILENAME)) + +def clearwcbackup(repo, backupname): + if repository.NARROW_REQUIREMENT not in repo.requirements: + return + repo.vfs.unlink(backupname) def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes): r""" Restricts the patterns according to repo settings,