diff --git a/scripts/git-prehook-whitespace.sh b/scripts/git-prehook-whitespace.sh new file mode 100755 index 00000000..48653deb --- /dev/null +++ b/scripts/git-prehook-whitespace.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# +# A git hook script to find and fix trailing whitespace +# in your commits. Bypass it with the --no-verify option +# to git-commit +# +# Copyright Oldman and contributors: +# https://github.com/imoldman/config +# +# Add this to a project's pre-hooks using: +# git rev-parse --show-toplevel +# ln -s ../../scripts/git-prehook-whitespace.sh .git/hooks/pre-commit + +set -euo pipefail + +# detect platform +platform="win" +uname_result="$(uname)" +if [ "$uname_result" = "Linux" ]; then + platform="linux" +elif [ "$uname_result" = "Darwin" ]; then + platform="mac" +fi + +# change IFS to ignore filename's space in |for| +IFS=" +" +# autoremove trailing whitespace +for line in $(git diff --check --cached | sed '/^[+-]/d') ; do + # get file name + if [ "$platform" = "mac" ]; then + file="$(echo "$line" | sed -E 's/:[0-9]+: .*//')" + else + file="$(echo "$line" | sed -r 's/:[0-9]+: .*//')" + fi + # display tips + echo -e "auto remove trailing whitespace in \\033[31m$file\\033[0m!" + # since $file in working directory isn't always equal to $file in index, so we backup it + mv -f "$file" "${file}.save" + # discard changes in working directory + git checkout -- "$file" + # remove trailing whitespace + if [ "$platform" = "win" ]; then + # sed in msys 1.x does not support -i + sed 's/[[:space:]]*$//' "$file" > "${file}.bak" + mv -f "${file}.bak" "$file" + elif [ "$platform" == "mac" ]; then + sed -i "" 's/[[:space:]]*$//' "$file" + else + sed -i 's/[[:space:]]*$//' "$file" + fi + git add "$file" + # restore the $file + sed 's/[[:space:]]*$//' "${file}.save" > "$file" + rm "${file}.save" +done + +# Now we can commit +exit