From ff66c20c6e8c5c7ad5be5e6ebe4d1b9990510803 Mon Sep 17 00:00:00 2001 From: Zander Hill Date: Thu, 3 May 2018 12:08:34 +0100 Subject: [PATCH] Fix `types` bug by using FrozenSet#intersection Fixes a bug where files are not being recognized based on their `types` using configuration file. In the case of using `types: ['bash', 'sh', 'shell']` in pre-commit-config, those filetypes will not be found, resulting in "no files found" being reported with pre-commit. This persists even when using --all-files flag. Intersection produces predictable results in Python 2.7 and 3.x. --- pre_commit/commands/run.py | 6 ++++-- tests/commands/run_test.py | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index 600b7e2f..a62d0474 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -53,10 +53,12 @@ def _filter_by_types(filenames, exclude_types, get_tags=tags_from_path): types, exclude_types = frozenset(types), frozenset(exclude_types) + valid_types = types - exclude_types + ret = [] for filename in filenames: - tags = get_tags(filename) - if tags >= types and not tags & exclude_types: + tags = frozenset(get_tags(filename)) + if len(valid_types.intersection(tags)) > 0: ret.append(filename) return tuple(ret) diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index f458e10b..e9e66534 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -834,15 +834,16 @@ def test_include_exclude_exclude_removes_files(some_filenames): ret = _filter_by_include_exclude(some_filenames, '', r'\.py$') assert ret == {'.pre-commit-hooks.yaml'} + def get_tags_stub(interpreter): return lambda x: tags_from_interpreter(interpreter) -@pytest.mark.current + def test_filter_by_types_for_bash_by_interpreter(): ret = _filter_by_types(['bash_script'], ['shell', 'sh', 'bash'], [], get_tags=get_tags_stub('bash')) assert ret == ('bash_script',) -@pytest.mark.current + def test_filter_by_types_for_python_by_interpreter(): ret = _filter_by_types(['script.py'], ['python'], [], get_tags=get_tags_stub('python')) assert ret == ('script.py',)