From f679983012e4947bfa2cfbf0aa74c1df9452f5ee Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 3 Mar 2018 14:42:20 -0800 Subject: [PATCH] Refuse to install with core.hooksPath set --- pre_commit/commands/install_uninstall.py | 11 +++++++++++ tests/commands/install_uninstall_test.py | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/pre_commit/commands/install_uninstall.py b/pre_commit/commands/install_uninstall.py index 83b97cb1..91912226 100644 --- a/pre_commit/commands/install_uninstall.py +++ b/pre_commit/commands/install_uninstall.py @@ -2,15 +2,19 @@ from __future__ import print_function from __future__ import unicode_literals import io +import logging import os.path import sys from pre_commit import output +from pre_commit.util import cmd_output from pre_commit.util import make_executable from pre_commit.util import mkdirp from pre_commit.util import resource_filename +logger = logging.getLogger(__name__) + # This is used to identify the hook file we install PRIOR_HASHES = ( '4d9958c90bc262f47553e2c073f14cfe', @@ -36,6 +40,13 @@ def install( skip_on_missing_conf=False, ): """Install the pre-commit hooks.""" + if cmd_output('git', 'config', 'core.hooksPath', retcode=None)[1].strip(): + logger.error( + 'Cowardly refusing to install hooks with `core.hooksPath` set.\n' + 'hint: `git config --unset-all core.hooksPath`', + ) + return 1 + hook_path = runner.get_hook_path(hook_type) legacy_path = hook_path + '.legacy' diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py index a49a3e4f..f83708ea 100644 --- a/tests/commands/install_uninstall_test.py +++ b/tests/commands/install_uninstall_test.py @@ -66,6 +66,14 @@ def test_install_hooks_directory_not_present(tempdir_factory): assert os.path.exists(runner.pre_commit_path) +def test_install_refuses_core_hookspath(tempdir_factory): + path = git_dir(tempdir_factory) + with cwd(path): + cmd_output('git', 'config', '--local', 'core.hooksPath', 'hooks') + runner = Runner(path, C.CONFIG_FILE) + assert install(runner) + + @xfailif_no_symlink def test_install_hooks_dead_symlink( tempdir_factory,