Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2005 Junio C Hamano. |
| 4 | # |
| 5 | |
Yann Dirson | 77f1055 | 2006-01-08 01:40:33 +0100 | [diff] [blame] | 6 | USAGE='[-v] <upstream> [<head>] [<limit>]' |
freku045@student.liu.se | 43a95cf | 2005-12-13 23:30:31 +0100 | [diff] [blame] | 7 | LONG_USAGE=' __*__*__*__*__> <upstream> |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 8 | / |
| 9 | fork-point |
| 10 | \__+__+__+__+__+__+__+__> <head> |
| 11 | |
Yann Dirson | 77f1055 | 2006-01-08 01:40:33 +0100 | [diff] [blame] | 12 | Each commit between the fork-point (or <limit> if given) and <head> is |
| 13 | examined, and compared against the change each commit between the |
| 14 | fork-point and <upstream> introduces. If the change seems to be in |
| 15 | the upstream, it is shown on the standard output with prefix "+". |
| 16 | Otherwise it is shown with prefix "-".' |
freku045@student.liu.se | 43a95cf | 2005-12-13 23:30:31 +0100 | [diff] [blame] | 17 | . git-sh-setup |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 18 | |
Junio C Hamano | 185612b | 2005-08-09 23:58:35 -0700 | [diff] [blame] | 19 | case "$1" in -v) verbose=t; shift ;; esac |
| 20 | |
Junio C Hamano | 4282c4f | 2005-08-07 15:51:09 -0700 | [diff] [blame] | 21 | case "$#,$1" in |
| 22 | 1,*..*) |
Mark Wooding | f327dbc | 2006-04-13 22:01:24 +0000 | [diff] [blame] | 23 | upstream=$(expr "z$1" : 'z\(.*\)\.\.') ours=$(expr "z$1" : '.*\.\.\(.*\)$') |
Junio C Hamano | 4282c4f | 2005-08-07 15:51:09 -0700 | [diff] [blame] | 24 | set x "$upstream" "$ours" |
| 25 | shift ;; |
| 26 | esac |
| 27 | |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 28 | case "$#" in |
Junio C Hamano | 4282c4f | 2005-08-07 15:51:09 -0700 | [diff] [blame] | 29 | 1) upstream=`git-rev-parse --verify "$1"` && |
| 30 | ours=`git-rev-parse --verify HEAD` || exit |
Yann Dirson | 77f1055 | 2006-01-08 01:40:33 +0100 | [diff] [blame] | 31 | limit="$upstream" |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 32 | ;; |
Junio C Hamano | 4282c4f | 2005-08-07 15:51:09 -0700 | [diff] [blame] | 33 | 2) upstream=`git-rev-parse --verify "$1"` && |
| 34 | ours=`git-rev-parse --verify "$2"` || exit |
Yann Dirson | 77f1055 | 2006-01-08 01:40:33 +0100 | [diff] [blame] | 35 | limit="$upstream" |
| 36 | ;; |
| 37 | 3) upstream=`git-rev-parse --verify "$1"` && |
| 38 | ours=`git-rev-parse --verify "$2"` && |
| 39 | limit=`git-rev-parse --verify "$3"` || exit |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 40 | ;; |
freku045@student.liu.se | 43a95cf | 2005-12-13 23:30:31 +0100 | [diff] [blame] | 41 | *) usage ;; |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 42 | esac |
| 43 | |
| 44 | # Note that these list commits in reverse order; |
| 45 | # not that the order in inup matters... |
Junio C Hamano | 4282c4f | 2005-08-07 15:51:09 -0700 | [diff] [blame] | 46 | inup=`git-rev-list ^$ours $upstream` && |
Yann Dirson | 77f1055 | 2006-01-08 01:40:33 +0100 | [diff] [blame] | 47 | ours=`git-rev-list $ours ^$limit` || exit |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 48 | |
| 49 | tmp=.cherry-tmp$$ |
| 50 | patch=$tmp-patch |
| 51 | mkdir $patch |
| 52 | trap "rm -rf $tmp-*" 0 1 2 3 15 |
| 53 | |
| 54 | _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' |
| 55 | _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" |
| 56 | |
| 57 | for c in $inup |
| 58 | do |
| 59 | git-diff-tree -p $c |
| 60 | done | git-patch-id | |
| 61 | while read id name |
| 62 | do |
| 63 | echo $name >>$patch/$id |
| 64 | done |
| 65 | |
| 66 | LF=' |
| 67 | ' |
| 68 | |
| 69 | O= |
| 70 | for c in $ours |
| 71 | do |
| 72 | set x `git-diff-tree -p $c | git-patch-id` |
| 73 | if test "$2" != "" |
| 74 | then |
| 75 | if test -f "$patch/$2" |
| 76 | then |
| 77 | sign=- |
| 78 | else |
| 79 | sign=+ |
| 80 | fi |
Junio C Hamano | 185612b | 2005-08-09 23:58:35 -0700 | [diff] [blame] | 81 | case "$verbose" in |
| 82 | t) |
| 83 | c=$(git-rev-list --pretty=oneline --max-count=1 $c) |
| 84 | esac |
Junio C Hamano | 93c36dc | 2005-06-25 02:22:59 -0700 | [diff] [blame] | 85 | case "$O" in |
| 86 | '') O="$sign $c" ;; |
| 87 | *) O="$sign $c$LF$O" ;; |
| 88 | esac |
| 89 | fi |
| 90 | done |
| 91 | case "$O" in |
| 92 | '') ;; |
| 93 | *) echo "$O" ;; |
| 94 | esac |