coreutils
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]