Add commit hook and make the verification customizable.

There are three hooks:

    - 'pre-commit' is given an opportunity to inspect what is
      being committed, before we invoke the EDITOR for the
      commit message;

    - 'commit-msg' is invoked on the commit log message after
      the user prepares it;

    - 'post-commit' is run after a successful commit is made.

The first two can interfere to stop the commit.  The last one is
for after-the-fact notification.

The earlier built-in commit checker is now moved to pre-commit.

Signed-off-by: Junio C Hamano <junkio@cox.net>
diff --git a/git-commit-script b/git-commit-script
index de298b7..5c5f564 100755
--- a/git-commit-script
+++ b/git-commit-script
@@ -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 @@
   -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 @@
 
 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 @@
 	${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 @@
 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"