| #!/bin/sh | |
| # | |
| # Copyright (c) 2005 Junio C Hamano. | |
| # | |
| . git-sh-setup-script || die "Not a git archive." | |
| usage="usage: $0 "'[-v] <upstream> [<head>] | |
| __*__*__*__*__> <upstream> | |
| / | |
| fork-point | |
| \__+__+__+__+__+__+__+__> <head> | |
| Each commit between the fork-point and <head> is examined, and | |
| compared against the change each commit between the fork-point and | |
| <upstream> introduces. If the change seems to be in the upstream, | |
| it is shown on the standard output with prefix "+". Otherwise | |
| it is shown with prefix "-". | |
| ' | |
| case "$1" in -v) verbose=t; shift ;; esac | |
| case "$#,$1" in | |
| 1,*..*) | |
| upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$') | |
| set x "$upstream" "$ours" | |
| shift ;; | |
| esac | |
| case "$#" in | |
| 1) upstream=`git-rev-parse --verify "$1"` && | |
| ours=`git-rev-parse --verify HEAD` || exit | |
| ;; | |
| 2) upstream=`git-rev-parse --verify "$1"` && | |
| ours=`git-rev-parse --verify "$2"` || exit | |
| ;; | |
| *) echo >&2 "$usage"; exit 1 ;; | |
| esac | |
| # Note that these list commits in reverse order; | |
| # not that the order in inup matters... | |
| inup=`git-rev-list ^$ours $upstream` && | |
| ours=`git-rev-list $ours ^$upstream` || exit | |
| tmp=.cherry-tmp$$ | |
| patch=$tmp-patch | |
| mkdir $patch | |
| trap "rm -rf $tmp-*" 0 1 2 3 15 | |
| _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' | |
| _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" | |
| for c in $inup | |
| do | |
| git-diff-tree -p $c | |
| done | git-patch-id | | |
| while read id name | |
| do | |
| echo $name >>$patch/$id | |
| done | |
| LF=' | |
| ' | |
| O= | |
| for c in $ours | |
| do | |
| set x `git-diff-tree -p $c | git-patch-id` | |
| if test "$2" != "" | |
| then | |
| if test -f "$patch/$2" | |
| then | |
| sign=- | |
| else | |
| sign=+ | |
| fi | |
| case "$verbose" in | |
| t) | |
| c=$(git-rev-list --pretty=oneline --max-count=1 $c) | |
| esac | |
| case "$O" in | |
| '') O="$sign $c" ;; | |
| *) O="$sign $c$LF$O" ;; | |
| esac | |
| fi | |
| done | |
| case "$O" in | |
| '') ;; | |
| *) echo "$O" ;; | |
| esac |