Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Run autopep8 and any tests you can find. To have a as a pre-commit hook, add to .git/hooks/pre-commit
#!/usr/bin/env bash
# Script to run before doing a commit. This will run autopep8 and any unit tests it can find.
# Place this script in .git/hooks/ directory of your repo and rename it pre-commit (no extension)
# To have this file copied to every new repo you created, place it in $HOME/.git_template/hooks/pre-commit
# 1. This is an opinionated script, following the notion that code formatting issues are the most contentious but the
# least consequential. As such it borrows a page from Go and lets the machine decide on the formatting. Concretely,
# this means that any PEP8 violations will be fixed before commit, so long as the semantics of the code aren't changed
# (e.g. x == None is not replaced with x is None)
# 2. If any tests fail the commit will be aborted. To force a commit (at your own peril!), use 'git commit --no-verify'
function python_checks {
# test that we have autopep8.
which autopep8 > /dev/null 2>&1
# examine exit status
if [ $? -gt 0 ]; then
echo "autopep8 not installed. Cannot proceed"
exit 1
# run autopep8 to see if changes need to made.
mln=120 # max line length. Should be something sensible for the modern world.
autopep_results=$(autopep8 --max-line-length ${mln} --diff ${staged})
if [ "$autopep_results" != "" ]; then
# if colordiff is installed, we'll use it.
which colordiff > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "$autopep_results" | colordiff
echo "$autopep_results"
# Make the changes.
autopep8 --max-line-length ${mln} --in-place ${staged}
# And restage.
git add ${staged}
# run tests
python -m unittest discover . --failfast
# unittest exists with 0 if all tests passed, 1 otherwise.
if [ ${tests_failed} -eq 1 ]; then
echo "Tests failed. Aborting commit"
exit 1
# Look for python files that are about to be committed.
staged_py_files=$(git diff --name-only --cached | grep "\.py$")
if [[ ! -z "$staged_py_files" ]]; then
python_checks ${staged_py_files}
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment