shelve: trust caller of shelvedfile.opener() to check that the file exists
authorMartin von Zweigbergk <martinvonz@google.com>
Thu, 07 Jan 2021 12:58:43 -0800
changeset 46271 b2a8ff736ecf
parent 46270 161313f9c467
child 46272 a68d3386138c
shelve: trust caller of shelvedfile.opener() to check that the file exists The only place we call `shelvedfile.opener()` is when we're about to apply a bundle. The file should always exist. If it doesn't, the `.hg/` directory is corrupt and we don't provide any guarantees about supporting corrupt repos (besides, telling the user that the shelve doesn't exist when `hg shelve --list` lists it is not very helpful). Differential Revision: https://phab.mercurial-scm.org/D9698
mercurial/shelve.py
tests/test-shelve2.t
--- a/mercurial/shelve.py	Thu Jan 07 12:22:39 2021 -0800
+++ b/mercurial/shelve.py	Thu Jan 07 12:58:43 2021 -0800
@@ -117,12 +117,7 @@
         return self.vfs.stat(self.fname)
 
     def opener(self, mode=b'rb'):
-        try:
-            return self.vfs(self.fname, mode)
-        except IOError as err:
-            if err.errno != errno.ENOENT:
-                raise
-            raise error.Abort(_(b"shelved change '%s' not found") % self.name)
+        return self.vfs(self.fname, mode)
 
     def applybundle(self, tr):
         fp = self.opener()
--- a/tests/test-shelve2.t	Thu Jan 07 12:22:39 2021 -0800
+++ b/tests/test-shelve2.t	Thu Jan 07 12:58:43 2021 -0800
@@ -756,7 +756,7 @@
   junk1           (* ago)     (glob)
   $ hg unshelve
   unshelving change 'junk1'
-  abort: shelved change 'junk1' not found
+  abort: $ENOENT$: '$TESTTMP/corrupt-shelves/.hg/shelved/junk1.hg'
   [255]
   $ hg shelve -d junk1
   $ find .hg/shelve* | sort