all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Paul Eggert <eggert@cs.ucla.edu>
To: Glenn Morris <rgm@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: emacs-diffs emails can get long subject if log starts with "*"
Date: Sat, 22 Nov 2014 16:46:07 -0800	[thread overview]
Message-ID: <54712E4F.2010102@cs.ucla.edu> (raw)
In-Reply-To: <iolhn2rg2g.fsf@fencepost.gnu.org>

[-- Attachment #1: Type: text/plain, Size: 447 bytes --]

To help avoid this sort of problem in future commits, I installed the attached 
patch into the emacs-24 branch.  Once you bootstrap or run autogen.sh, it 
arranges for Git commit hooks that verify that a commit's file names are 
portable and that the commit messages are reasonable.  It's common practice in 
other projects to have commit hooks with sanity checks.  No doubt the details 
can use some tweaking for Emacs; this is just a first cut.

[-- Attachment #2: 0001-Add-git-commit-hooks-that-do-some-simple-checks-on-c.patch --]
[-- Type: text/x-diff, Size: 6095 bytes --]

From acd837f97f5701a3ebdb1bbdd79fac4ed8153629 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sat, 22 Nov 2014 15:46:17 -0800
Subject: [PATCH] Add git commit hooks that do some simple checks on commits.

* autogen.sh: Install Git hooks, if using Git.
* build-aux/git-hooks/commit-msg, build-aux/git-hooks/pre-commit:
New files, which are Git hooks that check for portable file names, and
do some simple checks for commit message format.
---
 autogen.sh                     | 40 +++++++++++++++++++
 build-aux/git-hooks/commit-msg | 90 ++++++++++++++++++++++++++++++++++++++++++
 build-aux/git-hooks/pre-commit | 46 +++++++++++++++++++++
 3 files changed, 176 insertions(+)
 create mode 100755 build-aux/git-hooks/commit-msg
 create mode 100755 build-aux/git-hooks/pre-commit

diff --git a/autogen.sh b/autogen.sh
index bc8a73d..69812cd 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -208,6 +208,46 @@ autoreconf -i -I m4 || exit $?
 ## cause 'make' to needlessly run 'autoheader'.
 echo timestamp > src/stamp-h.in || exit
 
+## Install Git hooks, if using Git.
+if test -d .git/hooks; then
+    tailored_hooks=
+    sample_hooks=
+
+    for hook in commit-msg pre-commit; do
+	cmp build-aux/git-hooks/$hook .git/hooks/$hook >/dev/null 2>&1 ||
+	tailored_hooks="$tailored_hooks $hook"
+    done
+    for hook in applypatch-msg pre-applypatch; do
+	cmp .git/hooks/$hook.sample .git/hooks/$hook >/dev/null 2>&1 ||
+	sample_hooks="$sample_hooks $hook"
+    done
+
+    if test -n "$tailored_hooks$sample_hooks"; then
+	echo "Installing git hooks..."
+
+	case `cp --help 2>/dev/null` in
+	  *--backup*--verbose*)
+	    cp_options='--backup=numbered --verbose';;
+	  *)
+	    cp_options='';;
+	esac
+
+	if test -n "$tailored_hooks"; then
+	    for hook in $tailored_hooks; do
+		cp $cp_options build-aux/git-hooks/$hook .git/hooks || exit
+		chmod a-w .git/hooks/$hook || exit
+	    done
+	fi
+
+	if test -n "$sample_hooks"; then
+	    for hook in $sample_hooks; do
+		cp $cp_options .git/hooks/$hook.sample .git/hooks/$hook || exit
+		chmod a-w .git/hooks/$hook || exit
+	    done
+	fi
+    fi
+fi
+
 echo "You can now run \`./configure'."
 
 exit 0
