Mercurial > hg
changeset 46288:61f8fc12e167
shelve: don't include invalid shelves in `hg shelve --list`
Before this patch, if a shelved change is missing its `.hg` file, we
still list it in `hg shelve --list`, but then `hg unshelve`
crashes. This patch makes it so we only list valid shelved changes.
This patch means that users who do `touch .hg/shelve/buy-milk.patch`
as a form of TODO list will no longer see their TODO items in `hg
shelve --list`.
Differential Revision: https://phab.mercurial-scm.org/D9719
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Mon, 11 Jan 2021 09:26:48 -0800 |
parents | ae7a77a7ebc0 |
children | c062874a35db |
files | mercurial/shelve.py tests/test-shelve2.t |
diffstat | 2 files changed, 20 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/shelve.py Thu Jan 07 23:32:19 2021 -0800 +++ b/mercurial/shelve.py Mon Jan 11 09:26:48 2021 -0800 @@ -87,7 +87,9 @@ self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir)) def exists(self): - return self.vfs.exists(self.name + b'.' + patchextension) + return self.vfs.exists( + self.name + b'.' + patchextension + ) and self.vfs.exists(self.name + b'.hg') def mtime(self): return self.vfs.stat(self.name + b'.' + patchextension)[stat.ST_MTIME] @@ -621,12 +623,17 @@ raise return [] info = [] - for (name, _type) in names: - pfx, sfx = name.rsplit(b'.', 1) - if not pfx or sfx != patchextension: + seen = set() + for (filename, _type) in names: + name, ext = filename.rsplit(b'.', 1) + if name in seen: continue - mtime = Shelf(repo, pfx).mtime() - info.append((mtime, pfx)) + seen.add(name) + shelf = Shelf(repo, name) + if not shelf.exists(): + continue + mtime = shelf.mtime() + info.append((mtime, name)) return sorted(info, reverse=True)
--- a/tests/test-shelve2.t Thu Jan 07 23:32:19 2021 -0800 +++ b/tests/test-shelve2.t Mon Jan 11 09:26:48 2021 -0800 @@ -753,16 +753,15 @@ # A (corrupt) .patch file without a .hg file $ touch .hg/shelved/junk1.patch $ hg shelve -l - junk1 (* ago) (glob) $ hg unshelve - unshelving change 'junk1' - abort: $ENOENT$: '$TESTTMP/corrupt-shelves/.hg/shelved/junk1.hg' - [255] + abort: no shelved changes to apply! + [20] $ hg shelve -d junk1 + abort: shelved change 'junk1' not found + [10] $ find .hg/shelve* | sort - .hg/shelve-backup - .hg/shelve-backup/junk1.patch .hg/shelved + .hg/shelved/junk1.patch # A .hg file without a .patch file $ touch .hg/shelved/junk2.hg @@ -774,9 +773,8 @@ abort: shelved change 'junk2' not found [10] $ find .hg/shelve* | sort - .hg/shelve-backup - .hg/shelve-backup/junk1.patch .hg/shelved + .hg/shelved/junk1.patch .hg/shelved/junk2.hg # A file with an unexpected extension @@ -789,9 +787,8 @@ abort: shelved change 'junk3' not found [10] $ find .hg/shelve* | sort - .hg/shelve-backup - .hg/shelve-backup/junk1.patch .hg/shelved + .hg/shelved/junk1.patch .hg/shelved/junk2.hg .hg/shelved/junk3