chiark / gitweb /
stgit new: Do not open editor if --save-template was specified
[stgit] / stgit / commands / show.py
index 50eb376af2a80ad89f556e3274cc89967688dfa6..45c3a5617a4bd9d4bc49d8c9fb18d832886c8008 100644 (file)
@@ -16,30 +16,61 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 """
 
 import sys, os
-from optparse import OptionParser, make_option
-
+from pydoc import pager
+from stgit.argparse import opt
 from stgit.commands.common import *
-from stgit import git
-
-
-help = 'show the commit corresponding to a patch (or the current patch)'
-usage = """%prog [options] [<patch>]
+from stgit import argparse, git
+from stgit.lib import git as gitlib
 
-Show the commit log and the diff corresponding to a given patch. The
-output is similar to that generated by the 'git show' command."""
+help = 'Show the commit corresponding to a patch'
+kind = 'patch'
+usage = ['[options] [<patch1>] [<patch2>] [<patch3>..<patch4>]']
+description = """
+Show the commit log and the diff corresponding to the given patches.
+The output is similar to that generated by 'git show'."""
 
-options = []
+args = [argparse.patch_range(argparse.applied_patches,
+                             argparse.unapplied_patches,
+                             argparse.hidden_patches)]
+options = [
+    opt('-b', '--branch', args = [argparse.stg_branches],
+        short = 'Use BRANCH instead of the default branch'),
+    opt('-a', '--applied', action = 'store_true',
+        short = 'Show the applied patches'),
+    opt('-u', '--unapplied', action = 'store_true',
+        short = 'Show the unapplied patches'),
+    opt('-s', '--stat', action = 'store_true',
+        short = 'Show a diffstat summary of the specified patches'),
+    ] + argparse.diff_opts_option()
 
+directory = DirectoryHasRepository(log = False)
 
 def func(parser, options, args):
     """Show commit log and diff
     """
-    if len(args) == 0:
-        patch = 'HEAD'
-    elif len(args) == 1:
-        patch = args[0]
+    if options.applied:
+        patches = crt_series.get_applied()
+    elif options.unapplied:
+        patches = crt_series.get_unapplied()
+    elif len(args) == 0:
+        patches = ['HEAD']
+    elif '..' in ' '.join(args):
+        # patch ranges
+        applied = crt_series.get_applied()
+        unapplied = crt_series.get_unapplied()
+        patches = parse_patches(args, applied + unapplied + \
+                                crt_series.get_hidden(), len(applied))
     else:
-        parser.error('incorrect number of arguments')
+        # individual patches or commit ids
+        patches = args
 
-    commit_id = git_id(patch)
-    sys.stdout.write(git.pretty_commit(commit_id))
+    if not options.stat:
+        options.diff_flags.extend(color_diff_flags())
+    commit_ids = [git_id(crt_series, patch) for patch in patches]
+    commit_str = '\n'.join([git.pretty_commit(commit_id,
+                                              flags = options.diff_flags)
+                            for commit_id in commit_ids])
+    if options.stat:
+        commit_str = gitlib.diffstat(commit_str)
+    if commit_str:
+        pager(commit_str)