| 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 | |
| 22 | from stgit.commands.common import * |
| 23 | from stgit.utils import * |
| 24 | from stgit import stack, git |
| 25 | |
| 26 | |
| 27 | help = 'show the tree diff' |
| 28 | usage = """%prog [options] [<files...>] |
| 29 | |
| 30 | Show the diff (default) or diffstat between the current working copy |
| 31 | or a tree-ish object and another tree-ish object. File names can also |
| 32 | be given to restrict the diff output. The tree-ish object can be a |
| 33 | standard git commit, tag or tree. In addition to these, the command |
| 34 | also supports 'base', representing the bottom of the current stack, |
| 35 | and '[patch]/[bottom | top]' for the patch boundaries (defaulting to |
| 36 | the current one): |
| 37 | |
| 38 | rev = '([patch]/[bottom | top]) | <tree-ish> | base' |
| 39 | |
| 40 | If neither bottom or top are given but a '/' is present, the command |
| 41 | shows the specified patch (defaulting to the current one).""" |
| 42 | |
| 43 | options = [make_option('-r', metavar = 'rev1[:[rev2]]', dest = 'revs', |
| 44 | help = 'show the diff between revisions'), |
| 45 | make_option('-s', '--stat', |
| 46 | help = 'show the stat instead of the diff', |
| 47 | action = 'store_true')] |
| 48 | |
| 49 | |
| 50 | def func(parser, options, args): |
| 51 | """Show the tree diff |
| 52 | """ |
| 53 | if options.revs: |
| 54 | rev_list = options.revs.split(':') |
| 55 | rev_list_len = len(rev_list) |
| 56 | if rev_list_len == 1: |
| 57 | if rev_list[0][-1] == '/': |
| 58 | # the whole patch |
| 59 | rev1 = rev_list[0] + 'bottom' |
| 60 | rev2 = rev_list[0] + 'top' |
| 61 | else: |
| 62 | rev1 = rev_list[0] |
| 63 | rev2 = None |
| 64 | elif rev_list_len == 2: |
| 65 | rev1 = rev_list[0] |
| 66 | rev2 = rev_list[1] |
| 67 | else: |
| 68 | parser.error('incorrect parameters to -r') |
| 69 | else: |
| 70 | rev1 = 'HEAD' |
| 71 | rev2 = None |
| 72 | |
| 73 | if options.stat: |
| 74 | print git.diffstat(args, git_id(rev1), git_id(rev2)) |
| 75 | else: |
| 76 | git.diff(args, git_id(rev1), git_id(rev2), sys.stdout) |