mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
Add a --tags-only option to autoupdate
This commit is contained in:
parent
209dc07b31
commit
52cd42316c
3 changed files with 44 additions and 20 deletions
|
|
@ -21,7 +21,7 @@ class RepositoryCannotBeUpdatedError(RuntimeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def _update_repository(repo_config, runner):
|
def _update_repo(repo_config, runner, tags_only):
|
||||||
"""Updates a repository to the tip of `master`. If the repository cannot
|
"""Updates a repository to the tip of `master`. If the repository cannot
|
||||||
be updated because a hook that is configured does not exist in `master`,
|
be updated because a hook that is configured does not exist in `master`,
|
||||||
this raises a RepositoryCannotBeUpdatedError
|
this raises a RepositoryCannotBeUpdatedError
|
||||||
|
|
@ -33,10 +33,13 @@ def _update_repository(repo_config, runner):
|
||||||
|
|
||||||
with cwd(repo.repo_path_getter.repo_path):
|
with cwd(repo.repo_path_getter.repo_path):
|
||||||
cmd_output('git', 'fetch')
|
cmd_output('git', 'fetch')
|
||||||
|
tag_cmd = ('git', 'describe', 'origin/master', '--tags')
|
||||||
|
if tags_only:
|
||||||
|
tag_cmd += ('--abbrev=0',)
|
||||||
|
else:
|
||||||
|
tag_cmd += ('--exact',)
|
||||||
try:
|
try:
|
||||||
rev = cmd_output(
|
rev = cmd_output(*tag_cmd)[1].strip()
|
||||||
'git', 'describe', 'origin/master', '--tags', '--exact',
|
|
||||||
)[1].strip()
|
|
||||||
except CalledProcessError:
|
except CalledProcessError:
|
||||||
rev = cmd_output('git', 'rev-parse', 'origin/master')[1].strip()
|
rev = cmd_output('git', 'rev-parse', 'origin/master')[1].strip()
|
||||||
|
|
||||||
|
|
@ -61,7 +64,7 @@ def _update_repository(repo_config, runner):
|
||||||
return new_config
|
return new_config
|
||||||
|
|
||||||
|
|
||||||
def autoupdate(runner):
|
def autoupdate(runner, tags_only):
|
||||||
"""Auto-update the pre-commit config to the latest versions of repos."""
|
"""Auto-update the pre-commit config to the latest versions of repos."""
|
||||||
retv = 0
|
retv = 0
|
||||||
output_configs = []
|
output_configs = []
|
||||||
|
|
@ -78,7 +81,7 @@ def autoupdate(runner):
|
||||||
continue
|
continue
|
||||||
output.write('Updating {}...'.format(repo_config['repo']))
|
output.write('Updating {}...'.format(repo_config['repo']))
|
||||||
try:
|
try:
|
||||||
new_repo_config = _update_repository(repo_config, runner)
|
new_repo_config = _update_repo(repo_config, runner, tags_only)
|
||||||
except RepositoryCannotBeUpdatedError as error:
|
except RepositoryCannotBeUpdatedError as error:
|
||||||
output.write_line(error.args[0])
|
output.write_line(error.args[0])
|
||||||
output_configs.append(repo_config)
|
output_configs.append(repo_config)
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,9 @@ def main(argv=None):
|
||||||
)
|
)
|
||||||
_add_color_option(autoupdate_parser)
|
_add_color_option(autoupdate_parser)
|
||||||
_add_config_option(autoupdate_parser)
|
_add_config_option(autoupdate_parser)
|
||||||
|
autoupdate_parser.add_argument(
|
||||||
|
'--tags-only', action='store_true', help='Update to tags only.',
|
||||||
|
)
|
||||||
|
|
||||||
run_parser = subparsers.add_parser('run', help='Run hooks.')
|
run_parser = subparsers.add_parser('run', help='Run hooks.')
|
||||||
_add_color_option(run_parser)
|
_add_color_option(run_parser)
|
||||||
|
|
@ -190,7 +193,7 @@ def main(argv=None):
|
||||||
elif args.command == 'clean':
|
elif args.command == 'clean':
|
||||||
return clean(runner)
|
return clean(runner)
|
||||||
elif args.command == 'autoupdate':
|
elif args.command == 'autoupdate':
|
||||||
return autoupdate(runner)
|
return autoupdate(runner, args.tags_only)
|
||||||
elif args.command == 'run':
|
elif args.command == 'run':
|
||||||
return run(runner, args)
|
return run(runner, args)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import pytest
|
||||||
|
|
||||||
import pre_commit.constants as C
|
import pre_commit.constants as C
|
||||||
from pre_commit.clientlib.validate_config import load_config
|
from pre_commit.clientlib.validate_config import load_config
|
||||||
from pre_commit.commands.autoupdate import _update_repository
|
from pre_commit.commands.autoupdate import _update_repo
|
||||||
from pre_commit.commands.autoupdate import autoupdate
|
from pre_commit.commands.autoupdate import autoupdate
|
||||||
from pre_commit.commands.autoupdate import RepositoryCannotBeUpdatedError
|
from pre_commit.commands.autoupdate import RepositoryCannotBeUpdatedError
|
||||||
from pre_commit.ordereddict import OrderedDict
|
from pre_commit.ordereddict import OrderedDict
|
||||||
|
|
@ -32,7 +32,7 @@ def up_to_date_repo(tempdir_factory):
|
||||||
def test_up_to_date_repo(up_to_date_repo, runner_with_mocked_store):
|
def test_up_to_date_repo(up_to_date_repo, runner_with_mocked_store):
|
||||||
config = make_config_from_repo(up_to_date_repo)
|
config = make_config_from_repo(up_to_date_repo)
|
||||||
input_sha = config['sha']
|
input_sha = config['sha']
|
||||||
ret = _update_repository(config, runner_with_mocked_store)
|
ret = _update_repo(config, runner_with_mocked_store, tags_only=False)
|
||||||
assert ret['sha'] == input_sha
|
assert ret['sha'] == input_sha
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -45,8 +45,7 @@ def test_autoupdate_up_to_date_repo(
|
||||||
|
|
||||||
before = open(C.CONFIG_FILE).read()
|
before = open(C.CONFIG_FILE).read()
|
||||||
assert '^$' not in before
|
assert '^$' not in before
|
||||||
runner = Runner('.', C.CONFIG_FILE)
|
ret = autoupdate(Runner('.', C.CONFIG_FILE), tags_only=False)
|
||||||
ret = autoupdate(runner)
|
|
||||||
after = open(C.CONFIG_FILE).read()
|
after = open(C.CONFIG_FILE).read()
|
||||||
assert ret == 0
|
assert ret == 0
|
||||||
assert before == after
|
assert before == after
|
||||||
|
|
@ -71,7 +70,7 @@ def test_out_of_date_repo(out_of_date_repo, runner_with_mocked_store):
|
||||||
config = make_config_from_repo(
|
config = make_config_from_repo(
|
||||||
out_of_date_repo.path, sha=out_of_date_repo.original_sha,
|
out_of_date_repo.path, sha=out_of_date_repo.original_sha,
|
||||||
)
|
)
|
||||||
ret = _update_repository(config, runner_with_mocked_store)
|
ret = _update_repo(config, runner_with_mocked_store, tags_only=False)
|
||||||
assert ret['sha'] != out_of_date_repo.original_sha
|
assert ret['sha'] != out_of_date_repo.original_sha
|
||||||
assert ret['sha'] == out_of_date_repo.head_sha
|
assert ret['sha'] == out_of_date_repo.head_sha
|
||||||
|
|
||||||
|
|
@ -86,8 +85,7 @@ def test_autoupdate_out_of_date_repo(
|
||||||
write_config('.', config)
|
write_config('.', config)
|
||||||
|
|
||||||
before = open(C.CONFIG_FILE).read()
|
before = open(C.CONFIG_FILE).read()
|
||||||
runner = Runner('.', C.CONFIG_FILE)
|
ret = autoupdate(Runner('.', C.CONFIG_FILE), tags_only=False)
|
||||||
ret = autoupdate(runner)
|
|
||||||
after = open(C.CONFIG_FILE).read()
|
after = open(C.CONFIG_FILE).read()
|
||||||
assert ret == 0
|
assert ret == 0
|
||||||
assert before != after
|
assert before != after
|
||||||
|
|
@ -111,7 +109,28 @@ def test_autoupdate_tagged_repo(
|
||||||
)
|
)
|
||||||
write_config('.', config)
|
write_config('.', config)
|
||||||
|
|
||||||
ret = autoupdate(Runner('.', C.CONFIG_FILE))
|
ret = autoupdate(Runner('.', C.CONFIG_FILE), tags_only=False)
|
||||||
|
assert ret == 0
|
||||||
|
assert 'v1.2.3' in open(C.CONFIG_FILE).read()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.yield_fixture
|
||||||
|
def tagged_repo_with_more_commits(tagged_repo):
|
||||||
|
with cwd(tagged_repo.path):
|
||||||
|
cmd_output('git', 'commit', '--allow-empty', '-m', 'commit!')
|
||||||
|
yield tagged_repo
|
||||||
|
|
||||||
|
|
||||||
|
def test_autoupdate_tags_only(
|
||||||
|
tagged_repo_with_more_commits, in_tmpdir, mock_out_store_directory,
|
||||||
|
):
|
||||||
|
config = make_config_from_repo(
|
||||||
|
tagged_repo_with_more_commits.path,
|
||||||
|
sha=tagged_repo_with_more_commits.original_sha,
|
||||||
|
)
|
||||||
|
write_config('.', config)
|
||||||
|
|
||||||
|
ret = autoupdate(Runner('.', C.CONFIG_FILE), tags_only=True)
|
||||||
assert ret == 0
|
assert ret == 0
|
||||||
assert 'v1.2.3' in open(C.CONFIG_FILE).read()
|
assert 'v1.2.3' in open(C.CONFIG_FILE).read()
|
||||||
|
|
||||||
|
|
@ -141,7 +160,7 @@ def test_hook_disppearing_repo_raises(
|
||||||
hooks=[OrderedDict((('id', 'foo'),))],
|
hooks=[OrderedDict((('id', 'foo'),))],
|
||||||
)
|
)
|
||||||
with pytest.raises(RepositoryCannotBeUpdatedError):
|
with pytest.raises(RepositoryCannotBeUpdatedError):
|
||||||
_update_repository(config, runner_with_mocked_store)
|
_update_repo(config, runner_with_mocked_store, tags_only=False)
|
||||||
|
|
||||||
|
|
||||||
def test_autoupdate_hook_disappearing_repo(
|
def test_autoupdate_hook_disappearing_repo(
|
||||||
|
|
@ -156,8 +175,7 @@ def test_autoupdate_hook_disappearing_repo(
|
||||||
write_config('.', config)
|
write_config('.', config)
|
||||||
|
|
||||||
before = open(C.CONFIG_FILE).read()
|
before = open(C.CONFIG_FILE).read()
|
||||||
runner = Runner('.', C.CONFIG_FILE)
|
ret = autoupdate(Runner('.', C.CONFIG_FILE), tags_only=False)
|
||||||
ret = autoupdate(runner)
|
|
||||||
after = open(C.CONFIG_FILE).read()
|
after = open(C.CONFIG_FILE).read()
|
||||||
assert ret == 1
|
assert ret == 1
|
||||||
assert before == after
|
assert before == after
|
||||||
|
|
@ -168,7 +186,7 @@ def test_autoupdate_local_hooks(tempdir_factory):
|
||||||
config = config_with_local_hooks()
|
config = config_with_local_hooks()
|
||||||
path = add_config_to_repo(git_path, config)
|
path = add_config_to_repo(git_path, config)
|
||||||
runner = Runner(path, C.CONFIG_FILE)
|
runner = Runner(path, C.CONFIG_FILE)
|
||||||
assert autoupdate(runner) == 0
|
assert autoupdate(runner, tags_only=False) == 0
|
||||||
new_config_writen = load_config(runner.config_file_path)
|
new_config_writen = load_config(runner.config_file_path)
|
||||||
assert len(new_config_writen) == 1
|
assert len(new_config_writen) == 1
|
||||||
assert new_config_writen[0] == config
|
assert new_config_writen[0] == config
|
||||||
|
|
@ -184,7 +202,7 @@ def test_autoupdate_local_hooks_with_out_of_date_repo(
|
||||||
config = [local_config, stale_config]
|
config = [local_config, stale_config]
|
||||||
write_config('.', config)
|
write_config('.', config)
|
||||||
runner = Runner('.', C.CONFIG_FILE)
|
runner = Runner('.', C.CONFIG_FILE)
|
||||||
assert autoupdate(runner) == 0
|
assert autoupdate(runner, tags_only=False) == 0
|
||||||
new_config_writen = load_config(runner.config_file_path)
|
new_config_writen = load_config(runner.config_file_path)
|
||||||
assert len(new_config_writen) == 2
|
assert len(new_config_writen) == 2
|
||||||
assert new_config_writen[0] == local_config
|
assert new_config_writen[0] == local_config
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue