#!/bin/sh # Check file names in git commits for GNU Emacs. # Copyright 2014-2024 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 . LC_ALL=C export LC_ALL # If this is a system where /bin/sh isn't sufficient to # run git-sh-setup, use a working shell as a recourse. if test -x "/usr/xpg4/bin/sh" && test -z "$POSIX_SHELL"; then POSIX_SHELL=1 export POSIX_SHELL exec "/usr/xpg4/bin/sh" `dirname $0`/pre-commit fi exec >&2 . git-sh-setup # When doing a two-way merge, ignore problems that came from the other # side of the merge. head=HEAD if test -r "$GIT_DIR"/MERGE_HEAD && test "$GIT_MERGE_CHECK_OTHER" != true; then merge_heads=`cat "$GIT_DIR"/MERGE_HEAD` || exit for merge_head in $merge_heads; do case $head in HEAD) head=$merge_head;; # For multi-head merges, there's no easy way to ignore merged-in # changes. But if you're doing multi-head merges, presumably # you know how to handle any ensuing problems. *) head=HEAD; break;; esac done fi git_diff='git diff --cached --name-only --diff-filter=A' # 'git diff' will backslash escape tabs and newlines, so we don't have # to worry about word splitting here. $git_diff $head | LC_ALL=C grep -E 'ChangeLog|^-|/-|[^-+./_0-9A-Z_a-z]' | while IFS= read -r new_name; do case $new_name in -* | */-*) echo "$new_name: File name component begins with '-'." exit 1;; ChangeLog.android) # This file is explicitly ok. ;; ChangeLog | */ChangeLog) echo "$new_name: Please use git commit messages, not ChangeLog files." exit 1;; *) echo "$new_name: File name does not consist of -+./_ or ASCII letters or digits." exit 1;; esac done # The '--check' option of git diff-index makes Git complain if changes # introduce whitespace errors. This can be a pain when editing test # files that deliberately contain lines with trailing whitespace. # To work around the problem you can run a command like 'git config # core.whitespace -trailing-space'. It may be better to revamp the # tests so that trailing spaces are generated on the fly rather than # being committed as source. exec git diff-index --check --cached $head --