diff --git a/build-aux/git-hooks/commit-msg b/build-aux/git-hooks/commit-msg
new file mode 100755
index 0000000..6a09edd
--- /dev/null
+++ b/build-aux/git-hooks/commit-msg
@@ -0,0 +1,90 @@
+#!/bin/sh
+# Check the format of GNU Emacs change log entries.
+
+# Copyright 2014 Free Software Foundation, Inc.
+
+# This file is part of GNU Emacs.
+
+# GNU Emacs is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+# Written by Paul Eggert.
+
+# Use a UTF-8 locale if available, so that the UTF-8 check works.
+# Use U+00A2 CENT SIGN to test whether the locale works.
+cent_sign_utf8_octal='\302\242'
+at_sign=`
+  printf "${cent_sign_utf8_octal}@" |
+  awk '{print substr($0, 2)}' 2>/dev/null
+`
+if test "$at_sign" != @; then
+  at_sign=`
+    printf "${cent_sign_utf8_octal}@" |
+    LC_ALL=en_US.utf8 awk '{print substr($0, 2)}' 2>/dev/null
+  `
+  if test "$at_sign" = @; then
+    LC_ALL=en_US.utf8; export LC_ALL
+  fi
+fi
+
+# Check the log entry.
+exec awk '
+  /^#/ { next }
+
+  !/^.*$/ {
+    print "Invalid character (not UTF-8)"
+    status = 1
+  }
+
+  nlines == 0 && !/[^[:space:]]/ { next }
+
+  { nlines++ }
+
+  nlines == 1 && /^[[:space:]]/ {
+    print "White space at start of first line"
+    status = 1
+  }
+
+  nlines == 2 && /[^[:space:]]/ {
+    print "Nonempty second line"
+    status = 1
+  }
+
+  /[[:cntrl:]]/ {
+    print "Text contains control character; please use spaces instead of tabs"
+    status = 1
+  }
+
+  72 < length && /[[:space:]]/ {
+    print "Line longer than 72 characters"
+    status = 1
+  }
+
+  140 < length {
+    print "Word longer than 140 characters"
+    status = 1
+  }
+
+  /^Signed-off-by: / {
+    print "'Signed-off-by:' present"
+    status = 1
+  }
+
+  END {
+    if (nlines == 0) {
+      print "Empty change log entry"
+      status = 1
+    }
+    exit status
+  }
+' <"$1"
diff --git a/build-aux/git-hooks/pre-commit b/build-aux/git-hooks/pre-commit
new file mode 100755
index 0000000..c24f9bb
--- /dev/null
+++ b/build-aux/git-hooks/pre-commit
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Check file names in git commits for GNU Emacs.
+
+# Copyright 2014 Free Software Foundation, Inc.
+
+# This file is part of GNU Emacs.
+
+# GNU Emacs is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+LC_ALL=C
+export LC_ALL
+
+exec >&2
+
+. git-sh-setup
+
+git_diff='git diff --cached --name-only --diff-filter=A'
+ok_chars='\0+[=-=]./0-9A-Z_a-z'
+nbadchars=`$git_diff -z HEAD | tr -d "$ok_chars" | wc -c`
+
+if test "$nbadchars" -ne 0; then
+  echo "File name does not consist of -+./_ or ASCII letters or digits."
+  exit 1
+fi
+
+new_names=`$git_diff HEAD` || exit
+case "
+$new_names" in
+  */-* | *'
+'-*)
+    echo "File name component begins with '-'."
+    exit 1;;
+esac
+
+exec git diff-index --check --cached HEAD --
-- 
1.9.3


  parent reply	other threads:[~2014-11-23  0:46 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-22 22:31 emacs-diffs emails can get long subject if log starts with "*" Glenn Morris
2014-11-22 22:58 ` Andreas Schwab
2014-11-22 23:06   ` Glenn Morris
2014-11-23  0:13     ` Glenn Morris
2014-11-23  0:24       ` Glenn Morris
2014-11-23  0:46     ` Paul Eggert [this message]
2014-11-23  4:44     ` Yuri Khan
2014-11-23 10:15       ` Thien-Thi Nguyen
2014-11-23 16:06       ` Eli Zaretskii
2014-11-23 23:28         ` Richard Stallman
2014-11-23 16:04     ` Rüdiger Sonderfeld
2014-11-23 17:26       ` Eli Zaretskii
2014-11-24 17:12       ` Glenn Morris
2014-11-24 17:23         ` Andreas Schwab
2014-11-24 17:49   ` Stefan Monnier
2014-11-24 18:06     ` Andreas Schwab

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54712E4F.2010102@cs.ucla.edu \
    --to=eggert@cs.ucla.edu \
    --cc=emacs-devel@gnu.org \
    --cc=rgm@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.