diff options
author | Junio C Hamano <junkio@cox.net> | 2005-06-25 02:22:59 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 16:52:16 -0700 |
commit | 93c36dcd0a4f6373e3a02a8505046801106ddb85 (patch) | |
tree | ec88717199a8ff438bba967b49e4b759a956471d | |
parent | 5fec3ef101c0f18bbf2400423dc70e686e9d25b0 (diff) | |
download | git-93c36dcd0a4f6373e3a02a8505046801106ddb85.tar.gz |
[PATCH] git-cherry: find commits not merged upstream.
The git-cherry command helps the git-rebase script by finding
commits that have not been merged upstream. Commits already
included in upstream are prefixed with '-' (meaning "drop from
my local pull"), while commits missing from upstream are
prefixed with '+' (meaning "add to the updated upstream").
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | Makefile | 2 | ||||
-rwxr-xr-x | git-cherry | 86 |
2 files changed, 87 insertions, 1 deletions
@@ -25,7 +25,7 @@ SCRIPTS=git git-apply-patch-script git-merge-one-file-script git-prune-script \ git-deltafy-script git-fetch-script git-status-script git-commit-script \ git-log-script git-shortlog git-cvsimport-script git-diff-script \ git-reset-script git-add-script git-checkout-script git-clone-script \ - gitk + gitk git-cherry PROG= git-update-cache git-diff-files git-init-db git-write-tree \ git-read-tree git-commit-tree git-cat-file git-fsck-cache \ diff --git a/git-cherry b/git-cherry new file mode 100755 index 0000000000..e2a1a2db9f --- /dev/null +++ b/git-cherry @@ -0,0 +1,86 @@ +#!/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 |