[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] maint: add two git hook scripts
From: |
Jim Meyering |
Subject: |
[PATCH] maint: add two git hook scripts |
Date: |
Fri, 21 Oct 2011 15:01:54 +0200 |
For now, I'm merely putting these under version control.
Before long, I expect to create a symlink to each from .git/hooks/
as part of bootstrap, assuming that there is no such file already.
Doing that will enforce (albeit only locally) a few long-standing
commit-log guidelines.
>From d7b855279a86a5769c3f868c5867f4206e99fde0 Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Thu, 20 Oct 2011 17:26:01 +0200
Subject: [PATCH] maint: add two git hook scripts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
We find value in using consistent commit summaries.
To that end, the commit-msg script requires that all commits I make
start with "$PROG: " or one of the following other words:
gnulib tests maint doc build. It allows more than one word,
so e.g., "cat tail head: " would also be accepted.
Pádraig Brady wrote the initial version, with its 72-column
and blank-if-present second line checks.
The pre-commit script is barely different from the git-supplied
sample script, as mentioned in the comment at the end.
* scripts/git-hooks/commit-msg: New file.
* scripts/git-hooks/pre-commit: New file.
---
scripts/git-hooks/commit-msg | 71 ++++++++++++++++++++++++++++++++++++++++++
scripts/git-hooks/pre-commit | 50 +++++++++++++++++++++++++++++
2 files changed, 121 insertions(+), 0 deletions(-)
create mode 100755 scripts/git-hooks/commit-msg
create mode 100755 scripts/git-hooks/pre-commit
diff --git a/scripts/git-hooks/commit-msg b/scripts/git-hooks/commit-msg
new file mode 100755
index 0000000..2adb2fb
--- /dev/null
+++ b/scripts/git-hooks/commit-msg
@@ -0,0 +1,71 @@
+#!/bin/sh
+# A hook script to check the commit log message.
+
+export msg="$1"
+
+reedit() {
+ read -p "Hit return to edit. Ctrl-C to abort..."
+ ${EDITOR:-vi} "$msg"
+}
+
+get_msg() {
+ sed '/^#/d' "$msg" #filter comments
+}
+
+check_msg() {
+
+ # First line must contain a colon, e.g., "keyword: ...".
+ line_1=$(sed 1q "$msg")
+ case $line_1 in
+ *:*) ;;
+ [Vv]ersion' '[0-9]*) return 0;;
+ *) echo "missing colon on first line of log message" >&2; return 1;;
+ esac
+
+ # The token(s) before the colon on the first line must be one of
+ # the following. Tokens may be space- or comma-separated.
+ fail=0
+ for w in $(echo "$line_1"|sed 's/:.*//'|tr -s ' ,' ' '); do
+ case $w in
+ # program names
+ \[|arch|base64|basename|cat|chcon|chgrp|chmod|chown|chroot) ;;
+ cksum|comm|cp|csplit|cut|date|dd|df|dir|dircolors|dirname|du) ;;
+ echo|env|expand|expr|factor|false|fmt|fold|groups|head|hostid) ;;
+ hostname|id|install|join|kill|link|ln|logname|ls|md5sum|mkdir) ;;
+ mkfifo|mknod|mktemp|mv|nice|nl|nohup|nproc|od|paste|pathchk) ;;
+ pinky|pr|printenv|printf|ptx|pwd|readlink|rm|rmdir|runcon) ;;
+ seq|sha1sum|sha224sum|sha256sum|sha384sum|sha512sum|shred|shuf) ;;
+ sleep|sort|split|stat|stdbuf|stty|su|sum|sync|tac|tail|tee) ;;
+ test|timeout|touch|tr|true|truncate|tsort|tty|uname|unexpand) ;;
+ uniq|unlink|uptime|users|vdir|wc|who|whoami|yes) ;;
+ # other tags
+ gnulib|tests|maint|doc|build) ;;
+ *) echo "invalid first word of 1-line summary: $w" >&2; fail=1;;
+ esac
+ done
+ test $fail = 1 && return 1
+
+ # Limit line length to allow for tab in changelog
+ test $(get_msg | wc -L | cut -f1 -d' ') -gt 72 && {
+ echo "line > 72 chars" >&2; return 1;
+ }
+
+ # Don't allow leading spaces
+# get_msg | grep -qE "^ +" && {
+# echo "leading spaces" >&2; return 1;
+# }
+
+ # Second line should be blank or not present
+ test "$(get_msg | sed -n 2p)" && {
+ echo "second line should be blank" >&2; return 1;
+ }
+
+ # Flag redundant use of "issue"
+ get_msg | grep -Fi "issue reported by" >&2 && {
+ echo "just say: Reported by ..." >&2; return 1;
+ }
+
+ return 0;
+}
+
+until check_msg; do reedit; done
diff --git a/scripts/git-hooks/pre-commit b/scripts/git-hooks/pre-commit
new file mode 100755
index 0000000..8b04f2f
--- /dev/null
+++ b/scripts/git-hooks/pre-commit
@@ -0,0 +1,50 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by git-commit 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, rename this file to "pre-commit".
+
+if git-rev-parse --verify HEAD >/dev/null 2>&1
+then
+ against=HEAD
+else
+ # Initial commit: diff against an empty tree object
+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+# If you want to allow non-ascii filenames set this variable to true.
+allownonascii=$(git config hooks.allownonascii)
+
+# Cross platform projects tend to avoid non-ascii filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+ # Note that the use of brackets around a tr range is ok here, (it's
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
+ # the square bracket bytes happen to fall in the designated range.
+ test "$(git diff --cached --name-only --diff-filter=A -z $against |
+ LC_ALL=C tr -d '[ -~]\0')"
+then
+ echo "Error: Attempt to add a non-ascii file name."
+ echo
+ echo "This can cause problems if you want to work"
+ echo "with people on other platforms."
+ echo
+ echo "To be portable it is advisable to rename the file ..."
+ echo
+ echo "If you know what you are doing you can disable this"
+ echo "check using:"
+ echo
+ echo " git config hooks.allownonascii true"
+ echo
+ exit 1
+fi
+
+# If there are offending names, print them to stderr and fail.
+d=$(git diff-index --check --cached $against --) \
+ || { printf '%s\n' "$d" 1>&2; exit 1; }
+
+exit 0
--
1.7.7.419.g87009
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] maint: add two git hook scripts,
Jim Meyering <=