79 lines
2.7 KiB
Python
Executable File
79 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
'''
|
|
Kivy Git Pre-Commit Hook to Enforce Styleguide
|
|
==============================================
|
|
|
|
This script is not supposed to be run directly.
|
|
Instead, copy it to your kivy/.git/hooks/ directory, call it 'pre-commit'
|
|
and make it executable.
|
|
|
|
If you attempt to commit, git will run this script, which in turn will run
|
|
the styleguide checker over your code and abort the commit if there are any
|
|
errors. If that happens, please fix & retry.
|
|
|
|
To install::
|
|
|
|
cp kivy/tools/pep8checker/pre-commit.githook .git/hooks/pre-commit
|
|
chmod +x .git/hooks/pre-commit
|
|
'''
|
|
|
|
import sys, os
|
|
from os.path import dirname, abspath, sep, join
|
|
from subprocess import call, Popen, PIPE
|
|
|
|
curdir = dirname(abspath(__file__))
|
|
kivydir = sep.join(curdir.split(sep)[:-2])
|
|
srcdir = join(kivydir, 'kivy')
|
|
script = join(srcdir, 'tools', 'pep8checker', 'pep8kivy.py')
|
|
try:
|
|
with open(script): pass
|
|
except IOError:
|
|
# if this not the kivy project, find the script file in the kivy project
|
|
os.environ['KIVY_NO_CONSOLELOG'] = '1'
|
|
import kivy
|
|
script = join(dirname(kivy.__file__), 'tools', 'pep8checker', 'pep8kivy.py')
|
|
srcdir = ''
|
|
|
|
# Only check the files that were staged
|
|
#proc = Popen(['git', 'diff', '--cached', '--name-only', 'HEAD'], stdout=PIPE)
|
|
#targets = [join(kivydir, target) for target in proc.stdout]
|
|
|
|
# Correction: only check the files that were staged, but do not include
|
|
# deleted files.
|
|
proc = Popen(['git', 'diff', '--cached', '--name-status', 'HEAD'], stdout=PIPE)
|
|
proc.wait()
|
|
|
|
# This gives output like the following:
|
|
#
|
|
# A examples/widgets/lists/list_simple_in_kv.py
|
|
# A examples/widgets/lists/list_simple_in_kv_2.py
|
|
# D kivy/uix/observerview.py
|
|
#
|
|
# So check for D entries and remove them from targets.
|
|
#
|
|
targets = []
|
|
for target in proc.stdout:
|
|
parts = [p.strip() for p in target.split()]
|
|
if parts[0] != 'D':
|
|
targets.append(join(kivydir, target.decode(encoding='UTF-8')))
|
|
|
|
# Untested possibility: After making the changes above for removing deleted
|
|
# files from targets, saw also where the git diff call could be:
|
|
#
|
|
# git diff --cached --name-only --diff-filter=ACM
|
|
# (leaving off D)
|
|
#
|
|
# and we could then remove the special handling in python for targets above.
|
|
|
|
call(['git', 'stash', 'save', '--keep-index', '--quiet'])
|
|
retval = call([sys.executable, script, srcdir] + targets)
|
|
call(['git', 'stash', 'pop', '--quiet'])
|
|
|
|
if retval:
|
|
# There are styleguide violations
|
|
print("Error:", retval, "styleguide violation(s) encountered!")
|
|
print("Your commit has been aborted. Please fix the violations and retry.")
|
|
sys.exit(retval)
|
|
|