diff --git a/pre_commit/commands/autoupdate.py b/pre_commit/commands/autoupdate.py index ca0ed5e2..ca8f9bb1 100644 --- a/pre_commit/commands/autoupdate.py +++ b/pre_commit/commands/autoupdate.py @@ -106,7 +106,7 @@ def _write_new_config_file(path, output): f.write(to_write) -def autoupdate(runner, tags_only): +def autoupdate(runner, tags_only, repo=None): """Auto-update the pre-commit config to the latest versions of repos.""" migrate_config(runner, quiet=True) retv = 0 @@ -116,6 +116,10 @@ def autoupdate(runner, tags_only): input_config = load_config(runner.config_file_path) for repo_config in input_config['repos']: + # Skip any repo_configs that aren't the specified repo + if repo and repo != repo_config['repo']: + continue + if is_local_repo(repo_config) or is_meta_repo(repo_config): output_repos.append(repo_config) continue diff --git a/pre_commit/main.py b/pre_commit/main.py index 1405203c..4c9202ad 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -167,6 +167,9 @@ def main(argv=None): 'tagged version (the default behavior).' ), ) + autoupdate_parser.add_argument( + '--repo', help='Only update this repository.', + ) migrate_config_parser = subparsers.add_parser( 'migrate-config', @@ -245,7 +248,11 @@ def main(argv=None): elif args.command == 'autoupdate': if args.tags_only: logger.warning('--tags-only is the default') - return autoupdate(runner, tags_only=not args.bleeding_edge) + return autoupdate( + runner, + tags_only=not args.bleeding_edge, + repo=args.repo, + ) elif args.command == 'migrate-config': return migrate_config(runner) elif args.command == 'run': diff --git a/tests/commands/autoupdate_test.py b/tests/commands/autoupdate_test.py index 7119c6be..c78af1fb 100644 --- a/tests/commands/autoupdate_test.py +++ b/tests/commands/autoupdate_test.py @@ -124,6 +124,43 @@ def test_autoupdate_out_of_date_repo( assert out_of_date_repo.head_sha in after +def test_autoupdate_out_of_date_repo_with_correct_repo_name( + out_of_date_repo, in_tmpdir, mock_out_store_directory, +): + # Write out the config + config = make_config_from_repo( + out_of_date_repo.path, sha=out_of_date_repo.original_sha, check=False, + ) + write_config('.', config) + + runner = Runner('.', C.CONFIG_FILE) + before = open(C.CONFIG_FILE).read() + repo_name = 'file://{}'.format(out_of_date_repo.path) + ret = autoupdate(runner, tags_only=False, repo=repo_name) + after = open(C.CONFIG_FILE).read() + assert ret == 0 + assert before != after + assert out_of_date_repo.head_sha in after + + +def test_autoupdate_out_of_date_repo_with_wrong_repo_name( + out_of_date_repo, in_tmpdir, mock_out_store_directory, +): + # Write out the config + config = make_config_from_repo( + out_of_date_repo.path, sha=out_of_date_repo.original_sha, check=False, + ) + write_config('.', config) + + runner = Runner('.', C.CONFIG_FILE) + before = open(C.CONFIG_FILE).read() + # It will not update it, because the name doesn't match + ret = autoupdate(runner, tags_only=False, repo='wrong_repo_name') + after = open(C.CONFIG_FILE).read() + assert ret == 0 + assert before == after + + def test_does_not_reformat( out_of_date_repo, mock_out_store_directory, in_tmpdir, ):