| #!/bin/sh |
| # |
| # Copyright (c) 2005 Junio C Hamano. |
| # |
| |
| . git-sh-setup |
| |
| 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 |