git-applypatch.shon commit Use git-update-ref in scripts. (bf7960e)
   1#!/bin/sh
   2##
   3## applypatch takes four file arguments, and uses those to
   4## apply the unpacked patch (surprise surprise) that they
   5## represent to the current tree.
   6##
   7## The arguments are:
   8##      $1 - file with commit message
   9##      $2 - file with the actual patch
  10##      $3 - "info" file with Author, email and subject
  11##      $4 - optional file containing signoff to add
  12##
  13. git-sh-setup || die "Not a git archive."
  14
  15final=.dotest/final-commit
  16##
  17## If this file exists, we ask before applying
  18##
  19query_apply=.dotest/.query_apply
  20
  21## We do not munge the first line of the commit message too much
  22## if this file exists.
  23keep_subject=.dotest/.keep_subject
  24
  25
  26MSGFILE=$1
  27PATCHFILE=$2
  28INFO=$3
  29SIGNOFF=$4
  30EDIT=${VISUAL:-${EDITOR:-vi}}
  31
  32export GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' .dotest/info)"
  33export GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' .dotest/info)"
  34export GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' .dotest/info)"
  35export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' .dotest/info)"
  36
  37if test '' != "$SIGNOFF"
  38then
  39        if test -f "$SIGNOFF"
  40        then
  41                SIGNOFF=`cat "$SIGNOFF"` || exit
  42        elif case "$SIGNOFF" in yes | true | me | please) : ;; *) false ;; esac
  43        then
  44                SIGNOFF=`git-var GIT_COMMITTER_IDENT | sed -e '
  45                                s/>.*/>/
  46                                s/^/Signed-off-by: /'
  47                `
  48        else
  49                SIGNOFF=
  50        fi
  51        if test '' != "$SIGNOFF"
  52        then
  53                LAST_SIGNED_OFF_BY=`
  54                        sed -ne '/^Signed-off-by: /p' "$MSGFILE" |
  55                        tail -n 1
  56                `
  57                test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" ||
  58                echo "$SIGNOFF" >>"$MSGFILE"
  59        fi
  60fi
  61
  62patch_header=
  63test -f "$keep_subject" || patch_header='[PATCH] '
  64
  65{
  66        echo "$patch_header$SUBJECT"
  67        if test -s "$MSGFILE"
  68        then
  69                echo
  70                cat "$MSGFILE"
  71        fi
  72} >"$final"
  73
  74interactive=yes
  75test -f "$query_apply" || interactive=no
  76
  77while [ "$interactive" = yes ]; do
  78        echo "Commit Body is:"
  79        echo "--------------------------"
  80        cat "$final"
  81        echo "--------------------------"
  82        echo -n "Apply? [y]es/[n]o/[e]dit/[a]ccept all "
  83        read reply
  84        case "$reply" in
  85                y|Y) interactive=no;;
  86                n|N) exit 2;;   # special value to tell dotest to keep going
  87                e|E) "$EDIT" "$final";;
  88                a|A) rm -f "$query_apply"
  89                     interactive=no ;;
  90        esac
  91done
  92
  93if test -x "$GIT_DIR"/hooks/applypatch-msg
  94then
  95        "$GIT_DIR"/hooks/applypatch-msg "$final" || exit
  96fi
  97
  98echo
  99echo Applying "'$SUBJECT'"
 100echo
 101
 102git-apply --index "$PATCHFILE" || exit 1
 103
 104if test -x "$GIT_DIR"/hooks/pre-applypatch
 105then
 106        "$GIT_DIR"/hooks/pre-applypatch || exit
 107fi
 108
 109tree=$(git-write-tree) || exit 1
 110echo Wrote tree $tree
 111parent=$(git-rev-parse --verify HEAD) &&
 112commit=$(git-commit-tree $tree -p $parent <"$final") || exit 1
 113echo Committed: $commit
 114git-update-ref HEAD $commit $parent || exit
 115
 116if test -x "$GIT_DIR"/hooks/post-applypatch
 117then
 118        "$GIT_DIR"/hooks/post-applypatch
 119fi