Merge with master to pick up commit hook works.
authorJunio C Hamano <junkio@cox.net>
Sat, 20 Aug 2005 08:47:08 +0000 (01:47 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 20 Aug 2005 08:47:08 +0000 (01:47 -0700)
git-commit-script
git-prune-script
git-resolve-script
prune-packed.c
templates/hooks--applypatch-msg [new file with mode: 0644]
templates/hooks--commit-msg [new file with mode: 0644]
templates/hooks--post-commit [new file with mode: 0644]
templates/hooks--pre-applypatch [new file with mode: 0644]
templates/hooks--pre-commit [new file with mode: 0644]
tools/git-applypatch

index de298b7..5c5f564 100755 (executable)
@@ -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
   -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
 
 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
        ${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
 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"
index a8e338c..2e130c7 100755 (executable)
@@ -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 /{
     s|\(..\)|\1/|p
 }' | {
        cd "$GIT_OBJECT_DIRECTORY" || exit
-       xargs $dryrun rm -f
+       xargs $echo rm -f
 }
 
+git-prune-packed $dryrun
index 4641119..50d5f83 100755 (executable)
@@ -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
index a2f4488..5306e8e 100644 (file)
@@ -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)
                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)
                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);
diff --git a/templates/hooks--applypatch-msg b/templates/hooks--applypatch-msg
new file mode 100644 (file)
index 0000000..bda3c86
--- /dev/null
@@ -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+"$@"}
+:
diff --git a/templates/hooks--commit-msg b/templates/hooks--commit-msg
new file mode 100644 (file)
index 0000000..029f897
--- /dev/null
@@ -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')"
diff --git a/templates/hooks--post-commit b/templates/hooks--post-commit
new file mode 100644 (file)
index 0000000..8be6f34
--- /dev/null
@@ -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
diff --git a/templates/hooks--pre-applypatch b/templates/hooks--pre-applypatch
new file mode 100644 (file)
index 0000000..a547516
--- /dev/null
@@ -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+"$@"}
+:
+
diff --git a/templates/hooks--pre-commit b/templates/hooks--pre-commit
new file mode 100644 (file)
index 0000000..dad99bc
--- /dev/null
@@ -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);
+'
+
index 406fef3..e5bc3c0 100755 (executable)
 ##     $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