changeset 41227:b74481038438

narrow: make dirstateguard back up and restore working copy narrowspec instead We used to have only one narrowspec for the store and the working copy, but now that we have one narrowspec for each, it seems clear that the dirstateguard was supposed to back up and restore the narrowspec associated with the working copy, not the one associated with the store. clearbackup() (for the store narrowspec) is not needed because the presence of the file in localrepository._journalfiles() takes care of that. Differential Revision: https://phab.mercurial-scm.org/D5504
author Martin von Zweigbergk <martinvonz@google.com>
date Sat, 29 Dec 2018 22:27:39 -0800
parents 0f2b8d51bfdf
children 3b35ebdb9f8c
files mercurial/dirstateguard.py mercurial/narrowspec.py
diffstat 2 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstateguard.py	Thu Jan 10 13:36:25 2019 -0800
+++ b/mercurial/dirstateguard.py	Sat Dec 29 22:27:39 2018 -0800
@@ -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
--- a/mercurial/narrowspec.py	Thu Jan 10 13:36:25 2019 -0800
+++ b/mercurial/narrowspec.py	Sat Dec 29 22:27:39 2018 -0800
@@ -185,10 +185,25 @@
         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)
+    # It may not exist in old repos
+    if vfs.exists(DIRSTATE_FILENAME):
+        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,