def patch_hook(hook: Hook, *, extra_args: Argv = None, entry: str = None) -> Hook: patched = hook._asdict() if extra_args: patched["args"].extend(extra_args) if entry: patched["entry"] = entry return Hook(**patched)
def test_manifest_hooks(tempdir_factory, store): path = make_repo(tempdir_factory, 'script_hooks_repo') config = make_config_from_repo(path) hook = _get_hook(config, store, 'bash_hook') assert hook == Hook( src=f'file://{path}', prefix=Prefix(mock.ANY), additional_dependencies=[], alias='', always_run=False, args=[], description='', entry='bin/hook.sh', exclude='^$', exclude_types=[], files='', id='bash_hook', language='script', language_version='default', log_file='', minimum_pre_commit_version='0', name='Bash hook', pass_filenames=True, require_serial=False, stages=( 'commit', 'merge-commit', 'prepare-commit-msg', 'commit-msg', 'post-commit', 'manual', 'post-checkout', 'push', ), types=['file'], verbose=False, )
def _cloned_repository_hooks( repo_config: Dict[str, Any], store: Store, root_config: Dict[str, Any], ) -> Tuple[Hook, ...]: repo, rev = repo_config['repo'], repo_config['rev'] manifest_path = os.path.join(store.clone(repo, rev), C.MANIFEST_FILE) by_id = {hook['id']: hook for hook in load_manifest(manifest_path)} for hook in repo_config['hooks']: if hook['id'] not in by_id: logger.error( f'`{hook["id"]}` is not present in repository {repo}. ' f'Typo? Perhaps it is introduced in a newer version? ' f'Often `pre-commit autoupdate` fixes this.', ) exit(1) hook_dcts = [ _hook(by_id[hook['id']], hook, root_config=root_config) for hook in repo_config['hooks'] ] return tuple( Hook.create( repo_config['repo'], Prefix(store.clone(repo, rev, hook['additional_dependencies'])), hook, ) for hook in hook_dcts)
def _non_cloned_repository_hooks( repo_config: Dict[str, Any], store: Store, root_config: Dict[str, Any], ) -> Tuple[Hook, ...]: def _prefix(language_name: str, deps: Sequence[str]) -> Prefix: language = languages[language_name] # pygrep / script / system / docker_image do not have # environments so they work out of the current directory if language.ENVIRONMENT_DIR is None: return Prefix(os.getcwd()) else: return Prefix(store.make_local(deps)) return tuple( Hook.create( repo_config['repo'], _prefix(hook['language'], hook['additional_dependencies']), _hook(hook, root_config=root_config), ) for hook in repo_config['hooks'])