| #!/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 isinstance(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', 'E402,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 --max-line-length 120", non_compliant_file, "; git add ", | |
| non_compliant_file) | |
| print("git commit") | |
| sys.exit(1) | |
| if __name__ == '__main__': | |
| main() |