git-rebase.shon commit Yank writing-back support from gitfakemmap. (f48000f)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano.
   4#
   5
   6. git-sh-setup || die "Not a git archive."
   7
   8usage="usage: $0 "'<upstream> [<head>]
   9
  10Uses output from git-cherry to rebase local commits to the new head of
  11upstream tree.'
  12
  13case "$#,$1" in
  141,*..*)
  15    upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$')
  16    set x "$upstream" "$ours"
  17    shift ;;
  18esac
  19
  20git-update-index --refresh || exit
  21
  22case "$#" in
  231) ours_symbolic=HEAD ;;
  242) ours_symbolic="$2" ;;
  25*) die "$usage" ;;
  26esac
  27
  28upstream=`git-rev-parse --verify "$1"` &&
  29ours=`git-rev-parse --verify "$ours_symbolic"` || exit
  30different1=$(git-diff-index --name-only --cached "$ours") &&
  31different2=$(git-diff-index --name-only "$ours") &&
  32test "$different1$different2" = "" ||
  33die "Your working tree does not match $ours_symbolic."
  34
  35git-read-tree -m -u $ours $upstream &&
  36new_head=$(git-rev-parse --verify "$upstream^0") &&
  37git-update-ref HEAD "$new_head" || exit
  38
  39tmp=.rebase-tmp$$
  40fail=$tmp-fail
  41trap "rm -rf $tmp-*" 1 2 3 15
  42
  43>$fail
  44
  45git-cherry -v $upstream $ours |
  46while read sign commit msg
  47do
  48        case "$sign" in
  49        -)
  50                echo >&2 "* Already applied: $msg"
  51                continue ;;
  52        esac
  53        echo >&2 "* Applying: $msg"
  54        S=$(git-rev-parse --verify HEAD) &&
  55        git-cherry-pick --replay $commit || {
  56                echo >&2 "* Not applying the patch and continuing."
  57                echo $commit >>$fail
  58                git-reset --hard $S
  59        }
  60done
  61if test -s $fail
  62then
  63        echo >&2 Some commits could not be rebased, check by hand:
  64        cat >&2 $fail
  65        echo >&2 "(the same list of commits are found in $tmp)"
  66        exit 1
  67else
  68        rm -f $fail
  69fi