diff --git a/sync_pre_commit_deps.py b/sync_pre_commit_deps.py index b9f1408..0345f42 100644 --- a/sync_pre_commit_deps.py +++ b/sync_pre_commit_deps.py @@ -20,6 +20,23 @@ _SEPS = ('==', '@') _RE_SEP = re.compile(rf'^(.+)({"|".join(_SEPS)})(.+)$') +_RE_FROZEN = re.compile(r'#\s*frozen:\s*(\S+)') + + +def _version(repo: ruamel.yaml.comments.CommentedMap) -> str: + tokens = repo.ca.items.get('rev') or () + for token in tokens: + if token and (match := _RE_FROZEN.search(token.value)): + rev = match.group(1) + break + else: + rev = repo['rev'] + + # `mirrors-mypy` and various node revs have a 'v' prefix, + # so we have to strip that out to get the + # additional_dependency version. + return rev.removeprefix('v') + _ARGUMENT_HELP_TEMPLATE = ( 'The `{}` argument to the YAML dumper. ' @@ -69,11 +86,7 @@ def main(argv: Sequence[str] | None = None) -> int: if repo['repo'] not in ('local', 'meta'): for hook in repo['hooks']: if (dep := SUPPORTED.get(hook['id'])) is not None: - # `mirrors-mypy` and various node revs have a 'v' prefix, - # so we have to strip that out to get the - # additional_dependency version. - cleaned_rev = repo['rev'].removeprefix('v') - versions[dep] = cleaned_rev + versions[dep] = _version(repo) updated = [] for repo in loaded['repos']: diff --git a/tests/sync_pre_commit_deps_test.py b/tests/sync_pre_commit_deps_test.py index f435b52..ab6639b 100644 --- a/tests/sync_pre_commit_deps_test.py +++ b/tests/sync_pre_commit_deps_test.py @@ -228,6 +228,37 @@ def test_main_writes_all(tmpdir): ) +def test_main_frozen_rev_uses_tag_not_sha(tmpdir): + cfg = tmpdir.join('.pre-commit-config.yaml') + cfg.write( + 'repos:\n' + '- repo: https://github.com/biomejs/pre-commit\n' + ' rev: 5bb716344fd6979d991634e7ece88f407e599ee0 # frozen: v2.5.4\n' + ' hooks:\n' + ' - id: biome-check\n' + '- repo: local\n' + ' hooks:\n' + ' - id: biome-migrate\n' + ' additional_dependencies:\n' + ' - "@biomejs/biome@2.4.15"\n', + ) + + assert main((str(cfg),)) + + assert cfg.read() == ( + 'repos:\n' + '- repo: https://github.com/biomejs/pre-commit\n' + ' rev: 5bb716344fd6979d991634e7ece88f407e599ee0 # frozen: v2.5.4\n' + ' hooks:\n' + ' - id: biome-check\n' + '- repo: local\n' + ' hooks:\n' + ' - id: biome-migrate\n' + ' additional_dependencies:\n' + ' - "@biomejs/biome@2.5.4"\n' + ) + + def test_main_no_dep_on_one_and_writes_other(tmpdir): cfg = tmpdir.join('.pre-commit-config.yaml') cfg.write(