@@ -197,12 +197,6 @@ def _run_hooks(config, repo_hooks, args, environ):
197197 return retval
198198
199199
200- def get_repo_hooks (runner ):
201- for repo in runner .repositories :
202- for _ , hook in repo .hooks :
203- yield (repo , hook )
204-
205-
206200def _has_unmerged_paths ():
207201 _ , stdout , _ = cmd_output ('git' , 'ls-files' , '--unmerged' )
208202 return bool (stdout .strip ())
@@ -245,21 +239,20 @@ def run(runner, args, environ=os.environ):
245239 ctx = staged_files_only (runner .store .directory )
246240
247241 with ctx :
248- repo_hooks = list (get_repo_hooks (runner ))
249-
250- if args .hook :
251- repo_hooks = [
252- (repo , hook ) for repo , hook in repo_hooks
253- if hook ['id' ] == args .hook
254- ]
255- if not repo_hooks :
256- output .write_line ('No hook with id `{}`' .format (args .hook ))
257- return 1
258-
259- # Filter hooks for stages
260- repo_hooks = [
261- (repo , hook ) for repo , hook in repo_hooks
262- if not hook ['stages' ] or args .hook_stage in hook ['stages' ]
263- ]
242+ repo_hooks = []
243+ for repo in runner .repositories :
244+ for _ , hook in repo .hooks :
245+ if (
246+ (not args .hook or hook ['id' ] == args .hook ) and
247+ not hook ['stages' ] or args .hook_stage in hook ['stages' ]
248+ ):
249+ repo_hooks .append ((repo , hook ))
250+
251+ if args .hook and not repo_hooks :
252+ output .write_line ('No hook with id `{}`' .format (args .hook ))
253+ return 1
254+
255+ for repo in {repo for repo , _ in repo_hooks }:
256+ repo .require_installed ()
264257
265258 return _run_hooks (runner .config , repo_hooks , args , environ )
0 commit comments