87 lines
1.7 KiB
Plaintext
87 lines
1.7 KiB
Plaintext
|
#!/bin/sh
|
||
|
#
|
||
|
# Copyright (c) 2005 Junio C Hamano.
|
||
|
#
|
||
|
|
||
|
usage="usage: $0 "'<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 does not seem to be in the
|
||
|
upstream, it is shown on the standard output.
|
||
|
|
||
|
The output is intended to be used as:
|
||
|
|
||
|
OLD_HEAD=$(git-rev-parse HEAD)
|
||
|
git-rev-parse linus >${GIT_DIR-.}/HEAD
|
||
|
git-cherry linus OLD_HEAD |
|
||
|
while read commit
|
||
|
do
|
||
|
GIT_EXTERNAL_DIFF=git-apply-patch-script git-diff-tree -p "$commit" &&
|
||
|
git-commit-script -m "$commit"
|
||
|
done
|
||
|
'
|
||
|
|
||
|
case "$#" in
|
||
|
1) linus=`git-rev-parse "$1"` &&
|
||
|
junio=`git-rev-parse HEAD` || exit
|
||
|
;;
|
||
|
2) linus=`git-rev-parse "$1"` &&
|
||
|
junio=`git-rev-parse "$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 ^$junio $linus` &&
|
||
|
ours=`git-rev-list $junio ^$linus` || 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 "$O" in
|
||
|
'') O="$sign $c" ;;
|
||
|
*) O="$sign $c$LF$O" ;;
|
||
|
esac
|
||
|
fi
|
||
|
done
|
||
|
case "$O" in
|
||
|
'') ;;
|
||
|
*) echo "$O" ;;
|
||
|
esac
|