| 1 | |
| 2 | __copyright__ = """ |
| 3 | Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com> |
| 4 | |
| 5 | This program is free software; you can redistribute it and/or modify |
| 6 | it under the terms of the GNU General Public License version 2 as |
| 7 | published by the Free Software Foundation. |
| 8 | |
| 9 | This program is distributed in the hope that it will be useful, |
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | GNU General Public License for more details. |
| 13 | |
| 14 | You should have received a copy of the GNU General Public License |
| 15 | along with this program; if not, write to the Free Software |
| 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 17 | """ |
| 18 | |
| 19 | import sys, os |
| 20 | from optparse import OptionParser, make_option |
| 21 | from pydoc import pager |
| 22 | |
| 23 | from stgit.commands.common import * |
| 24 | from stgit.utils import * |
| 25 | from stgit import stack, git |
| 26 | |
| 27 | |
| 28 | help = 'show the tree diff' |
| 29 | usage = """%prog [options] [<files...>] |
| 30 | |
| 31 | Show the diff (default) or diffstat between the current working copy |
| 32 | or a tree-ish object and another tree-ish object. File names can also |
| 33 | be given to restrict the diff output. The tree-ish object can be a |
| 34 | standard git commit, tag or tree. In addition to these, the command |
| 35 | also supports 'base', representing the bottom of the current stack, |
| 36 | and '[patch][//[bottom | top]]' for the patch boundaries (defaulting to |
| 37 | the current one): |
| 38 | |
| 39 | rev = '([patch][//[bottom | top]]) | <tree-ish> | base' |
| 40 | |
| 41 | If neither bottom nor top are given but a '//' is present, the command |
| 42 | shows the specified patch (defaulting to the current one).""" |
| 43 | |
| 44 | options = [make_option('-r', '--range', |
| 45 | metavar = 'rev1[..[rev2]]', dest = 'revs', |
| 46 | help = 'show the diff between revisions'), |
| 47 | make_option('-s', '--stat', |
| 48 | help = 'show the stat instead of the diff', |
| 49 | action = 'store_true')] |
| 50 | |
| 51 | |
| 52 | def func(parser, options, args): |
| 53 | """Show the tree diff |
| 54 | """ |
| 55 | if options.revs: |
| 56 | rev_list = options.revs.split('..') |
| 57 | rev_list_len = len(rev_list) |
| 58 | if rev_list_len == 1: |
| 59 | rev = rev_list[0] |
| 60 | if rev.endswith('/'): |
| 61 | # the whole patch |
| 62 | rev = strip_suffix('/', rev) |
| 63 | if rev.endswith('/'): |
| 64 | rev = strip_suffix('/', rev) |
| 65 | rev1 = rev + '//bottom' |
| 66 | rev2 = rev + '//top' |
| 67 | else: |
| 68 | rev1 = rev_list[0] |
| 69 | rev2 = None |
| 70 | elif rev_list_len == 2: |
| 71 | rev1 = rev_list[0] |
| 72 | rev2 = rev_list[1] |
| 73 | else: |
| 74 | parser.error('incorrect parameters to -r') |
| 75 | else: |
| 76 | rev1 = 'HEAD' |
| 77 | rev2 = None |
| 78 | |
| 79 | if options.stat: |
| 80 | print git.diffstat(args, git_id(rev1), git_id(rev2)) |
| 81 | else: |
| 82 | diff_str = git.diff(args, git_id(rev1), git_id(rev2)) |
| 83 | if diff_str: |
| 84 | pager(diff_str) |