from __future__ import annotations import argparse import os from collections.abc import Sequence from pre_commit_hooks.util import cmd_output def main(argv: Sequence[str] | None = None) -> int: parser = argparse.ArgumentParser() parser.add_argument('filenames', nargs='*') args = parser.parse_args(argv) if ( 'PRE_COMMIT_FROM_REF' in os.environ and 'PRE_COMMIT_TO_REF' in os.environ ): diff_arg = '...'.join(( os.environ['PRE_COMMIT_FROM_REF'], os.environ['PRE_COMMIT_TO_REF'], )) else: diff_arg = '--staged' added_diff = cmd_output( 'git', 'diff', '--diff-filter=A', '--raw', diff_arg, '--', *args.filenames, ) retv = 0 for line in added_diff.splitlines(): metadata, filename = line.split('\t', 1) new_mode = metadata.split(' ')[1] if new_mode == '160000': print(f'{filename}: new submodule introduced') retv = 1 if retv: print() print('This commit introduces new submodules.') print('Did you unintentionally `git add .`?') print('To fix: git rm {thesubmodule} # no trailing slash') print('Also check .gitmodules') return retv if __name__ == '__main__': raise SystemExit(main())