support custom core.hooksPath

This commit is contained in:
uri 2021-08-28 01:35:03 +03:00
parent 40e21bb8ba
commit 1c8fe57b66
3 changed files with 37 additions and 11 deletions

View file

@ -39,9 +39,15 @@ SYS_EXE = os.path.basename(os.path.realpath(sys.executable))
def _hook_paths( def _hook_paths(
hook_type: str, hook_type: str,
git_dir: Optional[str] = None, git_dir: Optional[str] = None,
core_hookspath: str = '',
) -> Tuple[str, str]: ) -> Tuple[str, str]:
git_dir = git_dir if git_dir is not None else git.get_git_dir() if core_hookspath:
pth = os.path.join(git_dir, 'hooks', hook_type) pth = os.path.join(core_hookspath, hook_type)
else:
git_dir = git_dir if git_dir is not None else git.get_git_dir()
pth = os.path.join(git_dir, 'hooks', hook_type)
return pth, f'{pth}.legacy' return pth, f'{pth}.legacy'
@ -79,8 +85,13 @@ def _install_hook_script(
overwrite: bool = False, overwrite: bool = False,
skip_on_missing_config: bool = False, skip_on_missing_config: bool = False,
git_dir: Optional[str] = None, git_dir: Optional[str] = None,
core_hookspath: str = '',
) -> None: ) -> None:
hook_path, legacy_path = _hook_paths(hook_type, git_dir=git_dir) hook_path, legacy_path = _hook_paths(
hook_type,
git_dir=git_dir,
core_hookspath=core_hookspath,
)
os.makedirs(os.path.dirname(hook_path), exist_ok=True) os.makedirs(os.path.dirname(hook_path), exist_ok=True)
@ -126,14 +137,18 @@ def install(
overwrite: bool = False, overwrite: bool = False,
hooks: bool = False, hooks: bool = False,
skip_on_missing_config: bool = False, skip_on_missing_config: bool = False,
follow_hooks_path: bool = False,
git_dir: Optional[str] = None, git_dir: Optional[str] = None,
) -> int: ) -> int:
if git_dir is None and git.has_core_hookpaths_set(): core_hookspaths_set, core_hookspath = \
logger.error( git.has_core_hookpaths_set()
'Cowardly refusing to install hooks with `core.hooksPath` set.\n' if git_dir is None and core_hookspaths_set:
'hint: `git config --unset-all core.hooksPath`', if not follow_hooks_path:
) logger.error(
return 1 'Cowardly refusing to install hooks with `core.hooksPath` set.'
'\nhint: `git config --unset-all core.hooksPath`',
)
return 1
for hook_type in hook_types: for hook_type in hook_types:
_install_hook_script( _install_hook_script(
@ -141,6 +156,7 @@ def install(
overwrite=overwrite, overwrite=overwrite,
skip_on_missing_config=skip_on_missing_config, skip_on_missing_config=skip_on_missing_config,
git_dir=git_dir, git_dir=git_dir,
core_hookspath=core_hookspath,
) )
if hooks: if hooks:

View file

@ -6,6 +6,7 @@ from typing import List
from typing import MutableMapping from typing import MutableMapping
from typing import Optional from typing import Optional
from typing import Set from typing import Set
from typing import Tuple
from pre_commit.errors import FatalError from pre_commit.errors import FatalError
from pre_commit.util import CalledProcessError from pre_commit.util import CalledProcessError
@ -176,9 +177,9 @@ def has_diff(*args: str, repo: str = '.') -> bool:
return cmd_output_b(*cmd, cwd=repo, retcode=None)[0] == 1 return cmd_output_b(*cmd, cwd=repo, retcode=None)[0] == 1
def has_core_hookpaths_set() -> bool: def has_core_hookpaths_set() -> Tuple[bool, str]:
_, out, _ = cmd_output_b('git', 'config', 'core.hooksPath', retcode=None) _, out, _ = cmd_output_b('git', 'config', 'core.hooksPath', retcode=None)
return bool(out.strip()) return bool(out.strip()), out.strip().decode()
def init_repo(path: str, remote: str) -> None: def init_repo(path: str, remote: str) -> None:

View file

@ -267,6 +267,14 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
), ),
) )
install_parser.add_argument(
'--follow-custom-hooks-path', action='store_true', default=False,
help=(
'Whether to follow a custom core.hooksPath when attempting '
'to install the pre-comit hook.'
),
)
install_hooks_parser = subparsers.add_parser( install_hooks_parser = subparsers.add_parser(
'install-hooks', 'install-hooks',
help=( help=(
@ -373,6 +381,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
overwrite=args.overwrite, overwrite=args.overwrite,
hooks=args.install_hooks, hooks=args.install_hooks,
skip_on_missing_config=args.allow_missing_config, skip_on_missing_config=args.allow_missing_config,
follow_hooks_path=args.follow_custom_hooks_path,
) )
elif args.command == 'init-templatedir': elif args.command == 'init-templatedir':
return init_templatedir( return init_templatedir(