Browse Source

Merge with master to pick up commit hook works.

maint
Junio C Hamano 20 years ago
parent
commit
b0e985d5de
  1. 75
      git-commit-script
  2. 6
      git-prune-script
  3. 12
      git-resolve-script
  4. 16
      prune-packed.c
  5. 14
      templates/hooks--applypatch-msg
  6. 14
      templates/hooks--commit-msg
  7. 8
      templates/hooks--post-commit
  8. 14
      templates/hooks--pre-applypatch
  9. 61
      templates/hooks--pre-commit
  10. 87
      tools/git-applypatch

75
git-commit-script

@ -6,10 +6,10 @@ @@ -6,10 +6,10 @@
. git-sh-setup-script || die "Not a git archive"

usage () {
die 'git commit [-a] [-m <message>] [-F <logfile>] [(-C|-c) <commit>] [<path>...]'
die 'git commit [-a] [-v | --no-verify] [-m <message>] [-F <logfile>] [(-C|-c) <commit>] [<path>...]'
}

all= logfile= use_commit= no_edit= log_given= log_message= verify= signoff=
all= logfile= use_commit= no_edit= log_given= log_message= verify=t signoff=
while case "$#" in 0) break;; esac
do
case "$1" in
@ -67,6 +67,9 @@ do @@ -67,6 +67,9 @@ do
-s|--s|--si|--sig|--sign|--signo|--signof|--signoff)
signoff=t
shift ;;
-n|--n|--no|--no-|--no-v|--no-ve|--no-ver|--no-veri|--no-verif|--no-verify)
verify=
shift ;;
-v|--v|--ve|--ver|--veri|--verif|--verify)
verify=t
shift ;;
@ -101,56 +104,10 @@ git-update-cache -q --refresh || exit 1 @@ -101,56 +104,10 @@ git-update-cache -q --refresh || exit 1

case "$verify" in
t)
# This is slightly modified from Andrew Morton's Perfect Patch.
# Lines you introduce should not have trailing whitespace.
# Also check for an indentation that has SP before a TAB.
perl -e '
my $fh;
my $found_bad = 0;
my $filename;
my $reported_filename = "";
my $lineno;
sub bad_line {
my ($why, $line) = @_;
if (!$found_bad) {
print "*\n";
print "* You have some suspicious patch lines:\n";
print "*\n";
$found_bad = 1;
}
if ($reported_filename ne $filename) {
print "* In $filename\n";
$reported_filename = $filename;
}
print "* $why (line $lineno)\n$line\n";
}
open $fh, "-|", qw(git-diff-cache -p -M --cached HEAD);
while (<$fh>) {
if (m|^diff --git a/(.*) b/\1$|) {
$filename = $1;
next;
}
if (/^@@ -\S+ \+(\d+)/) {
$lineno = $1 - 1;
next;
}
if (/^ /) {
$lineno++;
next;
}
if (s/^\+//) {
$lineno++;
chomp;
if (/\s$/) {
bad_line("trailing whitespace", $_);
}
if (/^\s* /) {
bad_line("indent SP followed by a TAB", $_);
}
}
}
exit($found_bad);
' || exit ;;
if test -x "$GIT_DIR"/hooks/pre-commit
then
"$GIT_DIR"/hooks/pre-commit || exit
fi
esac

PARENTS="-p HEAD"
@ -255,6 +212,15 @@ case "$no_edit" in @@ -255,6 +212,15 @@ case "$no_edit" in
${VISUAL:-${EDITOR:-vi}} .editmsg
;;
esac

case "$verify" in
t)
if test -x "$GIT_DIR"/hooks/commit-msg
then
"$GIT_DIR"/hooks/commit-msg .editmsg || exit
fi
esac

grep -v '^#' < .editmsg | git-stripspace > .cmitmsg
grep -v -i '^Signed-off-by' .cmitmsg >.cmitchk
if test -s .cmitchk
@ -269,4 +235,9 @@ else @@ -269,4 +235,9 @@ else
fi
ret="$?"
rm -f .cmitmsg .editmsg .cmitchk

if test -x "$GIT_DIR"/hooks/post-commit && test "$ret" = 0
then
"$GIT_DIR"/hooks/post-commit
fi
exit "$ret"

6
git-prune-script

@ -3,10 +3,11 @@ @@ -3,10 +3,11 @@
. git-sh-setup-script || die "Not a git archive"

