shelve: rewrite check for unknown shelf to delete
The code would try to delete the shelf's .patch file and if that
raised an exception, it would convert it to an `error.Abort`. This
patch rewrites it so the check is done upfront. I find it easier to
read that way. It's now clear enough that I removed the comment
explaining it as well.
As Joerg pointed out during review, another differences is that the
old code would move a `.hg` file without its `.patch` friend to backup
before it realized that the `.patch` file was missing. The new code
will error out earlier and not move the `.hg` file, which seems like
an improvement. That should only matter on corrupt `.hg/shelved/`
directories, however.
Differential Revision: https://phab.mercurial-scm.org/D9697
--- a/mercurial/shelve.py Thu Jan 07 12:37:14 2021 -0800
+++ b/mercurial/shelve.py Thu Jan 07 12:22:39 2021 -0800
@@ -600,20 +600,12 @@
raise error.Abort(_(b'no shelved changes specified!'))
with repo.wlock():
for name in pats:
- try:
- for suffix in shelvefileextensions:
- shfile = shelvedfile(repo, name, suffix)
- # patch file is necessary, as it should
- # be present for any kind of shelve,
- # but the .hg file is optional as in future we
- # will add obsolete shelve with does not create a
- # bundle
- if shfile.exists() or suffix == patchextension:
- shfile.movetobackup()
- except OSError as err:
- if err.errno != errno.ENOENT:
- raise
+ if not shelvedfile(repo, name, patchextension).exists():
raise error.Abort(_(b"shelved change '%s' not found") % name)
+ for suffix in shelvefileextensions:
+ shfile = shelvedfile(repo, name, suffix)
+ if shfile.exists():
+ shfile.movetobackup()
cleanupoldbackups(repo)
--- a/tests/test-shelve2.t Thu Jan 07 12:37:14 2021 -0800
+++ b/tests/test-shelve2.t Thu Jan 07 12:22:39 2021 -0800
@@ -776,8 +776,8 @@
$ find .hg/shelve* | sort
.hg/shelve-backup
.hg/shelve-backup/junk1.patch
- .hg/shelve-backup/junk2.hg
.hg/shelved
+ .hg/shelved/junk2.hg
# A file with an unexpected extension
$ touch .hg/shelved/junk3
@@ -791,8 +791,8 @@
$ find .hg/shelve* | sort
.hg/shelve-backup
.hg/shelve-backup/junk1.patch
- .hg/shelve-backup/junk2.hg
.hg/shelved
+ .hg/shelved/junk2.hg
.hg/shelved/junk3
$ cd ..