Skip to content

Instantly share code, notes, and snippets.

@larsxschneider
Forked from torsten/fix-whitespace.sh
Created October 26, 2012 08:30
Show Gist options
  • Save larsxschneider/3957621 to your computer and use it in GitHub Desktop.
Save larsxschneider/3957621 to your computer and use it in GitHub Desktop.
Pre-commit hook script for git to fix various source file things.
#!/bin/sh
# Pre-commit hook for git which removes trailing whitespace, converts tabs to spaces, and enforces a max line length.
# The script does not process files that are partially staged. Reason: The `git add` in the last line would fully
# stage a file which is not what the user wants.
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
staged_files=`git diff-index --name-status --cached $against | # Find all staged files
egrep -i '^(A|M).*\.(h|m|mm|cpp|js|html|txt|sh)$' | # Only process certain files
sed -e 's/^[AM][[:space:]]*//' | # Remove leading git info
sort | # Remove duplicates
uniq`
partially_staged_files=`git status --porcelain --untracked-files=no | # Find all staged files
egrep -i '^(A|M)M ' | # Filter only partially staged files
sed -e 's/^[AM]M[[:space:]]*//' | # Remove leading git info
sort | # Remove duplicates
uniq`
# Merge staged files and partially staged files
staged_and_partially_staged_files=${staged_files}$'\n'${partially_staged_files}
# Remove all files that are staged *AND* partially staged
# Thus we get only the fully staged files
fully_staged_files=`echo "$staged_and_partially_staged_files" | sort | uniq -u`
# Change field separator to newline so that for correctly iterates over lines
IFS=$'\n'
for FILE in $fully_staged_files ; do
echo "Fixing whitespace and newline in $FILE" >&2
# Replace tabs with four spaces
sed -i '' $'s/\t/ /g' "$FILE"
# Strip trailing whitespace
sed -i '' -E 's/[[:space:]]*$//' "$FILE"
# Add newline to the end of the file
sed -i '' $'/^$/!s/$/\/' "$FILE"
# Stage all changes
git add "$FILE"
done
# Install whitespace git hook for repository:
# Run from repository root dir
if [ -f .git-fix-whitespaces.sh ]
then
ln -fs ../../.git-fix-whitespaces.sh .git/hooks/pre-commit
else
echo '\nError: Fix whitespace script not found repository.'
fi
@onlywei
Copy link

onlywei commented Apr 18, 2013

Having the first set of empty quotations in each sed command seems to not work at all.

# throws an error
sed -i '' $'s/\t/    /g' "$FILE"

# works
sed -i $'s/\t/    /g' "$FILE"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment