Skip to content

Instantly share code, notes, and snippets.

@tombigel
Created July 13, 2011 16:31
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tombigel/1080691 to your computer and use it in GitHub Desktop.
Save tombigel/1080691 to your computer and use it in GitHub Desktop.
GIT pre-commit test for capital letters in image file names and for debug commands
#!/bin/sh
#
# A hook script to verify that no images with capital letters are committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# Go through all the changed files (except for deleted and unmerged)
#
# Check for lines containing "debugger" "console." or "alert("
# Test only JS files
js_pattern="\.js"
# Check for changed lines
added_lines="^\+"
# Check for lines with comments
comment="(//|/\*).*"
beginning_of_line="^\+[\s]*"
# Check for lines containing "debugger" "console." or "alert(", skip comments
evil_pattern="(console\.|alert\(|debugger).*"
# Set exit code to 0, will be set to 1 on error.
exit_code=0
# Grep git diff of files to commit
js_files=$(
git diff --cached --find-copies --find-renames --name-only --diff-filter=ACMRTXBU |
grep -E "$js_pattern"
)
if [[ -n $js_files ]];
then
for file in $js_files; do
# Get only changed lines AND
# Only lines starting with '+' AND
# NOT lines with comments AND
# Test for console, debug etc.
lines_with_no_comment=$(
git diff --cached $file |
grep -E "$added_lines" |
grep -Ev "$comment" |
grep -E "$evil_pattern"
)
# Get only changed lines AND
# Only lines starting with '+' AND
# NOT lines starting with a comment AND
# Test for lines with console, debug etc. before a comment
lines_with_comment=$(
git diff --cached $file |
grep -E "$added_lines" |
grep -Ev "$beginning_of_line$comment" |
grep -E "${evil_pattern}$comment"
)
if [[ -n $lines_with_no_comment || -n $lines_with_comment ]];
then
echo
echo -e "Found illegal commands in \033[1m$file:\033[0m"
echo -e '\E[0;32m'"$lines_with_no_comment"
echo -e "$lines_with_comment"'\033[0m'
echo
# Abort commit
exit_code=1
fi
done
fi
# Check if file is an image JPG|GIF|PNG|JPEG and check for uppercase letters
# Check for image file types
mime_pattern="\.(gif|png|jpg|jpeg)"
# Check for capital letters only in file names
extra_pattern="(^|/)[^/]*([A-Z]+)[^/]*\.[A-Za-z]{3}$"
# Grep git diff of files to commit
files=$( git diff --cached --find-copies --find-renames --name-only --diff-filter=ACMRTXBU |
grep -Ei "$mime_pattern" |
grep -E "$extra_pattern" )
if [[ -n $files ]];
then
echo
echo "Found image files that contain capital letters."
echo "Please rename the following files and commit again:"
for file in $files; do
echo -e '\E[0;32m'"$file"'\033[0m'
done
# Abort commit
exit_code=1
fi
if [ $exit_code == 0 ]; then
echo
echo -e '\033[1m'"Pre-commit validation Passed"'\033[0m'
echo
else
echo
echo -e '\033[1m'"Commit Aborted!"'\033[0m'
echo
fi
exit $exit_code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment