| """ |
| A very simple pre-commit hook that, when passed one or more filenames |
| as arguments, will sort the lines in those files. |
| |
| An example use case for this: you have a deploy-whitelist.txt file |
| in a repo that contains a list of filenames that is used to specify |
| files to be included in a docker container. This file has one filename |
| per line. Various users are adding/removing lines from this file; using |
| this hook on that file should reduce the instances of git merge |
| conflicts and keep the file nicely ordered. |
| """ |
| from __future__ import print_function |
| |
| import argparse |
| |
| PASS = 0 |
| FAIL = 1 |
| |
| |
| def sort_file_contents(f): |
| before = [line for line in f] |
| after = sorted(before) |
| |
| before_string = b''.join(before) |
| after_string = b''.join(after) |
| |
| if before_string == after_string: |
| return PASS |
| else: |
| f.seek(0) |
| f.write(after_string) |
| f.truncate() |
| return FAIL |
| |
| |
| def parse_commandline_input(argv): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('filenames', nargs='+', help='Files to sort') |
| args = parser.parse_args(argv) |
| return args |
| |
| |
| def main(argv=None): |
| args = parse_commandline_input(argv) |
| |
| retv = PASS |
| |
| for arg in args.filenames: |
| with open(arg, 'rb+') as file_obj: |
| ret_for_file = sort_file_contents(file_obj) |
| |
| if ret_for_file: |
| print('Sorting {}'.format(arg)) |
| |
| retv |= ret_for_file |
| |
| return retv |