2005-06-25 17:22:59 +08:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Junio C Hamano.
|
|
|
|
#
|
|
|
|
|
2006-01-08 08:40:33 +08:00
|
|
|
USAGE='[-v] <upstream> [<head>] [<limit>]'
|
2005-12-14 06:30:31 +08:00
|
|
|
LONG_USAGE=' __*__*__*__*__> <upstream>
|
2005-06-25 17:22:59 +08:00
|
|
|
/
|
|
|
|
fork-point
|
|
|
|
\__+__+__+__+__+__+__+__> <head>
|
|
|
|
|
2006-01-08 08:40:33 +08:00
|
|
|
Each commit between the fork-point (or <limit> if given) 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 "-".'
|
2005-12-14 06:30:31 +08:00
|
|
|
. git-sh-setup
|
2005-06-25 17:22:59 +08:00
|
|
|
|
2005-08-10 14:58:35 +08:00
|
|
|
case "$1" in -v) verbose=t; shift ;; esac
|
|
|
|
|
2005-08-08 06:51:09 +08:00
|
|
|
case "$#,$1" in
|
|
|
|
1,*..*)
|
|
|
|
upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$')
|
|
|
|
set x "$upstream" "$ours"
|
|
|
|
shift ;;
|
|
|
|
esac
|
|
|
|
|
2005-06-25 17:22:59 +08:00
|
|
|
case "$#" in
|
2005-08-08 06:51:09 +08:00
|
|
|
1) upstream=`git-rev-parse --verify "$1"` &&
|
|
|
|
ours=`git-rev-parse --verify HEAD` || exit
|
2006-01-08 08:40:33 +08:00
|
|
|
limit="$upstream"
|
2005-06-25 17:22:59 +08:00
|
|
|
;;
|
2005-08-08 06:51:09 +08:00
|
|
|
2) upstream=`git-rev-parse --verify "$1"` &&
|
|
|
|
ours=`git-rev-parse --verify "$2"` || exit
|
2006-01-08 08:40:33 +08:00
|
|
|
limit="$upstream"
|
|
|
|
;;
|
|
|
|
3) upstream=`git-rev-parse --verify "$1"` &&
|
|
|
|
ours=`git-rev-parse --verify "$2"` &&
|
|
|
|
limit=`git-rev-parse --verify "$3"` || exit
|
2005-06-25 17:22:59 +08:00
|
|
|
;;
|
2005-12-14 06:30:31 +08:00
|
|
|
*) usage ;;
|
2005-06-25 17:22:59 +08:00
|
|
|
esac
|
|
|
|
|
|
|
|
# Note that these list commits in reverse order;
|
|
|
|
# not that the order in inup matters...
|
2005-08-08 06:51:09 +08:00
|
|
|
inup=`git-rev-list ^$ours $upstream` &&
|
2006-01-08 08:40:33 +08:00
|
|
|
ours=`git-rev-list $ours ^$limit` || exit
|
2005-06-25 17:22:59 +08:00
|
|
|
|
|
|
|
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
|
2005-08-10 14:58:35 +08:00
|
|
|
case "$verbose" in
|
|
|
|
t)
|
|
|
|
c=$(git-rev-list --pretty=oneline --max-count=1 $c)
|
|
|
|
esac
|
2005-06-25 17:22:59 +08:00
|
|
|
case "$O" in
|
|
|
|
'') O="$sign $c" ;;
|
|
|
|
*) O="$sign $c$LF$O" ;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
case "$O" in
|
|
|
|
'') ;;
|
|
|
|
*) echo "$O" ;;
|
|
|
|
esac
|