You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.0 KiB
101 lines
2.0 KiB
#!/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 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 upstream >${GIT_DIR-.}/HEAD |
|
git-cherry upstream $OLD_HEAD | |
|
while read commit |
|
do |
|
GIT_EXTERNAL_DIFF=git-apply-patch-script git-diff-tree -p "$commit" && |
|
git-commit-script -C "$commit" |
|
done |
|
' |
|
|
|
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
|
|
|