narrow: fix crash when restoring backup in legacy repo stable
authorMartin von Zweigbergk <martinvonz@google.com>
Fri, 18 Jan 2019 23:32:26 -0800
branchstable
changeset 41298 88a7c211b21e
parent 41297 b1ea90613af3
child 41299 ff1222a7d714
narrow: fix crash when restoring backup in legacy repo Using --addremove when committing in an old repo (before we started keeping .hg/narrowspec.dirstate) results in a crash. The test case modified in this patch would crash like this: abort: $ENOENT$ The issue is that when the dirstateguard is aborted, it tries to restore the backup of .hg/narrowspec.dirstate. However, since we were in an old repo, that file did not get created when the dirstateguard was created. Note that the dirstateguard is not used unless --addremove is passed. This patch fixes the bug by making restorewcbackup() not fail if the backup doesn't exist. I also made clearwcbackup() safe, just in case. Differential Revision: https://phab.mercurial-scm.org/D5634
mercurial/narrowspec.py
tests/test-narrow-share.t
--- a/mercurial/narrowspec.py	Fri Jan 18 14:21:47 2019 +0100
+++ b/mercurial/narrowspec.py	Fri Jan 18 23:32:26 2019 -0800
@@ -190,12 +190,14 @@
 def restorewcbackup(repo, backupname):
     if repository.NARROW_REQUIREMENT not in repo.requirements:
         return
-    util.rename(repo.vfs.join(backupname), repo.vfs.join(DIRSTATE_FILENAME))
+    # It may not exist in old repos
+    if repo.vfs.exists(backupname):
+        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)
+    repo.vfs.tryunlink(backupname)
 
 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes):
     r""" Restricts the patterns according to repo settings,
--- a/tests/test-narrow-share.t	Fri Jan 18 14:21:47 2019 +0100
+++ b/tests/test-narrow-share.t	Fri Jan 18 23:32:26 2019 -0800
@@ -166,7 +166,7 @@
   R d7/f
 Make it look like a repo from before narrow+share was supported
   $ rm .hg/narrowspec.dirstate
-  $ hg st
+  $ hg ci -Am test
   abort: working copy's narrowspec is stale
   (run 'hg tracked --update-working-copy')
   [255]