Implement fail_fast.

This commit is contained in:
Anthony Sottile
2017-09-08 13:19:00 -07:00
parent 94dde26603
commit 898a3ea1bb
4 changed files with 25 additions and 3 deletions

View File

@@ -130,6 +130,7 @@ CONFIG_SCHEMA = schema.Map(
'Config', None,
schema.RequiredRecurse('repos', schema.Array(CONFIG_REPO_DICT)),
schema.Optional('fail_fast', schema.check_bool, False),
)

View File

@@ -169,13 +169,15 @@ def _compute_cols(hooks, verbose):
return max(cols, 80)
def _run_hooks(repo_hooks, args, environ):
def _run_hooks(config, repo_hooks, args, environ):
"""Actually run the hooks."""
skips = _get_skips(environ)
cols = _compute_cols([hook for _, hook in repo_hooks], args.verbose)
retval = 0
for repo, hook in repo_hooks:
retval |= _run_single_hook(hook, repo, args, skips, cols)
if retval and config['fail_fast']:
break
if (
retval and
args.show_diff_on_failure and
@@ -251,4 +253,4 @@ def run(runner, args, environ=os.environ):
if not hook['stages'] or args.hook_stage in hook['stages']
]
return _run_hooks(repo_hooks, args, environ)
return _run_hooks(runner.config, repo_hooks, args, environ)

View File

@@ -37,10 +37,14 @@ class Runner(object):
def config_file_path(self):
return os.path.join(self.git_root, self.config_file)
@cached_property
def config(self):
return load_config(self.config_file_path)
@cached_property
def repositories(self):
"""Returns a tuple of the configured repositories."""
repos = load_config(self.config_file_path)['repos']
repos = self.config['repos']
repos = tuple(Repository.create(x, self.store) for x in repos)
for repo in repos:
repo.require_installed()

View File

@@ -729,3 +729,18 @@ def test_pass_filenames(
)
assert expected_out + b'\nHello World' in printed
assert (b'foo.py' in printed) == pass_filenames
def test_fail_fast(
cap_out, repo_with_failing_hook, mock_out_store_directory,
):
with cwd(repo_with_failing_hook):
with modify_config() as config:
# More than one hook
config['fail_fast'] = True
config['repos'][0]['hooks'] *= 2
stage_a_file()
ret, printed = _do_run(cap_out, repo_with_failing_hook, _get_opts())
# it should have only run one hook
assert printed.count(b'Failing hook') == 1