summaryrefslogtreecommitdiff
path: root/bin/strict-bashism-check
diff options
context:
space:
mode:
Diffstat (limited to 'bin/strict-bashism-check')
-rwxr-xr-xbin/strict-bashism-check82
1 files changed, 82 insertions, 0 deletions
diff --git a/bin/strict-bashism-check b/bin/strict-bashism-check
new file mode 100755
index 0000000..a6694f4
--- /dev/null
+++ b/bin/strict-bashism-check
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+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 --bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# 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' | wc -c) != 0
+then
+ cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+ git config hooks.allownonascii true
+EOF
+ exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+git diff-index --check --cached $against -- || exit $?
+
+tree=$(git write-tree)
+
+tmp_dir=$(mktemp -d)
+trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT
+
+git archive "${tree}" | \
+ tar -C "${tmp_dir}" -x
+
+errors=$(
+ cd "${tmp_dir}"
+ find "bin" "conf" -type f -not -executable -not -name '.gitignore'
+)
+
+if [ -n "${errors}" ]; then
+ >&2 echo 'Non-executable files found in bin/ or conf/:'
+ >&2 echo "${errors}"
+ exit 1
+fi
+
+errors=$(
+ find bin conf -type f -executable -exec grep -H '="\$(' {} \;
+)
+
+if [ -n "${errors}" ]; then
+ >&2 echo 'Unnecessary quotes found:'
+ >&2 echo "${errors}"
+ exit 1
+fi
+
+errors=$(
+ cd "${tmp_dir}"
+ checkbashisms bin/* conf/* 2>&1
+)
+
+if [ -n "${errors}" ]; then
+ >&2 echo 'possible bashisms found:'
+ >&2 echo "${errors}"
+ exit 1
+fi