import sys, os
from optparse import OptionParser, make_option
+from pydoc import pager
from stgit.commands.common import *
from stgit.utils import *
help = 'show the tree diff'
usage = """%prog [options] [<files...>]
-The revision format is '([patch]/[bottom | top]) | <tree-ish>'"""
+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):
-options = [make_option('-r', metavar = 'rev1[:[rev2]]', dest = 'revs',
+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)."""
+
+options = [make_option('-r', '--range',
+ metavar = 'rev1[..[rev2]]', dest = 'revs',
help = 'show the diff between revisions'),
make_option('-s', '--stat',
help = 'show the stat instead of the diff',
"""Show the tree diff
"""
if options.revs:
- rev_list = options.revs.split(':')
+ rev_list = options.revs.split('..')
rev_list_len = len(rev_list)
if rev_list_len == 1:
- if rev_list[0][-1] == '/':
+ rev = rev_list[0]
+ if rev.endswith('/'):
# the whole patch
- rev1 = rev_list[0] + 'bottom'
- rev2 = rev_list[0] + 'top'
+ rev = strip_suffix('/', rev)
+ if rev.endswith('/'):
+ rev = strip_suffix('/', rev)
+ rev1 = rev + '//bottom'
+ rev2 = rev + '//top'
else:
rev1 = rev_list[0]
rev2 = None
elif rev_list_len == 2:
rev1 = rev_list[0]
rev2 = rev_list[1]
- if rev2 == '':
- rev2 = 'HEAD'
else:
parser.error('incorrect parameters to -r')
else:
if options.stat:
print git.diffstat(args, git_id(rev1), git_id(rev2))
else:
- git.diff(args, git_id(rev1), git_id(rev2))
+ diff_str = git.diff(args, git_id(rev1), git_id(rev2))
+ if diff_str:
+ pager(diff_str)