diff --git a/pre_commit_mirror_maker/docker_image/.pre-commit-hooks.yaml b/pre_commit_mirror_maker/docker_image/.pre-commit-hooks.yaml new file mode 100644 index 0000000..cfeba7a --- /dev/null +++ b/pre_commit_mirror_maker/docker_image/.pre-commit-hooks.yaml @@ -0,0 +1,10 @@ +- id: {id} + name: {name} + description: {description!r} + entry: '{entry}:{version}' + language: {language} + '{match_key}': {match_val} + args: {args} + require_serial: {require_serial} + additional_dependencies: {additional_dependencies} + minimum_pre_commit_version: {minimum_pre_commit_version!r} diff --git a/pre_commit_mirror_maker/languages.py b/pre_commit_mirror_maker/languages.py index ae86d2b..5eba6c5 100644 --- a/pre_commit_mirror_maker/languages.py +++ b/pre_commit_mirror_maker/languages.py @@ -33,6 +33,30 @@ def rust_get_package_versions(package_name: str) -> list[str]: return list(reversed([version['num'] for version in resp['versions']])) +def docker_image_get_package_versions(package_name: str) -> list[str]: + # If package_name contains a slash, it's a user/org repository, + # otherwise it's an official repository + if '/' not in package_name: + package_name = f'library/{package_name}' + base_url = ( + 'https://hub.docker.com/v2/repositories/' + f'{package_name}/tags?page_size=100' + ) + + all_tags: list[str] = [] + url = base_url + + # Fetch all pages of results + while url: + resp = json.load(urllib.request.urlopen(url)) + # Add tags from the current page + all_tags.extend(tag['name'] for tag in resp['results']) + # Get URL for next page, if any + url = resp.get('next') + + return list(reversed(all_tags)) + + def node_get_additional_dependencies( package_name: str, package_version: str, ) -> list[str]: @@ -46,6 +70,7 @@ def rust_get_additional_dependencies( LIST_VERSIONS = { + 'docker_image': docker_image_get_package_versions, 'node': node_get_package_versions, 'python': python_get_package_versions, 'ruby': ruby_get_package_versions, diff --git a/pre_commit_mirror_maker/make_repo.py b/pre_commit_mirror_maker/make_repo.py index 32b4fa4..d71fea0 100644 --- a/pre_commit_mirror_maker/make_repo.py +++ b/pre_commit_mirror_maker/make_repo.py @@ -68,7 +68,7 @@ def git(*cmd: str) -> None: # Commit and tag git('add', '.') git('commit', '-m', f'Mirror: {version}') - git('tag', f'v{version}') + git('tag', f'v{version}' if language != 'docker_image' else version) def make_repo(repo: str, *, language: str, name: str, **fmt_vars: str) -> None: diff --git a/setup.cfg b/setup.cfg index 2151d88..2a70fd7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,6 +35,7 @@ console_scripts = pre_commit_mirror_maker = all/.pre-commit-hooks.yaml all/.version + docker_image/.pre-commit-hooks.yaml node/.npmignore node/* python/* diff --git a/tests/languages_test.py b/tests/languages_test.py index 07c59d8..d94acdb 100644 --- a/tests/languages_test.py +++ b/tests/languages_test.py @@ -1,5 +1,6 @@ from __future__ import annotations +from pre_commit_mirror_maker.languages import docker_image_get_package_versions from pre_commit_mirror_maker.languages import node_get_package_versions from pre_commit_mirror_maker.languages import python_get_package_versions from pre_commit_mirror_maker.languages import ruby_get_package_versions @@ -39,3 +40,9 @@ def test_rust_get_package_version_output(): ret = rust_get_package_versions('clap') assert ret assert_all_text(ret) + + +def test_docker_image_get_package_version_output(): + ret = docker_image_get_package_versions('alpine/flake8') + assert ret + assert_all_text(ret) diff --git a/tests/make_repo_test.py b/tests/make_repo_test.py index e874ef6..4fe236a 100644 --- a/tests/make_repo_test.py +++ b/tests/make_repo_test.py @@ -236,3 +236,43 @@ def test_rust_integration(in_git_dir): assert _cmd('git', 'log', '--oneline') # TODO: test that the package is installable + + +def test_docker_image_integration(in_git_dir): + make_repo( + '.', + language='docker_image', name='alpine/flake8', description='', + entry='alpine/flake8', id='flake8-docker', match_key='files', + match_val=r'\.py$', args='[]', require_serial='false', + minimum_pre_commit_version='0', + ) + # Our files should exist + assert in_git_dir.join('.version').exists() + assert in_git_dir.join('.pre-commit-hooks.yaml').exists() + + # Should have made _some_ tags + assert _cmd('git', 'tag', '-l') + # Should have made _some_ commits + assert _cmd('git', 'log', '--oneline') + + # TODO: test that the package is installable + + +def test_docker_image_integration_official_repo(in_git_dir): + make_repo( + '.', + language='docker_image', name='python', description='', + entry='python', id='python-docker', match_key='files', + match_val=r'\.py$', args='[]', require_serial='false', + minimum_pre_commit_version='0', + ) + # Our files should exist + assert in_git_dir.join('.version').exists() + assert in_git_dir.join('.pre-commit-hooks.yaml').exists() + + # Should have made _some_ tags + assert _cmd('git', 'tag', '-l') + # Should have made _some_ commits + assert _cmd('git', 'log', '--oneline') + + # TODO: test that the package is installable