git-cherryon commit Document "git cherry-pick" and "git revert" (de2b82c)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano.
   4#
   5
   6. git-sh-setup-script || die "Not a git archive."
   7
   8usage="usage: $0 "'[-v] <upstream> [<head>]
   9
  10             __*__*__*__*__> <upstream>
  11            /
  12  fork-point
  13            \__+__+__+__+__+__+__+__> <head>
  14
  15Each commit between the fork-point and <head> is examined, and
  16compared against the change each commit between the fork-point and
  17<upstream> introduces.  If the change seems to be in the upstream,
  18it is shown on the standard output with prefix "+".  Otherwise
  19it is shown with prefix "-".
  20'
  21
  22case "$1" in -v) verbose=t; shift ;; esac 
  23
  24case "$#,$1" in
  251,*..*)
  26    upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$')
  27    set x "$upstream" "$ours"
  28    shift ;;
  29esac
  30
  31case "$#" in
  321) upstream=`git-rev-parse --verify "$1"` &&
  33   ours=`git-rev-parse --verify HEAD` || exit
  34   ;;
  352) upstream=`git-rev-parse --verify "$1"` &&
  36   ours=`git-rev-parse --verify "$2"` || exit
  37   ;;
  38*) echo >&2 "$usage"; exit 1 ;;
  39esac
  40
  41# Note that these list commits in reverse order;
  42# not that the order in inup matters...
  43inup=`git-rev-list ^$ours $upstream` &&
  44ours=`git-rev-list $ours ^$upstream` || exit
  45
  46tmp=.cherry-tmp$$
  47patch=$tmp-patch
  48mkdir $patch
  49trap "rm -rf $tmp-*" 0 1 2 3 15
  50
  51_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
  52_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
  53
  54for c in $inup
  55do
  56        git-diff-tree -p $c
  57done | git-patch-id |
  58while read id name
  59do
  60        echo $name >>$patch/$id
  61done
  62
  63LF='
  64'
  65
  66O=
  67for c in $ours
  68do
  69        set x `git-diff-tree -p $c | git-patch-id`
  70        if test "$2" != ""
  71        then
  72                if test -f "$patch/$2"
  73                then
  74                        sign=-
  75                else
  76                        sign=+
  77                fi
  78                case "$verbose" in
  79                t)
  80                        c=$(git-rev-list --pretty=oneline --max-count=1 $c)
  81                esac
  82                case "$O" in
  83                '')     O="$sign $c" ;;
  84                *)      O="$sign $c$LF$O" ;;
  85                esac
  86        fi
  87done
  88case "$O" in
  89'') ;;
  90*)  echo "$O" ;;
  91esac