changeset 25104:d6453f6fbdba

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.
author Tony Tung <tonytung@fb.com>
date Tue, 14 Apr 2015 16:23:54 -0400
parents ce00b2e96d09
children 2f34746c27df
files hgext/shelve.py tests/test-shelve.t
diffstat 2 files changed, 59 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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]
+