repomatic 7.4.0__tar.gz → 7.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {repomatic-7.4.0 → repomatic-7.5.0}/PKG-INFO +17 -6
- {repomatic-7.4.0 → repomatic-7.5.0}/pyproject.toml +13 -10
- {repomatic-7.4.0 → repomatic-7.5.0}/pyproject.toml.orig +22 -11
- {repomatic-7.4.0 → repomatic-7.5.0}/readme.md +15 -4
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/__init__.py +2 -2
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/binaries_page.py +9 -14
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/broken_links.py +6 -20
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/changelog.py +0 -3
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/cli.py +460 -419
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/config.py +183 -15
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/_release-engine.yaml +151 -28
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/action-publish-pypi.yaml +34 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/agent-sphinx-docs.md +28 -12
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/autofix.yaml +153 -106
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/autolock.yaml +11 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/cancel-runs.yaml +13 -1
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/changelog.yaml +65 -21
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/debug.yaml +17 -2
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/docs.yaml +30 -7
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labels.yaml +26 -5
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/lint.yaml +45 -12
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/release.yaml +11 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/ruff.toml +6 -3
- repomatic-7.4.0/repomatic/data/skill-av-false-positive.md → repomatic-7.5.0/repomatic/data/skills/av-false-positive/SKILL.md +2 -3
- repomatic-7.4.0/repomatic/data/skill-awesome-triage.md → repomatic-7.5.0/repomatic/data/skills/awesome-triage/SKILL.md +2 -3
- repomatic-7.4.0/repomatic/data/skill-babysit-ci.md → repomatic-7.5.0/repomatic/data/skills/babysit-ci/SKILL.md +21 -10
- repomatic-7.4.0/repomatic/data/skill-benchmark-update.md → repomatic-7.5.0/repomatic/data/skills/benchmark-update/SKILL.md +2 -3
- repomatic-7.4.0/repomatic/data/skill-brand-assets.md → repomatic-7.5.0/repomatic/data/skills/brand-assets/SKILL.md +1 -1
- repomatic-7.4.0/repomatic/data/skill-file-bug-report.md → repomatic-7.5.0/repomatic/data/skills/file-bug-report/SKILL.md +2 -2
- repomatic-7.4.0/repomatic/data/skill-repomatic-audit.md → repomatic-7.5.0/repomatic/data/skills/repomatic-audit/SKILL.md +2 -2
- repomatic-7.4.0/repomatic/data/skill-repomatic-changelog.md → repomatic-7.5.0/repomatic/data/skills/repomatic-changelog/SKILL.md +7 -5
- repomatic-7.4.0/repomatic/data/skill-repomatic-deps.md → repomatic-7.5.0/repomatic/data/skills/repomatic-deps/SKILL.md +3 -3
- repomatic-7.4.0/repomatic/data/skill-repomatic-init.md → repomatic-7.5.0/repomatic/data/skills/repomatic-init/SKILL.md +3 -3
- repomatic-7.4.0/repomatic/data/skill-repomatic-ship.md → repomatic-7.5.0/repomatic/data/skills/repomatic-ship/SKILL.md +35 -20
- repomatic-7.4.0/repomatic/data/skill-repomatic-topics.md → repomatic-7.5.0/repomatic/data/skills/repomatic-topics/SKILL.md +2 -3
- repomatic-7.4.0/repomatic/data/skill-sphinx-docs-sync.md → repomatic-7.5.0/repomatic/data/skills/sphinx-docs-sync/SKILL.md +2 -3
- repomatic-7.4.0/repomatic/data/skill-translation-sync.md → repomatic-7.5.0/repomatic/data/skills/translation-sync/SKILL.md +2 -3
- repomatic-7.4.0/repomatic/data/skill-upstream-audit.md → repomatic-7.5.0/repomatic/data/skills/upstream-audit/SKILL.md +2 -3
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/tests.yaml +43 -4
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/unsubscribe.yaml +13 -1
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/uv.toml +5 -2
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/dep_sources.py +92 -2
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/docs.py +1 -1
- repomatic-7.5.0/repomatic/frontmatter.py +70 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/gh.py +31 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/issue.py +37 -6
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/pr_body.py +66 -33
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/release_sync.py +16 -16
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/releases.py +69 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/unsubscribe.py +40 -79
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/workflow_sync.py +204 -67
- repomatic-7.5.0/repomatic/humanize.py +63 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/images.py +39 -16
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/init_project.py +228 -91
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/labels.py +50 -11
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/lint_repo.py +61 -127
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/metadata.py +38 -434
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/prepare_release.py +79 -12
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/pypi.py +41 -14
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/registry.py +340 -283
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/setup_guide.py +9 -23
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/sync_ops.py +193 -59
- repomatic-7.4.0/repomatic/templates/prepare-release.md → repomatic-7.5.0/repomatic/templates/prepare-release.md.noformat +3 -7
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-tool-versions.md +1 -1
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/tool_registry.py +276 -40
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/tool_runner.py +186 -8
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/uv.py +38 -9
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/version_sync.py +138 -3
- {repomatic-7.4.0 → repomatic-7.5.0}/license +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/__main__.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/binary.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/bundle.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/cache.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/checksums.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/compat.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/__init__.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/agent-grunt-qa.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/agent-qa-engineer.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/__init__.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/license +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/bumpversion.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/codecov.yaml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labeller-content-based.yaml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labeller-file-based.yaml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labels.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/lychee.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/mdformat.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/mypy.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/pytest.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/typos.toml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/yamllint.yaml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/zizmor.yaml +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/dep_graph.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/dep_report.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/git_ops.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/__init__.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/actions.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/dev_release.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/matrix.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/sponsor.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/status.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/token.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/gitignore.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/http.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/mailmap.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/matrix_axes.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/npm.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/py.typed +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/pyproject.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/__init__.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/available-admonition.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/broken-links-issue.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/bump-version.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/detect-squash-merge.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/development-warning.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/fix-changelog.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/fix-typos.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-images.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-json.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-markdown.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-pyproject.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-python.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-shell.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/generated-footer.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/github-releases.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/immutable-releases.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/refresh-tip.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/release-notes.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/release-sync-report.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-notifications-pat.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-sha-pinning-required.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-token.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-verify.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-action-pins.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-bumpversion.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-dep-sources.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-gitignore.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-mailmap.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-repomatic.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-uv-lock.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-workflow-pins.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/unavailable-admonition.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/update-dep-graph.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/update-docs.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/yanked-admonition.md +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/tool_runner_page.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/virustotal.py +0 -0
- {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/vulnerable_deps.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: repomatic
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.5.0
|
|
4
4
|
Summary: 🏭 Automate repository maintenance, releases, and CI/CD workflows
|
|
5
5
|
Keywords: changelog-formatter,dependabot-alternative,github-actions,github-labels,github-workflow,gitignore,mailmap,mypy,nuitka,python-automation,release-automation,repository-automation,repository-management,reusable-workflows,software-factory,sphinx-doc,typo,uv,workflow-reusable
|
|
6
6
|
Author: Kevin Deldycke
|
|
@@ -59,7 +59,7 @@ Requires-Dist: wcmatch>=10
|
|
|
59
59
|
Requires-Python: >=3.10
|
|
60
60
|
Project-URL: Changelog, https://github.com/kdeldycke/repomatic/blob/main/changelog.md
|
|
61
61
|
Project-URL: Documentation, https://kdeldycke.github.io/repomatic
|
|
62
|
-
Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v7.
|
|
62
|
+
Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v7.5.0
|
|
63
63
|
Project-URL: Funding, https://github.com/sponsors/kdeldycke
|
|
64
64
|
Project-URL: Homepage, https://github.com/kdeldycke/repomatic
|
|
65
65
|
Project-URL: Issues, https://github.com/kdeldycke/repomatic/issues
|
|
@@ -77,7 +77,7 @@ Description-Content-Type: text/markdown
|
|
|
77
77
|
[](https://app.codecov.io/gh/kdeldycke/repomatic)
|
|
78
78
|
[](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
|
|
79
79
|
|
|
80
|
-
A Python CLI and `pyproject.toml` configuration that let you **release Python packages multiple times a day with only 2-clicks**. Designed for `uv`-based Python projects, but usable for other projects too.
|
|
80
|
+
A Python CLI and `pyproject.toml` configuration that let you **release Python packages multiple times a day with only 2-clicks**. Designed for `uv`-based Python projects, but usable for other projects too. Every step is a CLI command: reusable GitHub Actions workflows are only the trigger, so the same automation runs on your machine.
|
|
81
81
|
|
|
82
82
|
**Maintainer-in-the-loop**: nothing is done behind your back. A PR or issue is created every time a change is proposed or action is needed.
|
|
83
83
|
|
|
@@ -99,8 +99,10 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
|
|
|
99
99
|
|
|
100
100
|
## Why repomatic
|
|
101
101
|
|
|
102
|
+
repomatic does for the release process what ruff did for linting and uv did for packaging: replace a stack of single-purpose tools with one.
|
|
103
|
+
|
|
102
104
|
- [18 third-party GitHub Actions replaced](https://kdeldycke.github.io/repomatic/security.html#third-party-action-minimization) by internal CLI commands and SHA-256-verified binary downloads, keeping the supply chain attack surface minimal
|
|
103
|
-
- [
|
|
105
|
+
- [10 Python linters and formatters](https://kdeldycke.github.io/repomatic/security.html#ruff-consolidation) (pylint, pydocstyle, pycln, pyupgrade, isort, black, docformatter, mdformat-black, blacken-docs, mdformat-ruff) consolidated into ruff
|
|
104
106
|
- [5 packaging and install tools](https://kdeldycke.github.io/repomatic/security.html#uv-consolidation) (poetry, build, twine, check-wheel-contents, pip-audit) consolidated into uv
|
|
105
107
|
- All `uses:` references [pinned to full commit SHAs](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) with stabilization windows before adopting new versions, managed entirely by self-hosted sync jobs
|
|
106
108
|
- [SLSA provenance attestations](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) on every release artifact (wheels and compiled binaries)
|
|
@@ -110,7 +112,8 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
|
|
|
110
112
|
- Workflow security linting with [`zizmor`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) on every push to catch dangerous triggers and excessive permissions
|
|
111
113
|
- Credential scanning with [`gitleaks`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) to prevent secret leakage
|
|
112
114
|
- Single [`pyproject.toml` configuration](https://kdeldycke.github.io/repomatic/configuration.html): no extra dotfiles, no JSON configs, no YAML presets to maintain
|
|
113
|
-
- [
|
|
115
|
+
- The CLI itself [ships as standalone binaries](https://kdeldycke.github.io/repomatic/install.html#executables) (Linux / macOS / Windows, x86_64 / arm64): no Python environment needed to run it
|
|
116
|
+
- [15+ code quality tools](https://kdeldycke.github.io/repomatic/tool-runner.html) (ruff, mypy, biome, typos, mdformat, shfmt, yamllint, actionlint, lychee, oxipng, pyproject-fmt, labelmaker, gitleaks, zizmor) managed through one `repomatic run <tool>` interface with automatic installation and platform-specific binary caching
|
|
114
117
|
|
|
115
118
|
## Quick start
|
|
116
119
|
|
|
@@ -124,6 +127,13 @@ $ git push
|
|
|
124
127
|
|
|
125
128
|
Works for new and existing repositories. Managed files are always regenerated to the latest version; `changelog.md` is never overwritten. Push, and the workflows guide you through remaining setup via issues and PRs.
|
|
126
129
|
|
|
130
|
+
The workflows only call CLI commands, so every automated step can also be run and previewed locally:
|
|
131
|
+
|
|
132
|
+
```shell-session
|
|
133
|
+
$ uvx -- repomatic sync-deps --dry-run
|
|
134
|
+
$ uvx -- repomatic run ruff -- check
|
|
135
|
+
```
|
|
136
|
+
|
|
127
137
|
See `repomatic init --help` for available components and options.
|
|
128
138
|
|
|
129
139
|
## Documentation
|
|
@@ -133,10 +143,11 @@ See the **[full documentation](https://kdeldycke.github.io/repomatic/)** for:
|
|
|
133
143
|
- [Installation methods and executables](https://kdeldycke.github.io/repomatic/install.html)
|
|
134
144
|
- [`[tool.repomatic]` configuration reference](https://kdeldycke.github.io/repomatic/configuration.html)
|
|
135
145
|
- [CLI parameters](https://kdeldycke.github.io/repomatic/cli.html)
|
|
136
|
-
- [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all
|
|
146
|
+
- [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all 14 workflows with job descriptions)
|
|
137
147
|
- [Security practices and token setup](https://kdeldycke.github.io/repomatic/security.html)
|
|
138
148
|
- [Claude Code skills](https://kdeldycke.github.io/repomatic/skills.html)
|
|
139
149
|
- [API reference](https://kdeldycke.github.io/repomatic/repomatic.html)
|
|
150
|
+
- [Project history](https://kdeldycke.github.io/repomatic/history.html)
|
|
140
151
|
|
|
141
152
|
## Used in
|
|
142
153
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
2
|
build-backend = "uv_build"
|
|
3
|
-
requires = ["uv-build>=0.
|
|
3
|
+
requires = ["uv-build>=0.8"]
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "repomatic"
|
|
7
|
-
version = "7.
|
|
7
|
+
version = "7.5.0"
|
|
8
8
|
description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
9
9
|
readme = "readme.md"
|
|
10
10
|
keywords = [
|
|
@@ -92,7 +92,7 @@ email = "kevin@deldycke.com"
|
|
|
92
92
|
[project.urls]
|
|
93
93
|
Changelog = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
|
|
94
94
|
Documentation = "https://kdeldycke.github.io/repomatic"
|
|
95
|
-
Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.
|
|
95
|
+
Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.5.0"
|
|
96
96
|
Funding = "https://github.com/sponsors/kdeldycke"
|
|
97
97
|
Homepage = "https://github.com/kdeldycke/repomatic"
|
|
98
98
|
Issues = "https://github.com/kdeldycke/repomatic/issues"
|
|
@@ -119,6 +119,7 @@ docs = [
|
|
|
119
119
|
"sphinx-copybutton>=0.5.2",
|
|
120
120
|
"sphinx-datatables>=1",
|
|
121
121
|
"sphinx-design>=0.6",
|
|
122
|
+
"sphinxcontrib-jquery>=4",
|
|
122
123
|
"sphinxcontrib-mermaid>=1.2.3",
|
|
123
124
|
"sphinxext-opengraph>=0.13",
|
|
124
125
|
]
|
|
@@ -130,15 +131,13 @@ typing = [
|
|
|
130
131
|
]
|
|
131
132
|
|
|
132
133
|
[tool.uv]
|
|
133
|
-
required-version = ">=0.
|
|
134
|
+
required-version = ">=0.11.15"
|
|
134
135
|
exclude-newer = "1 week"
|
|
135
136
|
|
|
136
137
|
[tool.uv.dependency-groups.docs]
|
|
137
138
|
requires-python = ">= 3.14"
|
|
138
139
|
|
|
139
140
|
[tool.uv.exclude-newer-package]
|
|
140
|
-
click-extra = "2026-08-02T00:00:00Z"
|
|
141
|
-
extra-platforms = "2026-07-28T00:00:00Z"
|
|
142
141
|
repomatic = "0 day"
|
|
143
142
|
|
|
144
143
|
[tool.uv.build-backend]
|
|
@@ -147,14 +146,17 @@ module-root = ""
|
|
|
147
146
|
[tool.nuitka]
|
|
148
147
|
copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed under GPL-2.0-or-later license."
|
|
149
148
|
file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
150
|
-
file-version = "7.
|
|
151
|
-
include-data-dir = [
|
|
149
|
+
file-version = "7.5.0"
|
|
150
|
+
include-data-dir = [
|
|
151
|
+
"repomatic/data/awesome_template=repomatic/data/awesome_template",
|
|
152
|
+
"repomatic/data/skills=repomatic/data/skills",
|
|
153
|
+
]
|
|
152
154
|
include-data-files = ["repomatic/templates/*.md=repomatic/templates/"]
|
|
153
155
|
include-package-data = ["click_extra"]
|
|
154
156
|
linux-icon = "docs/assets/icon.png"
|
|
155
157
|
macos-app-icon = "docs/assets/icon.icns"
|
|
156
158
|
product-name = "Repomatic"
|
|
157
|
-
product-version = "7.
|
|
159
|
+
product-version = "7.5.0"
|
|
158
160
|
windows-icon-from-ico = "docs/assets/icon.ico"
|
|
159
161
|
|
|
160
162
|
[tool.ruff]
|
|
@@ -162,6 +164,7 @@ preview = true
|
|
|
162
164
|
fix = true
|
|
163
165
|
unsafe-fixes = false
|
|
164
166
|
show-fixes = true
|
|
167
|
+
output-prefer-rule-codes = true
|
|
165
168
|
|
|
166
169
|
[tool.ruff.format]
|
|
167
170
|
docstring-code-format = true
|
|
@@ -244,7 +247,7 @@ source = ["repomatic"]
|
|
|
244
247
|
precision = 2
|
|
245
248
|
|
|
246
249
|
[tool.bumpversion]
|
|
247
|
-
current_version = "7.
|
|
250
|
+
current_version = "7.5.0"
|
|
248
251
|
parse = '(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.dev(?P<dev>\d+))?'
|
|
249
252
|
serialize = [
|
|
250
253
|
"{major}.{minor}.{patch}.dev{dev}",
|
|
@@ -7,12 +7,12 @@ build-backend = "uv_build"
|
|
|
7
7
|
# repomatic runs across the ecosystem, where uv versions drift between projects,
|
|
8
8
|
# and a hard ceiling risks a chicken-and-egg deadlock when one project's uv
|
|
9
9
|
# moves ahead of repomatic's next release.
|
|
10
|
-
requires = [ "uv-build>=0.
|
|
10
|
+
requires = [ "uv-build>=0.8" ]
|
|
11
11
|
|
|
12
12
|
[project]
|
|
13
13
|
# Docs: https://packaging.python.org/en/latest/guides/writing-pyproject-toml/
|
|
14
14
|
name = "repomatic"
|
|
15
|
-
version = "7.
|
|
15
|
+
version = "7.5.0"
|
|
16
16
|
description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
17
17
|
readme = "readme.md"
|
|
18
18
|
keywords = [
|
|
@@ -145,7 +145,7 @@ dependencies = [
|
|
|
145
145
|
]
|
|
146
146
|
urls.Changelog = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
|
|
147
147
|
urls.Documentation = "https://kdeldycke.github.io/repomatic"
|
|
148
|
-
urls.Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.
|
|
148
|
+
urls.Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.5.0"
|
|
149
149
|
urls.Funding = "https://github.com/sponsors/kdeldycke"
|
|
150
150
|
urls.Homepage = "https://github.com/kdeldycke/repomatic"
|
|
151
151
|
urls.Issues = "https://github.com/kdeldycke/repomatic/issues"
|
|
@@ -190,6 +190,10 @@ docs = [
|
|
|
190
190
|
"sphinx-datatables>=1",
|
|
191
191
|
# sphinx-design 0.6 introduced the current directive syntax for cards, grids, and tabs.
|
|
192
192
|
"sphinx-design>=0.6",
|
|
193
|
+
# sphinxcontrib-jquery is loaded explicitly in docs/conf.py (sphinx-datatables
|
|
194
|
+
# activates it too late to register jquery.js on its own); declare it so the
|
|
195
|
+
# build never relies on it arriving only transitively via sphinx-datatables.
|
|
196
|
+
"sphinxcontrib-jquery>=4",
|
|
193
197
|
# sphinxcontrib-mermaid 1.2.3 fixed mermaid_d3_zoom configuration support.
|
|
194
198
|
"sphinxcontrib-mermaid>=1.2.3",
|
|
195
199
|
# sphinxext-opengraph 0.13 stabilized OpenGraph metadata generation for Sphinx 8+.
|
|
@@ -216,12 +220,15 @@ typing = [
|
|
|
216
220
|
# self-updates). uv.lock stays stable across minors because sync-uv-lock
|
|
217
221
|
# discards a re-lock that only re-spells equivalent markers (see
|
|
218
222
|
# repomatic.uv.sync_uv_lock).
|
|
219
|
-
required-version = ">=0.
|
|
223
|
+
required-version = ">=0.11.15"
|
|
220
224
|
# Docs group requires Python >= 3.14 for recent MyST-Parser and click-extra features.
|
|
221
225
|
dependency-groups.docs = { requires-python = ">= 3.14" }
|
|
222
|
-
# Cooldown period
|
|
223
|
-
#
|
|
224
|
-
#
|
|
226
|
+
# Cooldown period before using newly released packages. Kept equal to
|
|
227
|
+
# `[tool.repomatic] minimum-release-age`: that value gates the `uvx` installs
|
|
228
|
+
# every workflow runs, and a wider window here would lock a version those
|
|
229
|
+
# installs refuse to resolve. Relative dates are fine: uv 0.11.8+ writes a
|
|
230
|
+
# sentinel timestamp to uv.lock for relative spans, so re-resolving never
|
|
231
|
+
# produces churn.
|
|
225
232
|
exclude-newer = "1 week"
|
|
226
233
|
# Per-package cooldown control. A fixed date holds a package at the version
|
|
227
234
|
# available then (the day after it shipped), so `uv lock --upgrade` keeps that
|
|
@@ -230,7 +237,7 @@ exclude-newer = "1 week"
|
|
|
230
237
|
# `exclude-newer`, returning the package to the normal cooldown. repomatic is
|
|
231
238
|
# pinned to git main (no PyPI release to freeze), so it keeps a permanent
|
|
232
239
|
# "0 day" span.
|
|
233
|
-
exclude-newer-package = {
|
|
240
|
+
exclude-newer-package = { repomatic = "0 day" }
|
|
234
241
|
# Package is at root level, not in "./src/".
|
|
235
242
|
build-backend.module-root = ""
|
|
236
243
|
|
|
@@ -243,9 +250,10 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
|
|
|
243
250
|
file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
244
251
|
# Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
|
|
245
252
|
# package version by the dedicated [tool.bumpversion] rule that strips the suffix.
|
|
246
|
-
file-version = "7.
|
|
253
|
+
file-version = "7.5.0"
|
|
247
254
|
include-data-dir = [
|
|
248
255
|
"repomatic/data/awesome_template=repomatic/data/awesome_template",
|
|
256
|
+
"repomatic/data/skills=repomatic/data/skills",
|
|
249
257
|
]
|
|
250
258
|
include-data-files = [
|
|
251
259
|
"repomatic/templates/*.md=repomatic/templates/",
|
|
@@ -261,7 +269,7 @@ include-package-data = [ "click_extra" ]
|
|
|
261
269
|
linux-icon = "docs/assets/icon.png"
|
|
262
270
|
macos-app-icon = "docs/assets/icon.icns"
|
|
263
271
|
product-name = "Repomatic"
|
|
264
|
-
product-version = "7.
|
|
272
|
+
product-version = "7.5.0"
|
|
265
273
|
windows-icon-from-ico = "docs/assets/icon.ico"
|
|
266
274
|
|
|
267
275
|
[tool.ruff]
|
|
@@ -295,6 +303,9 @@ lint.isort.combine-as-imports = true
|
|
|
295
303
|
# this would simplify a fix or enable a new diagnostic.
|
|
296
304
|
# https://docs.astral.sh/ruff/settings/#lint_future-annotations
|
|
297
305
|
lint.future-annotations = true
|
|
306
|
+
# Report rule codes, not the human-readable names preview mode defaults to.
|
|
307
|
+
# See the bundled repomatic/data/ruff.toml for the rationale.
|
|
308
|
+
output-prefer-rule-codes = true
|
|
298
309
|
|
|
299
310
|
[tool.typos]
|
|
300
311
|
default.extend-identifiers = { Github = "GitHub", IOS = "iOS", Javascript = "JavaScript", MacOS = "macOS", PNGs = "PNGs", PyPi = "PyPI", Typescript = "TypeScript" }
|
|
@@ -383,7 +394,7 @@ run.source = [ "repomatic" ]
|
|
|
383
394
|
report.precision = 2
|
|
384
395
|
|
|
385
396
|
[tool.bumpversion]
|
|
386
|
-
current_version = "7.
|
|
397
|
+
current_version = "7.5.0"
|
|
387
398
|
# Parse versions with an optional .devN suffix (PEP 440).
|
|
388
399
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)(\\.dev(?P<dev>\\d+))?"
|
|
389
400
|
serialize = [
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
[](https://app.codecov.io/gh/kdeldycke/repomatic)
|
|
10
10
|
[](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
|
|
11
11
|
|
|
12
|
-
A Python CLI and `pyproject.toml` configuration that let you **release Python packages multiple times a day with only 2-clicks**. Designed for `uv`-based Python projects, but usable for other projects too.
|
|
12
|
+
A Python CLI and `pyproject.toml` configuration that let you **release Python packages multiple times a day with only 2-clicks**. Designed for `uv`-based Python projects, but usable for other projects too. Every step is a CLI command: reusable GitHub Actions workflows are only the trigger, so the same automation runs on your machine.
|
|
13
13
|
|
|
14
14
|
**Maintainer-in-the-loop**: nothing is done behind your back. A PR or issue is created every time a change is proposed or action is needed.
|
|
15
15
|
|
|
@@ -31,8 +31,10 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
|
|
|
31
31
|
|
|
32
32
|
## Why repomatic
|
|
33
33
|
|
|
34
|
+
repomatic does for the release process what ruff did for linting and uv did for packaging: replace a stack of single-purpose tools with one.
|
|
35
|
+
|
|
34
36
|
- [18 third-party GitHub Actions replaced](https://kdeldycke.github.io/repomatic/security.html#third-party-action-minimization) by internal CLI commands and SHA-256-verified binary downloads, keeping the supply chain attack surface minimal
|
|
35
|
-
- [
|
|
37
|
+
- [10 Python linters and formatters](https://kdeldycke.github.io/repomatic/security.html#ruff-consolidation) (pylint, pydocstyle, pycln, pyupgrade, isort, black, docformatter, mdformat-black, blacken-docs, mdformat-ruff) consolidated into ruff
|
|
36
38
|
- [5 packaging and install tools](https://kdeldycke.github.io/repomatic/security.html#uv-consolidation) (poetry, build, twine, check-wheel-contents, pip-audit) consolidated into uv
|
|
37
39
|
- All `uses:` references [pinned to full commit SHAs](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) with stabilization windows before adopting new versions, managed entirely by self-hosted sync jobs
|
|
38
40
|
- [SLSA provenance attestations](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) on every release artifact (wheels and compiled binaries)
|
|
@@ -42,7 +44,8 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
|
|
|
42
44
|
- Workflow security linting with [`zizmor`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) on every push to catch dangerous triggers and excessive permissions
|
|
43
45
|
- Credential scanning with [`gitleaks`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) to prevent secret leakage
|
|
44
46
|
- Single [`pyproject.toml` configuration](https://kdeldycke.github.io/repomatic/configuration.html): no extra dotfiles, no JSON configs, no YAML presets to maintain
|
|
45
|
-
- [
|
|
47
|
+
- The CLI itself [ships as standalone binaries](https://kdeldycke.github.io/repomatic/install.html#executables) (Linux / macOS / Windows, x86_64 / arm64): no Python environment needed to run it
|
|
48
|
+
- [15+ code quality tools](https://kdeldycke.github.io/repomatic/tool-runner.html) (ruff, mypy, biome, typos, mdformat, shfmt, yamllint, actionlint, lychee, oxipng, pyproject-fmt, labelmaker, gitleaks, zizmor) managed through one `repomatic run <tool>` interface with automatic installation and platform-specific binary caching
|
|
46
49
|
|
|
47
50
|
## Quick start
|
|
48
51
|
|
|
@@ -56,6 +59,13 @@ $ git push
|
|
|
56
59
|
|
|
57
60
|
Works for new and existing repositories. Managed files are always regenerated to the latest version; `changelog.md` is never overwritten. Push, and the workflows guide you through remaining setup via issues and PRs.
|
|
58
61
|
|
|
62
|
+
The workflows only call CLI commands, so every automated step can also be run and previewed locally:
|
|
63
|
+
|
|
64
|
+
```shell-session
|
|
65
|
+
$ uvx -- repomatic sync-deps --dry-run
|
|
66
|
+
$ uvx -- repomatic run ruff -- check
|
|
67
|
+
```
|
|
68
|
+
|
|
59
69
|
See `repomatic init --help` for available components and options.
|
|
60
70
|
|
|
61
71
|
## Documentation
|
|
@@ -65,10 +75,11 @@ See the **[full documentation](https://kdeldycke.github.io/repomatic/)** for:
|
|
|
65
75
|
- [Installation methods and executables](https://kdeldycke.github.io/repomatic/install.html)
|
|
66
76
|
- [`[tool.repomatic]` configuration reference](https://kdeldycke.github.io/repomatic/configuration.html)
|
|
67
77
|
- [CLI parameters](https://kdeldycke.github.io/repomatic/cli.html)
|
|
68
|
-
- [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all
|
|
78
|
+
- [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all 14 workflows with job descriptions)
|
|
69
79
|
- [Security practices and token setup](https://kdeldycke.github.io/repomatic/security.html)
|
|
70
80
|
- [Claude Code skills](https://kdeldycke.github.io/repomatic/skills.html)
|
|
71
81
|
- [API reference](https://kdeldycke.github.io/repomatic/repomatic.html)
|
|
82
|
+
- [Project history](https://kdeldycke.github.io/repomatic/history.html)
|
|
72
83
|
|
|
73
84
|
## Used in
|
|
74
85
|
|
|
@@ -56,9 +56,9 @@ import logging
|
|
|
56
56
|
from pathlib import Path
|
|
57
57
|
|
|
58
58
|
from click_extra.blocks import replace_region
|
|
59
|
-
from packaging.version import InvalidVersion, Version
|
|
60
59
|
|
|
61
60
|
from .binary import NUITKA_BUILD_TARGETS
|
|
61
|
+
from .github.releases import parse_release_version
|
|
62
62
|
from .virustotal import VIRUSTOTAL_GUI_URL
|
|
63
63
|
|
|
64
64
|
TYPE_CHECKING = False
|
|
@@ -160,7 +160,7 @@ The table is searchable and sortable on the documentation site; the raw data liv
|
|
|
160
160
|
"""
|
|
161
161
|
"""Initial page content, used when the page does not exist yet.
|
|
162
162
|
|
|
163
|
-
The
|
|
163
|
+
The ``{repo_url}`` placeholder is substituted with `str.replace` (not
|
|
164
164
|
`str.format`, which would choke on the csv-table directive's braces).
|
|
165
165
|
Everything outside the marker pair is written once and never touched again:
|
|
166
166
|
repositories can reword the prose without fighting the generator.
|
|
@@ -182,14 +182,6 @@ def _platform_target(name: str) -> str:
|
|
|
182
182
|
return name
|
|
183
183
|
|
|
184
184
|
|
|
185
|
-
def _release_version(tag: str) -> Version | None:
|
|
186
|
-
"""Parse a release tag as a version, or `None` for foreign tag schemes."""
|
|
187
|
-
try:
|
|
188
|
-
return Version(tag.removeprefix("v"))
|
|
189
|
-
except InvalidVersion:
|
|
190
|
-
return None
|
|
191
|
-
|
|
192
|
-
|
|
193
185
|
def _binary_assets(release: ReleaseWithAssets) -> list[ReleaseAsset]:
|
|
194
186
|
"""Return the release's compiled binaries, sorted by filename.
|
|
195
187
|
|
|
@@ -261,7 +253,7 @@ def render_chart_section(records: Sequence[ScanRecord]) -> str:
|
|
|
261
253
|
|
|
262
254
|
points = []
|
|
263
255
|
for tag, (date, flagged, total) in per_tag.items():
|
|
264
|
-
version =
|
|
256
|
+
version = parse_release_version(tag)
|
|
265
257
|
if version is None:
|
|
266
258
|
continue
|
|
267
259
|
if total:
|
|
@@ -383,7 +375,8 @@ def render_binaries_csv(
|
|
|
383
375
|
versioned = [
|
|
384
376
|
(version, release)
|
|
385
377
|
for release in releases
|
|
386
|
-
if not release.draft
|
|
378
|
+
if not release.draft
|
|
379
|
+
and (version := parse_release_version(release.tag)) is not None
|
|
387
380
|
]
|
|
388
381
|
versioned.sort(key=lambda pair: pair[0], reverse=True)
|
|
389
382
|
|
|
@@ -425,8 +418,10 @@ def render_binaries_csv(
|
|
|
425
418
|
# they stay clickable with their label.
|
|
426
419
|
writer.writerow((
|
|
427
420
|
f"[`{version}` {{octicon}}`link-external`]({release_url})",
|
|
428
|
-
|
|
429
|
-
|
|
421
|
+
(
|
|
422
|
+
f"[{{octicon}}`download` `{_platform_target(asset.name)}`]"
|
|
423
|
+
f"({asset.download_url})"
|
|
424
|
+
),
|
|
430
425
|
release.date,
|
|
431
426
|
vt_cell,
|
|
432
427
|
))
|
|
@@ -28,7 +28,6 @@ from __future__ import annotations
|
|
|
28
28
|
|
|
29
29
|
import json
|
|
30
30
|
import logging
|
|
31
|
-
import tempfile
|
|
32
31
|
from dataclasses import dataclass
|
|
33
32
|
from itertools import groupby
|
|
34
33
|
from operator import attrgetter
|
|
@@ -333,22 +332,9 @@ def manage_combined_broken_links_issue(
|
|
|
333
332
|
sphinx_section=sphinx_section,
|
|
334
333
|
)
|
|
335
334
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
) as tmp:
|
|
343
|
-
tmp.write(body)
|
|
344
|
-
body_file = Path(tmp.name)
|
|
345
|
-
|
|
346
|
-
try:
|
|
347
|
-
manage_issue_lifecycle(
|
|
348
|
-
has_issues=has_broken_links,
|
|
349
|
-
body_file=body_file,
|
|
350
|
-
labels=[get_label(repo_name)],
|
|
351
|
-
title=ISSUE_TITLE,
|
|
352
|
-
)
|
|
353
|
-
finally:
|
|
354
|
-
body_file.unlink(missing_ok=True)
|
|
335
|
+
manage_issue_lifecycle(
|
|
336
|
+
has_issues=has_broken_links,
|
|
337
|
+
body=body,
|
|
338
|
+
labels=[get_label(repo_name)],
|
|
339
|
+
title=ISSUE_TITLE,
|
|
340
|
+
)
|
|
@@ -144,9 +144,6 @@ CHANGELOG_HEADER = "# Changelog\n"
|
|
|
144
144
|
SECTION_START = "##"
|
|
145
145
|
"""Markdown heading level for changelog version sections."""
|
|
146
146
|
|
|
147
|
-
DATE_PATTERN = re.compile(r"\d{4}\-\d{2}\-\d{2}")
|
|
148
|
-
"""Pattern matching release dates in YYYY-MM-DD format."""
|
|
149
|
-
|
|
150
147
|
VERSION_COMPARE_PATTERN = re.compile(r"v(\d+\.\d+\.\d+)\.\.\.v(\d+\.\d+\.\d+)")
|
|
151
148
|
"""Pattern matching GitHub comparison URLs like `v1.0.0...v1.0.1`."""
|
|
152
149
|
|