| import argparse | |
| import re | |
| from typing import AbstractSet | |
| from typing import Optional | |
| from typing import Sequence | |
| from pre_commit_hooks.util import CalledProcessError | |
| from pre_commit_hooks.util import cmd_output | |
| def is_on_branch( | |
| protected: AbstractSet[str], | |
| patterns: AbstractSet[str] = frozenset(), | |
| ) -> bool: | |
| try: | |
| ref_name = cmd_output('git', 'symbolic-ref', 'HEAD') | |
| except CalledProcessError: | |
| return False | |
| chunks = ref_name.strip().split('/') | |
| branch_name = '/'.join(chunks[2:]) | |
| return branch_name in protected or any( | |
| re.match(p, branch_name) for p in patterns | |
| ) | |
| def main(argv: Optional[Sequence[str]] = None) -> int: | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| '-b', '--branch', action='append', | |
| help='branch to disallow commits to, may be specified multiple times', | |
| ) | |
| parser.add_argument( | |
| '-p', '--pattern', action='append', | |
| help=( | |
| 'regex pattern for branch name to disallow commits to, ' | |
| 'may be specified multiple times' | |
| ), | |
| ) | |
| args = parser.parse_args(argv) | |
| protected = frozenset(args.branch or ('master', 'main')) | |
| patterns = frozenset(args.pattern or ()) | |
| return int(is_on_branch(protected, patterns)) | |
| if __name__ == '__main__': | |
| exit(main()) |