gstreamer/hooks/pre-commit-python.hook
Alicia Boya García 438393293e pre-commit-python: Allow line breaks between binary operators
pre-commit-python overrides the list of ignored Python style errors.
Unfortunately, before this patch the list did not exclude W503 and
W504 (which are otherwise ignored by default).

The consequence of having those two warnings enabled at the same time is
that it's not possible to break lines on binary operators, which is an
unreasonable unintentional restriction:

  'validateflow': "validateflow, expectations-dir=\"" +
                  expectations_dir + "\", actual-results-dir=\"" +
                  actual_results_dir + "\"",

W504 line break after binary operator

  'validateflow': "validateflow, expectations-dir=\""
                  + expectations_dir + "\", actual-results-dir=\""
                  + actual_results_dir + "\"",

W503 line break before binary operator

This patch excludes W503 so that there is a valid style for breaking
lines on binary operators.
2019-01-15 18:57:02 +01:00

81 lines
2.7 KiB
Python
Executable file

#!/usr/bin/env python3
import os
import subprocess
import sys
import tempfile
NOT_PYCODESTYLE_COMPLIANT_MESSAGE_PRE = \
"Your code is not fully pycodestyle compliant and contains"\
" the following coding style issues:\n\n"
NOT_PYCODESTYLE_COMPLIANT_MESSAGE_POST = \
"Please fix these errors and commit again, you can do so "\
"from the root directory automatically like this, assuming the whole "\
"file is to be commited:"
NO_PYCODESTYLE_MESSAGE = \
"You should install the pycodestyle style checker to be able"\
" to commit in this repo.\nIt allows us to garantee that "\
"anything that is commited respects the pycodestyle coding style "\
"standard.\nYou can install it:\n"\
" * on ubuntu, debian: $sudo apt-get install pycodestyle \n"\
" * on fedora: #yum install python3-pycodestyle \n"\
" * on arch: #pacman -S python-pycodestyle \n"\
" * or `pip install --user pycodestyle`"
def system(*args, **kwargs):
kwargs.setdefault('stdout', subprocess.PIPE)
proc = subprocess.Popen(args, **kwargs)
out, err = proc.communicate()
if type(out) == bytes:
out = out.decode()
return out
def copy_files_to_tmp_dir(files):
tempdir = tempfile.mkdtemp()
for name in files:
filename = os.path.join(tempdir, name)
filepath = os.path.dirname(filename)
if not os.path.exists(filepath):
os.makedirs(filepath)
with open(filename, 'w') as f:
system('git', 'show', ':' + name, stdout=f)
return tempdir
def main():
modified_files = system('git', 'diff-index', '--cached',
'--name-only', 'HEAD', '--diff-filter=ACMR').split("\n")[:-1]
non_compliant_files = []
output_message = None
for modified_file in modified_files:
try:
if not modified_file.endswith(".py"):
continue
pycodestyle_errors = system('pycodestyle', '--repeat', '--ignore', 'E501,E128,W605,W503', modified_file)
if pycodestyle_errors:
if output_message is None:
output_message = NOT_PYCODESTYLE_COMPLIANT_MESSAGE_PRE
output_message += pycodestyle_errors
non_compliant_files.append(modified_file)
except OSError as e:
output_message = NO_PYCODESTYLE_MESSAGE
break
if output_message:
print(output_message)
if non_compliant_files:
print(NOT_PYCODESTYLE_COMPLIANT_MESSAGE_POST)
for non_compliant_file in non_compliant_files:
print("autopep8 -i ", non_compliant_file, "; git add ",
non_compliant_file)
print("git commit")
sys.exit(1)
if __name__ == '__main__':
main()