From 12a7075fda885a7c241aa137238681f2a9d7211f Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 10 Apr 2021 00:37:59 -0700 Subject: [PATCH] skip installation for SKIP'd hooks --- pre_commit/commands/run.py | 8 +++++--- tests/commands/run_test.py | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index 05c3268e3..0fef50d1c 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -271,11 +271,11 @@ def _get_diff() -> bytes: def _run_hooks( config: Dict[str, Any], hooks: Sequence[Hook], + skips: Set[str], args: argparse.Namespace, environ: MutableMapping[str, str], ) -> int: """Actually run the hooks.""" - skips = _get_skips(environ) cols = _compute_cols(hooks) classifier = Classifier.from_config( _all_filenames(args), config['files'], config['exclude'], @@ -403,9 +403,11 @@ def run( ) return 1 - install_hook_envs(hooks, store) + skips = _get_skips(environ) + to_install = [hook for hook in hooks if hook.id not in skips] + install_hook_envs(to_install, store) - return _run_hooks(config, hooks, args, environ) + return _run_hooks(config, hooks, skips, args, environ) # https://github.com/python/mypy/issues/7726 raise AssertionError('unreachable') diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index 4cd70fd43..8dcb5796b 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -600,6 +600,29 @@ def test_skip_aliased_hook(cap_out, store, aliased_repo): assert printed.count(msg) == 1 +def test_skip_bypasses_installation(cap_out, store, repo_with_passing_hook): + config = { + 'repo': 'local', + 'hooks': [ + { + 'id': 'skipme', + 'name': 'skipme', + 'entry': 'skipme', + 'language': 'python', + 'additional_dependencies': ['/pre-commit-does-not-exist'], + }, + ], + } + add_config_to_repo(repo_with_passing_hook, config) + + ret, printed = _do_run( + cap_out, store, repo_with_passing_hook, + run_opts(all_files=True), + {'SKIP': 'skipme'}, + ) + assert ret == 0 + + def test_hook_id_not_in_non_verbose_output( cap_out, store, repo_with_passing_hook, ):