shelve: allow --patch and --stat without --list for a single shelf
It's annoying having to specify --list and --patch/--stat when all you
really want to do is to dump a patch. This creates an explicit
--patch/--stat command that is executed if --list is not specified. It
ensures that 1) there is only one shelf name specified and 2) that the
shelf exists. Then it redirects to the original listcmd code.
--- a/hgext/shelve.py Tue Apr 14 16:23:07 2015 -0400
+++ b/hgext/shelve.py Tue Apr 14 16:23:54 2015 -0400
@@ -361,6 +361,17 @@
finally:
fp.close()
+def singlepatchcmds(ui, repo, pats, opts, subcommand):
+ """subcommand that displays a single shelf"""
+ if len(pats) != 1:
+ raise util.Abort(_("--%s expects a single shelf") % subcommand)
+ shelfname = pats[0]
+
+ if not shelvedfile(repo, shelfname, 'patch').exists():
+ raise util.Abort(_("cannot find shelf %s") % shelfname)
+
+ listcmd(ui, repo, pats, opts)
+
def checkparents(repo, state):
"""check parent while resuming an unshelve"""
if state.parents != repo.dirstate.parents():
@@ -699,8 +710,8 @@
('list', set(['list'])),
('message', set(['create'])),
('name', set(['create'])),
- ('patch', set(['list'])),
- ('stat', set(['list'])),
+ ('patch', set(['patch', 'list'])),
+ ('stat', set(['stat', 'list'])),
]
def checkopt(opt):
if opts[opt]:
@@ -717,11 +728,11 @@
return deletecmd(ui, repo, pats)
elif checkopt('list'):
return listcmd(ui, repo, pats, opts)
+ elif checkopt('patch'):
+ return singlepatchcmds(ui, repo, pats, opts, subcommand='patch')
+ elif checkopt('stat'):
+ return singlepatchcmds(ui, repo, pats, opts, subcommand='stat')
else:
- for i in ('patch', 'stat'):
- if opts[i]:
- raise util.Abort(_("option '--%s' may not be "
- "used when shelving a change") % (i,))
return createcmd(ui, repo, pats, opts)
def extsetup(ui):
--- a/tests/test-shelve.t Tue Apr 14 16:23:07 2015 -0400
+++ b/tests/test-shelve.t Tue Apr 14 16:23:54 2015 -0400
@@ -862,4 +862,45 @@
c
x
x
- $ cd ..
+
+shelve --patch and shelve --stat should work with a single valid shelfname
+
+ $ hg up --clean .
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg shelve --list
+ $ echo 'patch a' > shelf-patch-a
+ $ hg add shelf-patch-a
+ $ hg shelve
+ shelved as default
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'patch b' > shelf-patch-b
+ $ hg add shelf-patch-b
+ $ hg shelve
+ shelved as default-01
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg shelve --patch default default-01
+ abort: --patch expects a single shelf
+ [255]
+ $ hg shelve --stat default default-01
+ abort: --stat expects a single shelf
+ [255]
+ $ hg shelve --patch default
+ default (* ago) changes to 'create conflict' (glob)
+
+ diff --git a/shelf-patch-a b/shelf-patch-a
+ new file mode 100644
+ --- /dev/null
+ +++ b/shelf-patch-a
+ @@ -0,0 +1,1 @@
+ +patch a
+ $ hg shelve --stat default
+ default (* ago) changes to 'create conflict' (glob)
+ shelf-patch-a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ $ hg shelve --patch nonexistentshelf
+ abort: cannot find shelf nonexistentshelf
+ [255]
+ $ hg shelve --stat nonexistentshelf
+ abort: cannot find shelf nonexistentshelf
+ [255]
+