Create a global GIT hook to check Flake8 before each commit


NOW, LET’S SET UP GLOBAL GIT COMMIT HOOKS:

1. Enable git templates:

$ git config –global init.templatedir ‘~/.git-templates’

This tells git to copy everything in ~/.git-templates to your per-project .git/ directory when you run git init.

2. Create a directory to hold the global hooks:

$ mkdir -p ~/.git-templates/hooks

3. Write your hooks in ~/.git-templates/hooks.

For example, here’s a post-commit hook (located in ~/.git-templates/hooks/post-commit):

#!/bin/sh
# Copy last commit hash to clipboard on commit
git log -1 –format=format:%h | pbcopy
# Add other post-commit hooks

4. Make sure the hook is executable.

chmod a+x ~/.git-templates/hooks/post-commit

5. Re-initialize git in each existing repo you’d like to use this in:

$ git init

Note: If you already have a hook defined in your local git repo, this will not overwrite it.

NOW, LET’S CREATE A GLOBAL GIT PRE-COMMIT HOOK:

#!/usr/bin/env python
import glob
import os
import sys
# git usurbs your bin path for hooks and will always run system python
site_packages = glob.glob(‘%s/lib/*/site-packages’ % os.environ[‘VIRTUAL_ENV’])[0]
sys.path.insert(0, site_packages)
from flake8.run import git_hook
COMPLEXITY = 10
STRICT = True
if __name__ == ‘__main__’:
sys.exit(git_hook(complexity=COMPLEXITY, strict=STRICT))

FINALLY, LET’S TAKE IT FOR A SPIN!
Go to some of your repos and re-initialize it to take the pre-commit hook:

$ git init

Now, edit some of your Python files, introducing some violation (like a >80 columns line, only one blank line between function/class definitions, etc.) and try to commit it:

$ git commit setup.py
setup.py:4:1: E302 expected 2 blank lines, found 0
setup.py:8:1: E302 expected 2 blank lines, found 0

Voilà!

Matias Herranz is as a Python Developer for Santex. He is a Computer Science and Open Source software enthusiast. His professional experience has focused on Python/Django web app development and some incursions in mobile apps for iPhone/Android. He is a team player who enjoys and finds it rewarding to share the things he learns, either through conferences and lectures, or through day-to-day communication with his coworkers.

Leave a reply