dryrun=
echo=
while case "$#" in 0) break ;; esac
do
case "$1" in
-n) dryrun=echo ;;
-n) dryrun=-n echo=echo ;;
--) break ;;
-*) echo >&2 "usage: git-prune-script [ -n ] [ heads... ]"; exit 1 ;;
*) break ;;
@ -20,6 +21,7 @@ sed -ne '/unreachable /{ @@ -20,6 +21,7 @@ sed -ne '/unreachable /{
s|\(..\)|\1/|p
}' | {
cd "$GIT_OBJECT_DIRECTORY" || exit
xargs $dryrun rm -f
xargs $echo rm -f
}

git-prune-packed $dryrun

12
git-resolve-script

@ -6,21 +6,25 @@ @@ -6,21 +6,25 @@
#
. git-sh-setup-script || die "Not a git archive"

head=$(git-rev-parse --verify "$1"^0) || exit
merge=$(git-rev-parse --verify "$2"^0) || exit
merge_msg="$3"
usage () {
die "git-resolve-script <head> <remote> <merge-message>"
}

dropheads() {
rm -f -- "$GIT_DIR/MERGE_HEAD" \
"$GIT_DIR/LAST_MERGE" || exit 1
}

head=$(git-rev-parse --verify "$1"^0) &&
merge=$(git-rev-parse --verify "$2"^0) &&
merge_msg="$3" || usage

#
# The remote name is just used for the message,
# but we do want it.
#
if [ -z "$head" -o -z "$merge" -o -z "$merge_msg" ]; then
die "git-resolve-script <head> <remote> <merge-message>"
usage
fi

dropheads

16
prune-packed.c

@ -1,6 +1,9 @@ @@ -1,6 +1,9 @@
#include "cache.h"

static const char prune_packed_usage[] = "git-prune-packed (no arguments)";
static const char prune_packed_usage[] =
"git-prune-packed [-n]";

static int dryrun;

static void prune_dir(int i, DIR *dir, char *pathname, int len)
{
@ -18,7 +21,9 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len) @@ -18,7 +21,9 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len)
if (!has_sha1_pack(sha1))
continue;
memcpy(pathname + len, de->d_name, 38);
if (unlink(pathname) < 0)
if (dryrun)
printf("rm -f %s\n", pathname);
else if (unlink(pathname) < 0)
error("unable to unlink %s", pathname);
}
}
@ -55,8 +60,11 @@ int main(int argc, char **argv) @@ -55,8 +60,11 @@ int main(int argc, char **argv)
const char *arg = argv[i];

if (*arg == '-') {
/* Handle flags here .. */
usage(prune_packed_usage);
if (!strcmp(arg, "-n"))
dryrun = 1;
else
usage(prune_packed_usage);
continue;
}
/* Handle arguments here .. */
usage(prune_packed_usage);

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--commit-msg

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by git-commit-script with one argument, the name of the file
# that has the commit 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.

# This example catches duplicate Signed-off-by lines.

test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1 /d')"

8
templates/hooks--post-commit

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, make this file executable.

: Nothing

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+"$@"}
:

61
templates/hooks--pre-commit

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by git-commit-script with no arguments. 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.

# This is slightly modified from Andrew Morton's Perfect Patch.
# Lines you introduce should not have trailing whitespace.
# Also check for an indentation that has SP before a TAB.
perl -e '
my $fh;
my $found_bad = 0;
my $filename;
my $reported_filename = "";
my $lineno;
sub bad_line {
my ($why, $line) = @_;
if (!$found_bad) {
print "*\n";
print "* You have some suspicious patch lines:\n";
print "*\n";
$found_bad = 1;
}
if ($reported_filename ne $filename) {
print "* In $filename\n";
$reported_filename = $filename;
}
print "* $why (line $lineno)\n";
print "$filename:$lineno:$line\n";
}
open $fh, "-|", qw(git-diff-cache -p -M --cached HEAD);
while (<$fh>) {
if (m|^diff --git a/(.*) b/\1$|) {
$filename = $1;
next;
}
if (/^@@ -\S+ \+(\d+)/) {
$lineno = $1 - 1;
next;
}
if (/^ /) {
$lineno++;
next;
}
if (s/^\+//) {
$lineno++;
chomp;
if (/\s$/) {
bad_line("trailing whitespace", $_);
}
if (/^\s* /) {
bad_line("indent SP followed by a TAB", $_);
}
}
}
exit($found_bad);
'

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