Add support to hide and unhide patches
[stgit] / stgit / commands / series.py
index 3b2d3bf..4f372ff 100644 (file)
@@ -31,10 +31,17 @@ usage = """%prog [options] [<patch-range>]
 Show all the patches in the series or just those in the given
 range. The applied patches are prefixed with a '+' and the unapplied
 ones with a '-'. The current patch is prefixed with a '>'. Empty
-patches are prefixed with a '0'."""
+patches are prefixed with a '0'. The '*' postfix is appended to hidden
+patches."""
 
 options = [make_option('-b', '--branch',
                        help = 'use BRANCH instead of the default one'),
+           make_option('-a', '--all',
+                       help = 'show all patches, including the hidden ones',
+                       action = 'store_true'),
+           make_option('-i', '--invisible',
+                       help = 'show the hidden patches only',
+                       action = 'store_true'),
            make_option('-m', '--missing', metavar = 'BRANCH',
                        help = 'show patches in BRANCH missing in current'),
            make_option('-c', '--count',
@@ -47,6 +54,12 @@ options = [make_option('-b', '--branch',
                        help = 'check whether patches are empty '
                        '(much slower)',
                        action = 'store_true'),
+           make_option('--showbranch',
+                       help = 'append the branch name to the listed patches',
+                       action = 'store_true'),
+           make_option('--noprefix',
+                       help = 'do not show the patch status prefix',
+                       action = 'store_true'),
            make_option('-s', '--short',
                        help = 'list just the patches around the topmost patch',
                        action = 'store_true'),
@@ -63,13 +76,24 @@ def __get_description(patch):
     descr_lines = descr.split('\n')
     return descr_lines[0].rstrip()
 
-def __print_patch(patch, prefix, empty_prefix, length, options):
-    if options.empty and crt_series.empty_patch(patch):
+def __print_patch(patch, hidden, branch_str, prefix, empty_prefix, length,
+                  options):
+    """Print a patch name, description and various markers.
+    """
+    if options.noprefix:
+        prefix = ''
+    elif options.empty and crt_series.empty_patch(patch):
         prefix = empty_prefix
+
+    patch_str = patch + branch_str
+    if not options.noprefix and patch in hidden:
+        patch_str += '*'
+
     if options.description:
-        print prefix + patch.ljust(length) + '  | ' + __get_description(patch)
+        print prefix + patch_str.ljust(length) + ' | ' \
+              + __get_description(patch)
     else:
-        print prefix + patch
+        print prefix + patch_str
 
 def func(parser, options, args):
     """Show the patch series
@@ -96,11 +120,19 @@ def func(parser, options, args):
     else:
         show_patches = applied + unapplied
 
+    # missing filtering
+    show_patches = [p for p in show_patches if p not in cmp_patches]
+
+    # hidden patches filtering
+    hidden = crt_series.get_hidden()
+    if options.invisible:
+        show_patches = [p for p in show_patches if p in hidden]
+    elif not options.all:
+        show_patches = [p for p in show_patches if p not in hidden]
+
     # filter the patches
-    applied = [p for p in applied
-               if p in show_patches and p not in cmp_patches]
-    unapplied = [p for p in unapplied
-                 if p in show_patches and p not in cmp_patches]
+    applied = [p for p in applied if p in show_patches]
+    unapplied = [p for p in unapplied if p in show_patches]
 
     if options.short:
         if len(applied) > 5:
@@ -117,6 +149,11 @@ def func(parser, options, args):
     if not patches:
         return
 
+    if options.showbranch:
+        branch_str = '@' + crt_series.get_branch()
+    else:
+        branch_str = ''
+
     if options.graphical:
         if options.missing:
             raise CmdException, '--graphical not supported with --missing'
@@ -135,13 +172,23 @@ def func(parser, options, args):
     else:
         max_len = 0
         if len(patches) > 0:
-            max_len = max([len(i) for i in patches])
+            max_len = max([len(i + branch_str) for i in patches])
+            max_len += 1
 
         if len(applied) > 0:
-            for p in applied [0:-1]:
-                __print_patch(p, '+ ', '0 ', max_len, options)
+            current = crt_series.get_current()
+            if applied[-1] == current:
+                del applied[-1]
+            else:
+                current = None
+
+            for p in applied:
+                __print_patch(p, hidden, branch_str, '+ ', '0 ', max_len,
+                              options)
 
-            __print_patch(applied[-1], '> ', '0>', max_len, options)
+            if current:
+                __print_patch(current, hidden, branch_str, '> ', '0>', max_len,
+                              options)
 
         for p in unapplied:
-            __print_patch(p, '- ', '0 ', max_len, options)
+            __print_patch(p, hidden, branch_str, '- ', '0 ', max_len, options)