Allow 'stg diff ..<commit>'
[stgit] / stgit / commands / diff.py
index 1425518..631e42d 100644 (file)
@@ -17,41 +17,35 @@ 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.utils import *
 from stgit.out import *
-from stgit import stack, git
-
-
-help = 'show the tree diff'
-usage = """%prog [options] [<files or dirs>]
+from stgit import argparse, stack, git
+from stgit.lib import git as gitlib
 
+help = 'Show the tree diff'
+kind = 'wc'
+usage = ['[options] [<files or dirs>]']
+description = """
 Show the diff (default) or diffstat between the current working copy
-or a tree-ish object and another tree-ish object. File names can also
-be given to restrict the diff output. The tree-ish object can be a
-standard git commit, tag or tree. In addition to these, the command
-also supports 'base', representing the bottom of the current stack,
-and '[patch][//[bottom | top]]' for the patch boundaries (defaulting to
-the current one):
-
-rev = '([patch][//[bottom | top]]) | <tree-ish> | base'
-
-If neither bottom nor top are given but a '//' is present, the command
-shows the specified patch (defaulting to the current one)."""
-
-directory = DirectoryHasRepository()
-options = [make_option('-r', '--range',
-                       metavar = 'rev1[..[rev2]]', dest = 'revs',
-                       help = 'show the diff between revisions'),
-           make_option('-O', '--diff-opts',
-                       help = 'options to pass to git-diff'),
-           make_option('-s', '--stat',
-                       help = 'show the stat instead of the diff',
-                       action = 'store_true')]
-
+or a tree-ish object and another tree-ish object (defaulting to HEAD).
+File names can also be given to restrict the diff output. The
+tree-ish object has the format accepted by the linkstg:id[] command."""
+
+args = [argparse.known_files, argparse.dirty_files]
+options = [
+    opt('-r', '--range', metavar = 'rev1[..[rev2]]', dest = 'revs',
+        args = [argparse.patch_range(argparse.applied_patches,
+                                     argparse.unapplied_patches,
+                                     argparse.hidden_patches)],
+        short = 'Show the diff between revisions'),
+    opt('-s', '--stat', action = 'store_true',
+        short = 'Show the stat instead of the diff'),
+    ] + argparse.diff_opts_option()
+
+directory = DirectoryHasRepository(log = False)
 
 def func(parser, options, args):
     """Show the tree diff
@@ -63,17 +57,8 @@ def func(parser, options, args):
         rev_list = options.revs.split('..')
         rev_list_len = len(rev_list)
         if rev_list_len == 1:
-            rev = rev_list[0]
-            if rev.endswith('/'):
-                # the whole patch
-                rev = strip_suffix('/', rev)
-                if rev.endswith('/'):
-                    rev = strip_suffix('/', rev)
-                rev1 = rev + '//bottom'
-                rev2 = rev + '//top'
-            else:
-                rev1 = rev_list[0]
-                rev2 = None
+            rev1 = rev_list[0]
+            rev2 = None
         elif rev_list_len == 2:
             rev1 = rev_list[0]
             rev2 = rev_list[1]
@@ -83,16 +68,13 @@ def func(parser, options, args):
         rev1 = 'HEAD'
         rev2 = None
 
-    if options.diff_opts:
-        diff_flags = options.diff_opts.split()
-    else:
-        diff_flags = []
-
+    if not options.stat:
+        options.diff_flags.extend(color_diff_flags())
+    diff_str = git.diff(args, rev1 and git_id(crt_series, rev1),
+                        rev2 and git_id(crt_series, rev2),
+                        diff_flags = options.diff_flags)
     if options.stat:
-        out.stdout_raw(git.diffstat(args, git_id(crt_series, rev1),
-                                    git_id(crt_series, rev2)) + '\n')
+        out.stdout_raw(gitlib.diffstat(diff_str) + '\n')
     else:
-        diff_str = git.diff(args, git_id(crt_series, rev1),
-                            git_id(crt_series, rev2), diff_flags = diff_flags )
         if diff_str:
             pager(diff_str)