Browse Source

Add hooks to tools/git-applypatch.

This teachs git-applypatch, which is used from git-applymbox, three
hooks, similar to what git-commit-script uses.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 19 years ago
parent
commit
4426ac70a1
  1. 14
      templates/hooks--applypatch-msg
  2. 14
      templates/hooks--pre-applypatch
  3. 87
      tools/git-applypatch

14
templates/hooks--applypatch-msg

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
#!/bin/sh
#
# An example hook script to check the commit log message taken by
# applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit. The hook is
# allowed to edit the commit message file.
#
# To enable this hook, make this file executable.

test -x "$GIT_DIR/hooks/commit-msg" &&
exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
:

14
templates/hooks--pre-applypatch

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed
# by applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit.
#
# To enable this hook, make this file executable.

test -x "$GIT_DIR/hooks/pre-commit" &&
exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
:

87
tools/git-applypatch

@ -10,58 +10,109 @@ @@ -10,58 +10,109 @@
## $3 - "info" file with Author, email and subject
## $4 - optional file containing signoff to add
##
signoff="$4"
. git-sh-setup-script || die "Not a git archive."

final=.dotest/final-commit
##
## If this file exists, we ask before applying
##
query_apply=.dotest/.query_apply

## We do not munge the first line of the commit message too much
## if this file exists.
keep_subject=.dotest/.keep_subject


MSGFILE=$1
PATCHFILE=$2
INFO=$3
EDIT=${VISUAL:-$EDITOR}
EDIT=${EDIT:-vi}
SIGNOFF=$4
EDIT=${VISUAL:-${EDITOR:-vi}}

export GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' .dotest/info)"
export GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' .dotest/info)"
export GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' .dotest/info)"
export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' .dotest/info)"

if [ -n "$signoff" -a -f "$signoff" ]; then
cat $signoff >> $MSGFILE
if test '' != "$SIGNOFF"
then
if test -f "$SIGNOFF"
then
SIGNOFF=`cat "$SIGNOFF"` || exit
elif case "$SIGNOFF" in yes | true | me | please) : ;; *) false ;; esac
then
SIGNOFF=`git-var GIT_COMMITTER_IDENT | sed -e '
s/>.*/>/
s/^/Signed-off-by: /'
`
else
SIGNOFF=
fi
if test '' != "$SIGNOFF"
then
LAST_SIGNED_OFF_BY=`
sed -ne '/^Signed-off-by: /p' "$MSGFILE" |
tail -n 1
`
test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" ||
echo "$SIGNOFF" >>"$MSGFILE"
fi
fi

patch_header=
test -f "$keep_subject" || patch_header='[PATCH] '

(echo "$patch_header$SUBJECT" ; if [ -s $MSGFILE ]; then echo ; cat $MSGFILE; fi ) > $final
{
echo "$patch_header$SUBJECT"
if test -s "$MSGFILE"
then
echo
cat "$MSGFILE"
fi
} >"$final"

f=0
[ -f $query_apply ] || f=1
interactive=yes
test -f "$query_apply" || interactive=no

while [ $f -eq 0 ]; do
while [ "$interactive" = yes ]; do
echo "Commit Body is:"
echo "--------------------------"
cat $final
cat "$final"
echo "--------------------------"
echo -n "Apply? [y]es/[n]o/[e]dit/[a]ccept all "
read reply
case $reply in
y|Y) f=1;;
case "$reply" in
y|Y) interactive=no;;
n|N) exit 2;; # special value to tell dotest to keep going
e|E) $EDIT $final;;
a|A) rm -f $query_apply
f=1;;
e|E) "$EDIT" "$final";;
a|A) rm -f "$query_apply"
interactive=no ;;
esac
done

if test -x "$GIT_DIR"/hooks/applypatch-msg
then
"$GIT_DIR"/hooks/applypatch-msg "$final" || exit
fi

echo
echo Applying "'$SUBJECT'"
echo

git-apply --index $PATCHFILE || exit 1
git-apply --index "$PATCHFILE" || exit 1

if test -x "$GIT_DIR"/hooks/pre-applypatch
then
"$GIT_DIR"/hooks/pre-applypatch || exit
fi

tree=$(git-write-tree) || exit 1
echo Wrote tree $tree
commit=$(git-commit-tree $tree -p $(cat .git/HEAD) < $final) || exit 1
commit=$(git-commit-tree $tree -p $(cat "$GIT_DIR"/HEAD) < "$final") || exit 1
echo Committed: $commit
echo $commit > .git/HEAD
echo $commit > "$GIT_DIR"/HEAD

if test -x "$GIT_DIR"/hooks/post-applypatch
then
"$GIT_DIR"/hooks/post-applypatch
fi

Loading…
Cancel
Save