Add a new hook to forbid new submodules
diff --git a/get-git-lfs.py b/get-git-lfs.py index f71b5e2..4897a56 100755 --- a/get-git-lfs.py +++ b/get-git-lfs.py
@@ -34,5 +34,6 @@ shutil.copyfileobj(src_file, dest_file) os.chmod(DEST_PATH, 0o755) + if __name__ == '__main__': exit(main())
diff --git a/pre_commit_hooks/check_added_large_files.py b/pre_commit_hooks/check_added_large_files.py index 03e88b8..b65c32a 100644 --- a/pre_commit_hooks/check_added_large_files.py +++ b/pre_commit_hooks/check_added_large_files.py
@@ -6,7 +6,6 @@ import argparse import math import os -import sys from pre_commit_hooks.util import added_files from pre_commit_hooks.util import CalledProcessError @@ -49,8 +48,6 @@ def main(argv=None): - argv = argv if argv is not None else sys.argv[1:] - parser = argparse.ArgumentParser() parser.add_argument( 'filenames', nargs='*',
diff --git a/pre_commit_hooks/check_merge_conflict.py b/pre_commit_hooks/check_merge_conflict.py index 4a98843..d986998 100644 --- a/pre_commit_hooks/check_merge_conflict.py +++ b/pre_commit_hooks/check_merge_conflict.py
@@ -2,7 +2,6 @@ import argparse import os.path -import sys CONFLICT_PATTERNS = [ b'<<<<<<< ', @@ -41,5 +40,6 @@ return retcode + if __name__ == '__main__': - sys.exit(detect_merge_conflict()) + exit(detect_merge_conflict())
diff --git a/pre_commit_hooks/detect_aws_credentials.py b/pre_commit_hooks/detect_aws_credentials.py index 4c51546..9dda217 100644 --- a/pre_commit_hooks/detect_aws_credentials.py +++ b/pre_commit_hooks/detect_aws_credentials.py
@@ -67,5 +67,6 @@ else: return 0 + if __name__ == '__main__': exit(main())
diff --git a/pre_commit_hooks/fix_encoding_pragma.py b/pre_commit_hooks/fix_encoding_pragma.py index 5dcff93..3bf234e 100644 --- a/pre_commit_hooks/fix_encoding_pragma.py +++ b/pre_commit_hooks/fix_encoding_pragma.py
@@ -138,5 +138,6 @@ return retv + if __name__ == "__main__": exit(main())
diff --git a/pre_commit_hooks/forbid_new_submodules.py b/pre_commit_hooks/forbid_new_submodules.py new file mode 100644 index 0000000..19f85d0 --- /dev/null +++ b/pre_commit_hooks/forbid_new_submodules.py
@@ -0,0 +1,31 @@ +from __future__ import absolute_import +from __future__ import unicode_literals + +from pre_commit_hooks.util import cmd_output + + +def main(argv=None): + # `argv` is ignored, pre-commit will send us a list of files that we + # don't care about + added_diff = cmd_output( + 'git', 'diff', '--staged', '--diff-filter=A', '--raw', + ) + retv = 0 + for line in added_diff.splitlines(): + metadata, filename = line.split('\t', 1) + new_mode = metadata.split(' ')[1] + if new_mode == '160000': + print('{}: new submodule introduced'.format(filename)) + retv = 1 + + if retv: + 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__': + exit(main())
diff --git a/tests/forbid_new_submodules_test.py b/tests/forbid_new_submodules_test.py new file mode 100644 index 0000000..1750e00 --- /dev/null +++ b/tests/forbid_new_submodules_test.py
@@ -0,0 +1,39 @@ +from __future__ import absolute_import + +import pytest +from pre_commit.util import cmd_output + +from pre_commit_hooks.forbid_new_submodules import main + + +@pytest.yield_fixture +def git_dir_with_git_dir(tmpdir): + with tmpdir.as_cwd(): + cmd_output('git', 'init', '.') + cmd_output('git', 'commit', '-m', 'init', '--allow-empty') + cmd_output('git', 'init', 'foo') + with tmpdir.join('foo').as_cwd(): + cmd_output('git', 'commit', '-m', 'init', '--allow-empty') + yield + + +@pytest.mark.parametrize( + 'cmd', + ( + # Actually add the submodule + ('git', 'submodule', 'add', './foo'), + # Sneaky submodule add (that doesn't show up in .gitmodules) + ('git', 'add', 'foo'), + ), +) +def test_main_new_submodule(git_dir_with_git_dir, capsys, cmd): + cmd_output(*cmd) + assert main() == 1 + out, _ = capsys.readouterr() + assert out.startswith('foo: new submodule introduced\n') + + +def test_main_no_new_submodule(git_dir_with_git_dir): + open('test.py', 'a+').close() + cmd_output('git', 'add', 'test.py') + assert main() == 0