repomatic 6.25.1__tar.gz → 6.26.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-6.25.1 → repomatic-6.26.0}/PKG-INFO +4 -3
- {repomatic-6.25.1 → repomatic-6.26.0}/pyproject.toml +5 -5
- {repomatic-6.25.1 → repomatic-6.26.0}/readme.md +2 -1
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/__init__.py +2 -2
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/changelog.py +84 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/cli.py +48 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/config.py +79 -7
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/_release-engine.yaml +37 -20
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/action-publish-pypi.yaml +1 -1
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/autofix.yaml +51 -51
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/changelog.yaml +32 -26
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/debug.yaml +3 -3
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/docs.yaml +6 -6
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labels.yaml +13 -10
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/lint.yaml +14 -14
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/renovate.json5 +2 -2
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/renovate.yaml +6 -6
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-changelog.md +7 -5
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/tests.yaml +4 -4
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/unsubscribe.yaml +2 -2
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/init_project.py +185 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/license +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/__main__.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/binary.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/broken_links.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/cache.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/checksums.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/__init__.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/agent-grunt-qa.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/agent-qa-engineer.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/agent-sphinx-docs.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/autolock.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/__init__.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/license +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/bumpversion.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/cancel-runs.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/codecov.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labeller-content-based.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labeller-file-based.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labels.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/lychee.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/mdformat.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/mypy.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/pytest.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/release.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/ruff.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-av-false-positive.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-awesome-triage.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-babysit-ci.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-benchmark-update.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-brand-assets.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-file-bug-report.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-audit.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-deps.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-init.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-ship.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-topics.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-sphinx-docs-sync.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-translation-sync.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-upstream-audit.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/typos.toml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/yamllint.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/zizmor.yaml +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/deps_graph.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/git_ops.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/__init__.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/actions.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/advisories.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/dev_release.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/gh.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/issue.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/matrix.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/pr.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/pr_body.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/release_sync.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/releases.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/status.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/token.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/unsubscribe.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/workflow_sync.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/images.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/lint_repo.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/mailmap.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/metadata.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/myst_converter.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/myst_docstrings.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/py.typed +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/pypi.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/pyproject.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/registry.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/release_prep.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/renovate.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/rst_to_myst.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/sponsor.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/__init__.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/available-admonition.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/broken-links-issue.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/bump-version.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/detect-squash-merge.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/development-warning.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/fix-changelog.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/fix-typos.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-images.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-json.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-markdown.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-pyproject.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-python.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-shell.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/generated-footer.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/github-releases.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/immutable-releases.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/prepare-release.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/refresh-tip.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/release-notes.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/release-sync-report.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/renovate-migration.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-token.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-verify.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-bumpversion.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-gitignore.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-mailmap.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-repomatic.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-uv-lock.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/unavailable-admonition.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/update-deps-graph.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/update-docs.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/yanked-admonition.md +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/test_matrix.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/test_plan.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/tool_runner.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/uv.py +0 -0
- {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/virustotal.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: repomatic
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.26.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,renovate,repository-automation,repository-management,reusable-workflows,software-factory,sphinx-doc,typo,uv,workflow-reusable
|
|
6
6
|
Author: Kevin Deldycke
|
|
@@ -58,7 +58,7 @@ Requires-Dist: wcmatch>=10
|
|
|
58
58
|
Requires-Python: >=3.10
|
|
59
59
|
Project-URL: Changelog, https://github.com/kdeldycke/repomatic/blob/main/changelog.md
|
|
60
60
|
Project-URL: Documentation, https://kdeldycke.github.io/repomatic
|
|
61
|
-
Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v6.
|
|
61
|
+
Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0
|
|
62
62
|
Project-URL: Funding, https://github.com/sponsors/kdeldycke
|
|
63
63
|
Project-URL: Homepage, https://github.com/kdeldycke/repomatic
|
|
64
64
|
Project-URL: Issues, https://github.com/kdeldycke/repomatic/issues
|
|
@@ -72,8 +72,9 @@ Description-Content-Type: text/markdown
|
|
|
72
72
|
[](https://pypi.org/project/repomatic/)
|
|
73
73
|
[](https://pypi.org/project/repomatic/)
|
|
74
74
|
[](https://pepy.tech/projects/repomatic)
|
|
75
|
-
[](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
|
|
76
76
|
[](https://app.codecov.io/gh/kdeldycke/repomatic)
|
|
77
|
+
[](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
|
|
77
78
|
|
|
78
79
|
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. The CLI operates through reusable GitHub Actions workflows as its CI delivery mechanism.
|
|
79
80
|
|
|
@@ -5,7 +5,7 @@ requires = [ "uv-build>=0.9" ]
|
|
|
5
5
|
[project]
|
|
6
6
|
# Docs: https://packaging.python.org/en/latest/guides/writing-pyproject-toml/
|
|
7
7
|
name = "repomatic"
|
|
8
|
-
version = "6.
|
|
8
|
+
version = "6.26.0"
|
|
9
9
|
description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
10
10
|
readme = "readme.md"
|
|
11
11
|
keywords = [
|
|
@@ -123,7 +123,7 @@ repomatic = "repomatic.__main__:main"
|
|
|
123
123
|
[project.urls]
|
|
124
124
|
"Changelog" = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
|
|
125
125
|
"Documentation" = "https://kdeldycke.github.io/repomatic"
|
|
126
|
-
"Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.
|
|
126
|
+
"Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0"
|
|
127
127
|
"Funding" = "https://github.com/sponsors/kdeldycke"
|
|
128
128
|
"Homepage" = "https://github.com/kdeldycke/repomatic"
|
|
129
129
|
"Issues" = "https://github.com/kdeldycke/repomatic/issues"
|
|
@@ -204,7 +204,7 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
|
|
|
204
204
|
file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
205
205
|
# Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
|
|
206
206
|
# package version by the dedicated [tool.bumpversion] rule that strips the suffix.
|
|
207
|
-
file-version = "6.
|
|
207
|
+
file-version = "6.26.0"
|
|
208
208
|
include-data-dir = [
|
|
209
209
|
"repomatic/data/awesome_template=repomatic/data/awesome_template",
|
|
210
210
|
]
|
|
@@ -222,7 +222,7 @@ include-package-data = [ "click_extra" ]
|
|
|
222
222
|
linux-icon = "docs/assets/icon.png"
|
|
223
223
|
macos-app-icon = "docs/assets/icon.icns"
|
|
224
224
|
product-name = "Repomatic"
|
|
225
|
-
product-version = "6.
|
|
225
|
+
product-version = "6.26.0"
|
|
226
226
|
windows-icon-from-ico = "docs/assets/icon.ico"
|
|
227
227
|
|
|
228
228
|
[tool.ruff]
|
|
@@ -306,7 +306,7 @@ run.source = [ "repomatic" ]
|
|
|
306
306
|
report.precision = 2
|
|
307
307
|
|
|
308
308
|
[tool.bumpversion]
|
|
309
|
-
current_version = "6.
|
|
309
|
+
current_version = "6.26.0"
|
|
310
310
|
allow_dirty = true
|
|
311
311
|
ignore_missing_files = true
|
|
312
312
|
# Parse versions with an optional .devN suffix (PEP 440).
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
[](https://pypi.org/project/repomatic/)
|
|
6
6
|
[](https://pypi.org/project/repomatic/)
|
|
7
7
|
[](https://pepy.tech/projects/repomatic)
|
|
8
|
-
[](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
|
|
9
9
|
[](https://app.codecov.io/gh/kdeldycke/repomatic)
|
|
10
|
+
[](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
|
|
10
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. The CLI operates through reusable GitHub Actions workflows as its CI delivery mechanism.
|
|
12
13
|
|
|
@@ -730,6 +730,84 @@ def build_unavailable_admonition(
|
|
|
730
730
|
)
|
|
731
731
|
|
|
732
732
|
|
|
733
|
+
def split_changelog_bullets(changes: str) -> list[str]:
|
|
734
|
+
"""Split a version section's change body into top-level bullet entries.
|
|
735
|
+
|
|
736
|
+
Each returned item is one entry: its `-` marker line plus any wrapped
|
|
737
|
+
continuation lines and indented sub-bullets, joined with newlines.
|
|
738
|
+
Blank lines and prose outside a bullet are dropped.
|
|
739
|
+
|
|
740
|
+
:param changes: The hand-written body of a version section, as captured
|
|
741
|
+
in {attr}`VersionElements.changes`.
|
|
742
|
+
:return: One string per top-level bullet, in document order.
|
|
743
|
+
"""
|
|
744
|
+
bullets: list[str] = []
|
|
745
|
+
current: list[str] = []
|
|
746
|
+
for line in changes.splitlines():
|
|
747
|
+
if re.match(r"^- ", line):
|
|
748
|
+
if current:
|
|
749
|
+
bullets.append("\n".join(current))
|
|
750
|
+
current = [line]
|
|
751
|
+
elif current and (not line.strip() or line[:1] in {" ", "\t"}):
|
|
752
|
+
# Wrapped continuation, indented sub-bullet, or interior blank line.
|
|
753
|
+
current.append(line)
|
|
754
|
+
elif current:
|
|
755
|
+
# A non-indented, non-bullet line closes the current entry.
|
|
756
|
+
bullets.append("\n".join(current))
|
|
757
|
+
current = []
|
|
758
|
+
if current:
|
|
759
|
+
bullets.append("\n".join(current))
|
|
760
|
+
return bullets
|
|
761
|
+
|
|
762
|
+
|
|
763
|
+
def count_bullet_words(bullet: str) -> int:
|
|
764
|
+
"""Count the words in a changelog bullet, ignoring list markers.
|
|
765
|
+
|
|
766
|
+
Leading `-`/`*` markers (on the entry and any nested sub-bullets) are
|
|
767
|
+
stripped so they do not inflate the count; everything else, including
|
|
768
|
+
inline code and link text, counts as written.
|
|
769
|
+
"""
|
|
770
|
+
return len(re.sub(r"(?m)^\s*[-*]\s+", "", bullet).split())
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
def warn_on_long_bullets(changelog: Changelog, threshold: int) -> None:
|
|
774
|
+
"""Warn about over-long bullets in the unreleased section, non-fatally.
|
|
775
|
+
|
|
776
|
+
A changelog entry is a release note, not a commit message: one short
|
|
777
|
+
sentence stating what changed (see `CLAUDE.md` § Changelog entry length).
|
|
778
|
+
Each unreleased bullet longer than `threshold` words emits a
|
|
779
|
+
{data}`logging.WARNING` and a GitHub Actions warning annotation, without
|
|
780
|
+
affecting the lint exit code.
|
|
781
|
+
|
|
782
|
+
Only the unreleased section is inspected. Released sections are immutable,
|
|
783
|
+
so re-flagging historical entries on every run would be noise.
|
|
784
|
+
|
|
785
|
+
:param changelog: The parsed changelog to inspect.
|
|
786
|
+
:param threshold: Word ceiling per bullet. `0` (or less) disables the check.
|
|
787
|
+
"""
|
|
788
|
+
if threshold <= 0:
|
|
789
|
+
return
|
|
790
|
+
released = {version for version, _date in changelog.extract_all_releases()}
|
|
791
|
+
unreleased = changelog.extract_all_version_headings() - released
|
|
792
|
+
for version in sorted(unreleased, key=Version, reverse=True):
|
|
793
|
+
elements = changelog.decompose_version(version)
|
|
794
|
+
for index, bullet in enumerate(split_changelog_bullets(elements.changes), 1):
|
|
795
|
+
words = count_bullet_words(bullet)
|
|
796
|
+
if words > threshold:
|
|
797
|
+
logging.warning(
|
|
798
|
+
f"⚠ {version}: changelog entry {index} runs {words} words "
|
|
799
|
+
f"(over {threshold}). Tighten it to a one-sentence release "
|
|
800
|
+
f"note; move mechanism and rationale to the commit or PR."
|
|
801
|
+
)
|
|
802
|
+
emit_annotation(
|
|
803
|
+
AnnotationLevel.WARNING,
|
|
804
|
+
f"Changelog entry {index} for {version} runs {words} words, "
|
|
805
|
+
f"over the {threshold}-word guideline. A changelog entry is "
|
|
806
|
+
f"a release note, not a commit message: keep it to one short "
|
|
807
|
+
f"sentence (see CLAUDE.md, Changelog entry length).",
|
|
808
|
+
)
|
|
809
|
+
|
|
810
|
+
|
|
733
811
|
def lint_changelog_dates(
|
|
734
812
|
changelog_path: Path,
|
|
735
813
|
package: str | None = None,
|
|
@@ -737,6 +815,7 @@ def lint_changelog_dates(
|
|
|
737
815
|
fix: bool = False,
|
|
738
816
|
pypi_package_history: Sequence[str] = (),
|
|
739
817
|
abandoned_versions: Sequence[str] = (),
|
|
818
|
+
bullet_word_threshold: int = 0,
|
|
740
819
|
) -> int:
|
|
741
820
|
"""Verify that changelog release dates match canonical release dates.
|
|
742
821
|
|
|
@@ -787,6 +866,10 @@ def lint_changelog_dates(
|
|
|
787
866
|
both the PyPI lookup and the git-tag fallback. Use for releases
|
|
788
867
|
that were frozen but skipped per the "skip and move forward"
|
|
789
868
|
practice (botched build, broken artifact).
|
|
869
|
+
:param bullet_word_threshold: Word count above which an unreleased-section
|
|
870
|
+
bullet triggers a non-fatal length warning (see
|
|
871
|
+
{func}`warn_on_long_bullets`). `0` disables the check. Never affects
|
|
872
|
+
the exit code.
|
|
790
873
|
:return: `0` if all dates match or references were corrected in-place,
|
|
791
874
|
`1` if any date mismatch or orphan is found without a fix being
|
|
792
875
|
applied, `2` if the sanity gate refused a destructive rewrite
|
|
@@ -796,6 +879,7 @@ def lint_changelog_dates(
|
|
|
796
879
|
"""
|
|
797
880
|
content = changelog_path.read_text(encoding="UTF-8")
|
|
798
881
|
changelog = Changelog(content)
|
|
882
|
+
warn_on_long_bullets(changelog, bullet_word_threshold)
|
|
799
883
|
releases = changelog.extract_all_releases()
|
|
800
884
|
|
|
801
885
|
if not releases:
|
|
@@ -29,6 +29,7 @@ from collections import Counter
|
|
|
29
29
|
from pathlib import Path
|
|
30
30
|
from urllib.request import Request, urlopen
|
|
31
31
|
|
|
32
|
+
import tomlrt
|
|
32
33
|
from boltons.iterutils import unique
|
|
33
34
|
from click_extra import (
|
|
34
35
|
UNPROCESSED,
|
|
@@ -2972,9 +2973,51 @@ def sync_labels(ctx: Context, repository: str | None) -> None:
|
|
|
2972
2973
|
if label_file.is_file():
|
|
2973
2974
|
_run_labelmaker(lm, "apply", str(label_file), repository)
|
|
2974
2975
|
|
|
2976
|
+
# Apply inline label definitions from `[tool.repomatic.labels.extra]`.
|
|
2977
|
+
inline_toml = _serialize_inline_labels(config.labels.extra)
|
|
2978
|
+
if inline_toml:
|
|
2979
|
+
with tempfile.TemporaryDirectory(prefix="repomatic-labels-") as tmpdir:
|
|
2980
|
+
inline_file = Path(tmpdir) / "inline.toml"
|
|
2981
|
+
inline_file.write_text(inline_toml, encoding="UTF-8")
|
|
2982
|
+
_run_labelmaker(lm, "apply", str(inline_file), repository)
|
|
2983
|
+
|
|
2975
2984
|
echo("Labels synced.")
|
|
2976
2985
|
|
|
2977
2986
|
|
|
2987
|
+
def _serialize_inline_labels(entries: list[dict[str, str]]) -> str:
|
|
2988
|
+
"""Serialize `[tool.repomatic.labels.extra]` entries to a labelmaker TOML config.
|
|
2989
|
+
|
|
2990
|
+
Each entry becomes a `[[profiles.default.labels]]` block under the `default`
|
|
2991
|
+
profile. Leading `#` on hex colors is stripped so the output matches
|
|
2992
|
+
labelmaker's convention. Entries missing a `name` are skipped with a warning:
|
|
2993
|
+
labelmaker rejects nameless labels and would abort the whole sync.
|
|
2994
|
+
|
|
2995
|
+
Returns an empty string when there are no valid entries, so the caller can
|
|
2996
|
+
skip writing a temp file and invoking labelmaker entirely.
|
|
2997
|
+
"""
|
|
2998
|
+
labels: list[dict[str, str]] = []
|
|
2999
|
+
for entry in entries:
|
|
3000
|
+
name = entry.get("name", "").strip()
|
|
3001
|
+
if not name:
|
|
3002
|
+
logging.warning(
|
|
3003
|
+
"Skipping inline label without a `name`: %r.",
|
|
3004
|
+
entry,
|
|
3005
|
+
)
|
|
3006
|
+
continue
|
|
3007
|
+
label: dict[str, str] = {"name": name}
|
|
3008
|
+
if color := entry.get("color"):
|
|
3009
|
+
label["color"] = color.lstrip("#")
|
|
3010
|
+
if description := entry.get("description"):
|
|
3011
|
+
label["description"] = description
|
|
3012
|
+
labels.append(label)
|
|
3013
|
+
|
|
3014
|
+
if not labels:
|
|
3015
|
+
return ""
|
|
3016
|
+
|
|
3017
|
+
doc = tomlrt.Document({"profiles": {"default": {"labels": labels}}})
|
|
3018
|
+
return tomlrt.dumps(doc)
|
|
3019
|
+
|
|
3020
|
+
|
|
2978
3021
|
def _run_labelmaker(labelmaker_path: Path, *args: str) -> None:
|
|
2979
3022
|
"""Run a `labelmaker` command.
|
|
2980
3023
|
|
|
@@ -3304,6 +3347,10 @@ def lint_changelog(
|
|
|
3304
3347
|
"not found on PyPI" warnings for releases that were frozen but
|
|
3305
3348
|
never published (skip-and-move-forward releases).
|
|
3306
3349
|
|
|
3350
|
+
Reads changelog.bullet-word-threshold from [tool.repomatic] to warn,
|
|
3351
|
+
non-fatally, about unreleased changelog bullets longer than that many
|
|
3352
|
+
words. A changelog entry is a release note, not a commit message.
|
|
3353
|
+
|
|
3307
3354
|
\b
|
|
3308
3355
|
Output symbols:
|
|
3309
3356
|
✓ Dates match
|
|
@@ -3349,6 +3396,7 @@ def lint_changelog(
|
|
|
3349
3396
|
fix=fix,
|
|
3350
3397
|
pypi_package_history=config.pypi_package_history,
|
|
3351
3398
|
abandoned_versions=config.abandoned_versions,
|
|
3399
|
+
bullet_word_threshold=config.changelog_bullet_word_threshold,
|
|
3352
3400
|
)
|
|
3353
3401
|
ctx.exit(exit_code)
|
|
3354
3402
|
|
|
@@ -196,22 +196,65 @@ class GitignoreConfig:
|
|
|
196
196
|
class LabelsConfig:
|
|
197
197
|
"""Nested schema for `[tool.repomatic.labels]`."""
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
"""
|
|
199
|
+
content_rules: list[dict[str, str | list[str]]] = field(default_factory=list)
|
|
200
|
+
"""Structured per-label rules for the content-based labeller.
|
|
201
201
|
|
|
202
|
-
|
|
202
|
+
Each `[[tool.repomatic.labels.content-rules]]` entry has:
|
|
203
|
+
|
|
204
|
+
- `label` (required): label name to apply when any pattern matches.
|
|
205
|
+
- `patterns` (required): list of regex patterns evaluated against the issue
|
|
206
|
+
or PR title and body by `github/issue-labeller`.
|
|
207
|
+
|
|
208
|
+
Repeating the same `label` across entries merges their patterns. Serialized
|
|
209
|
+
to YAML at export time and appended to the bundled
|
|
210
|
+
`labeller-content-based.yaml`.
|
|
203
211
|
"""
|
|
204
212
|
|
|
205
|
-
|
|
206
|
-
"""
|
|
213
|
+
extra: list[dict[str, str]] = field(default_factory=list)
|
|
214
|
+
"""Inline label definitions applied at sync time under the `default` profile.
|
|
215
|
+
|
|
216
|
+
Each entry is a mapping with `name`, `color`, and `description` keys,
|
|
217
|
+
matching `labelmaker`'s label specification. Entries are serialized into a
|
|
218
|
+
temporary TOML file as `[[profiles.default.labels]]` blocks and applied by
|
|
219
|
+
`labelmaker apply`. This avoids committing a lonely `extra-labels/*.toml`
|
|
220
|
+
file when the downstream project only needs the basic three fields.
|
|
207
221
|
|
|
208
|
-
|
|
222
|
+
For label sets that need `labelmaker`'s advanced features (`rename-from`,
|
|
223
|
+
multi-profile, multi-color), commit a hand-written file under
|
|
224
|
+
`extra-labels/` or download one via `extra-files` instead.
|
|
209
225
|
"""
|
|
210
226
|
|
|
211
227
|
extra_files: list[str] = field(default_factory=list)
|
|
212
228
|
"""URLs of additional label definition files (JSON, JSON5, TOML, or YAML).
|
|
213
229
|
|
|
214
|
-
Each URL is downloaded and applied separately by
|
|
230
|
+
Each URL is downloaded into `extra-labels/` and applied separately by
|
|
231
|
+
`labelmaker`. For inline definitions that need no external file, use
|
|
232
|
+
`extra` instead.
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
file_rules: list[dict[str, str | list[str]]] = field(default_factory=list)
|
|
236
|
+
"""Structured per-label rules for the file-based labeller.
|
|
237
|
+
|
|
238
|
+
Each `[[tool.repomatic.labels.file-rules]]` entry defines one match group
|
|
239
|
+
for one label. Required key:
|
|
240
|
+
|
|
241
|
+
- `label`: label name to apply when this group's conditions match.
|
|
242
|
+
|
|
243
|
+
Optional matcher keys (all conditions in the same entry are AND'd):
|
|
244
|
+
|
|
245
|
+
- `any-glob-to-any-file`: any pattern matches any changed file.
|
|
246
|
+
- `any-glob-to-all-files`: any pattern matches every changed file.
|
|
247
|
+
- `all-globs-to-any-file`: every pattern matches any changed file.
|
|
248
|
+
- `all-globs-to-all-files`: every pattern matches every changed file.
|
|
249
|
+
- `head-branch`: regex patterns matched against the PR head branch.
|
|
250
|
+
- `base-branch`: regex patterns matched against the PR base branch.
|
|
251
|
+
- `any`: list of nested sub-groups, OR'd together.
|
|
252
|
+
- `all`: list of nested sub-groups, AND'd together.
|
|
253
|
+
|
|
254
|
+
Repeating the same `label` across entries OR's the resulting groups, the
|
|
255
|
+
same as listing multiple top-level groups under one label in
|
|
256
|
+
`actions/labeler`. Together with `any` / `all` wrappers this covers the
|
|
257
|
+
full `actions/labeler` v5+ schema.
|
|
215
258
|
"""
|
|
216
259
|
|
|
217
260
|
sync: bool = True
|
|
@@ -455,6 +498,20 @@ class Config:
|
|
|
455
498
|
)
|
|
456
499
|
"""Binary cache configuration."""
|
|
457
500
|
|
|
501
|
+
changelog_bullet_word_threshold: int = field(
|
|
502
|
+
default=40,
|
|
503
|
+
metadata={"click_extra.config_path": "changelog.bullet-word-threshold"},
|
|
504
|
+
)
|
|
505
|
+
"""Word count above which `lint-changelog` warns about a changelog bullet.
|
|
506
|
+
|
|
507
|
+
A changelog entry is a release note, not a commit message: ideally one
|
|
508
|
+
short sentence stating what changed (see `CLAUDE.md` § Changelog entry
|
|
509
|
+
length). `lint-changelog` emits a non-fatal warning for every bullet in
|
|
510
|
+
the *unreleased* section longer than this many words, nudging verbose,
|
|
511
|
+
implementation-heavy entries back toward a user-facing summary. Released
|
|
512
|
+
sections are immutable and never flagged. Set to `0` to disable the check.
|
|
513
|
+
"""
|
|
514
|
+
|
|
458
515
|
changelog_location: str = field(
|
|
459
516
|
default="./changelog.md",
|
|
460
517
|
metadata={"click_extra.config_path": "changelog.location"},
|
|
@@ -589,6 +646,21 @@ class Config:
|
|
|
589
646
|
`meta-package-manager` pointing to the same function).
|
|
590
647
|
"""
|
|
591
648
|
|
|
649
|
+
nuitka_extras: list[str] = field(
|
|
650
|
+
default_factory=list,
|
|
651
|
+
metadata={"click_extra.config_path": "nuitka.extras"},
|
|
652
|
+
)
|
|
653
|
+
"""`[project.optional-dependencies]` extras to install before the Nuitka build.
|
|
654
|
+
|
|
655
|
+
List of extra names (like `["sbom"]`) to sync into the build venv before
|
|
656
|
+
invoking Nuitka. By default the binary build only sees the project's base
|
|
657
|
+
dependencies, which matches a bare `pip install <package>` and excludes
|
|
658
|
+
optional features. Listing an extra here calls `uv sync --frozen --extra
|
|
659
|
+
<name>` before the Nuitka build so the binary can bundle the optional
|
|
660
|
+
feature's third-party packages (paired with `--include-package` in
|
|
661
|
+
`[tool.nuitka]` for imports guarded behind `try/except`).
|
|
662
|
+
"""
|
|
663
|
+
|
|
592
664
|
nuitka_unstable_targets: list[str] = field(
|
|
593
665
|
default_factory=list,
|
|
594
666
|
metadata={"click_extra.config_path": "nuitka.unstable-targets"},
|
|
@@ -57,16 +57,16 @@ jobs:
|
|
|
57
57
|
run: git branch --all
|
|
58
58
|
- name: List all commits
|
|
59
59
|
run: git log --decorate=full --oneline
|
|
60
|
-
- uses: astral-sh/setup-uv@
|
|
60
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
61
61
|
- name: Run repomatic metadata
|
|
62
62
|
id: metadata
|
|
63
63
|
run: >
|
|
64
|
-
uvx --no-progress 'repomatic==6.
|
|
64
|
+
uvx --no-progress 'repomatic==6.26.0' metadata
|
|
65
65
|
--format github-json --output "$GITHUB_OUTPUT"
|
|
66
66
|
new_commits_matrix release_commits_matrix build_targets nuitka_matrix
|
|
67
|
-
is_python_project package_name current_version
|
|
68
|
-
release_notes release_notes_with_admonition
|
|
69
|
-
manpages_script manpages_asset_name
|
|
67
|
+
nuitka_extras is_python_project package_name current_version
|
|
68
|
+
released_version release_notes release_notes_with_admonition
|
|
69
|
+
skip_binary_build manpages_script manpages_asset_name
|
|
70
70
|
- name: Check VirusTotal API key
|
|
71
71
|
id: check-vt-key
|
|
72
72
|
env:
|
|
@@ -101,9 +101,26 @@ jobs:
|
|
|
101
101
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
102
102
|
with:
|
|
103
103
|
ref: ${{ matrix.commit }}
|
|
104
|
-
- uses: astral-sh/setup-uv@
|
|
104
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
105
105
|
- name: Setup venv
|
|
106
106
|
run: uv --no-progress venv --python 3.14
|
|
107
|
+
- name: Sync optional-dependencies for Nuitka build
|
|
108
|
+
# Install the [project.optional-dependencies] extras listed in
|
|
109
|
+
# [tool.repomatic] nuitka.extras into the build venv, so Nuitka can
|
|
110
|
+
# bundle their packages. See the nuitka_extras docstring in
|
|
111
|
+
# repomatic/config.py for the full rationale.
|
|
112
|
+
if: fromJSON(needs.metadata.outputs.metadata).nuitka_extras
|
|
113
|
+
env:
|
|
114
|
+
EXTRAS: ${{ fromJSON(needs.metadata.outputs.metadata).nuitka_extras }}
|
|
115
|
+
shell: bash
|
|
116
|
+
run: |
|
|
117
|
+
# EXTRAS is a space-separated list emitted by Metadata.format_github_value.
|
|
118
|
+
flags=""
|
|
119
|
+
for extra in ${EXTRAS}; do
|
|
120
|
+
flags="${flags} --extra ${extra}"
|
|
121
|
+
done
|
|
122
|
+
# shellcheck disable=SC2086
|
|
123
|
+
uv --no-progress sync --frozen ${flags}
|
|
107
124
|
- name: Pre-bake build metadata
|
|
108
125
|
if: contains(matrix.current_version, '.dev')
|
|
109
126
|
run: uvx --no-progress 'click-extra==7.18.0' prebake all
|
|
@@ -125,7 +142,7 @@ jobs:
|
|
|
125
142
|
# NUITKA_PYTHON_FLAGS holds the entry point's --python-flag (if any),
|
|
126
143
|
# meant to word-split.
|
|
127
144
|
# shellcheck disable=SC2086
|
|
128
|
-
uvx --no-progress 'repomatic==6.
|
|
145
|
+
uvx --no-progress 'repomatic==6.26.0' run nuitka -- \
|
|
129
146
|
${NUITKA_PYTHON_FLAGS} \
|
|
130
147
|
--output-filename="${BIN_NAME}" "${MODULE_PATH}"
|
|
131
148
|
- name: Upload Nuitka crash report
|
|
@@ -159,7 +176,7 @@ jobs:
|
|
|
159
176
|
BIN_NAME: ${{ matrix.bin_name }}
|
|
160
177
|
shell: bash
|
|
161
178
|
run: >
|
|
162
|
-
uvx --no-progress 'repomatic==6.
|
|
179
|
+
uvx --no-progress 'repomatic==6.26.0'
|
|
163
180
|
verify-binary --target "${TARGET}" --binary "${BIN_NAME}"
|
|
164
181
|
- name: Upload binaries
|
|
165
182
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
@@ -234,14 +251,14 @@ jobs:
|
|
|
234
251
|
DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
|
|
235
252
|
BIN_NAME: ${{ matrix.bin_name }}
|
|
236
253
|
run: chmod +x "${DOWNLOAD_PATH}/${BIN_NAME}"
|
|
237
|
-
- uses: astral-sh/setup-uv@
|
|
254
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
238
255
|
- name: Run test plan for binary
|
|
239
256
|
env:
|
|
240
257
|
DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
|
|
241
258
|
BIN_NAME: ${{ matrix.bin_name }}
|
|
242
259
|
shell: bash
|
|
243
260
|
run: >
|
|
244
|
-
uvx --no-progress 'repomatic==6.
|
|
261
|
+
uvx --no-progress 'repomatic==6.26.0' test-plan
|
|
245
262
|
--binary "${DOWNLOAD_PATH}/${BIN_NAME}"
|
|
246
263
|
|
|
247
264
|
create-tag:
|
|
@@ -262,7 +279,7 @@ jobs:
|
|
|
262
279
|
# PAT required so tag pushes trigger downstream on.push.tags workflows.
|
|
263
280
|
# See repomatic/git_ops.py module docstring.
|
|
264
281
|
token: ${{ secrets.REPOMATIC_PAT || github.token }}
|
|
265
|
-
- uses: astral-sh/setup-uv@
|
|
282
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
266
283
|
- name: Create and push tag
|
|
267
284
|
# Idempotent: skips if tag already exists instead of failing. This allows re-running
|
|
268
285
|
# workflows interrupted after tag creation.
|
|
@@ -270,7 +287,7 @@ jobs:
|
|
|
270
287
|
CURRENT_VERSION: ${{ matrix.current_version }}
|
|
271
288
|
COMMIT: ${{ matrix.commit }}
|
|
272
289
|
run: >
|
|
273
|
-
uvx --no-progress 'repomatic==6.
|
|
290
|
+
uvx --no-progress 'repomatic==6.26.0' git-tag
|
|
274
291
|
--tag "v${CURRENT_VERSION}"
|
|
275
292
|
--commit "${COMMIT}"
|
|
276
293
|
--skip-existing
|
|
@@ -294,7 +311,7 @@ jobs:
|
|
|
294
311
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
295
312
|
with:
|
|
296
313
|
ref: ${{ matrix.commit }}
|
|
297
|
-
- uses: astral-sh/setup-uv@
|
|
314
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
298
315
|
with:
|
|
299
316
|
enable-cache: false
|
|
300
317
|
- name: Download Python package
|
|
@@ -311,7 +328,7 @@ jobs:
|
|
|
311
328
|
continue-on-error: true
|
|
312
329
|
env:
|
|
313
330
|
GH_TOKEN: ${{ secrets.REPOMATIC_PAT || github.token }}
|
|
314
|
-
run: uvx --no-progress 'repomatic==6.
|
|
331
|
+
run: uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live --delete
|
|
315
332
|
- name: Create GitHub release draft
|
|
316
333
|
# Idempotent: skips if release already exists (e.g. workflow re-run).
|
|
317
334
|
env:
|
|
@@ -409,7 +426,7 @@ jobs:
|
|
|
409
426
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
410
427
|
with:
|
|
411
428
|
ref: ${{ matrix.commit }}
|
|
412
|
-
- uses: astral-sh/setup-uv@
|
|
429
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
413
430
|
with:
|
|
414
431
|
enable-cache: false
|
|
415
432
|
- name: Install project
|
|
@@ -461,7 +478,7 @@ jobs:
|
|
|
461
478
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
462
479
|
with:
|
|
463
480
|
ref: ${{ matrix.commit }}
|
|
464
|
-
- uses: astral-sh/setup-uv@
|
|
481
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
465
482
|
with:
|
|
466
483
|
enable-cache: false
|
|
467
484
|
- name: Download release binaries
|
|
@@ -480,7 +497,7 @@ jobs:
|
|
|
480
497
|
VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
|
|
481
498
|
CURRENT_VERSION: ${{ matrix.current_version }}
|
|
482
499
|
run: >
|
|
483
|
-
uvx --no-progress 'repomatic==6.
|
|
500
|
+
uvx --no-progress 'repomatic==6.26.0' scan-virustotal
|
|
484
501
|
--tag "v${CURRENT_VERSION}"
|
|
485
502
|
--repo "${{ github.repository }}"
|
|
486
503
|
--binaries-dir ./binaries
|
|
@@ -490,7 +507,7 @@ jobs:
|
|
|
490
507
|
VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
|
|
491
508
|
CURRENT_VERSION: ${{ matrix.current_version }}
|
|
492
509
|
run: >
|
|
493
|
-
uvx --no-progress 'repomatic==6.
|
|
510
|
+
uvx --no-progress 'repomatic==6.26.0' scan-virustotal
|
|
494
511
|
--tag "v${CURRENT_VERSION}"
|
|
495
512
|
--repo "${{ github.repository }}"
|
|
496
513
|
--poll
|
|
@@ -515,7 +532,7 @@ jobs:
|
|
|
515
532
|
contents: write
|
|
516
533
|
steps:
|
|
517
534
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
518
|
-
- uses: astral-sh/setup-uv@
|
|
535
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
519
536
|
- name: Download all build artifacts
|
|
520
537
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
521
538
|
with:
|
|
@@ -525,5 +542,5 @@ jobs:
|
|
|
525
542
|
env:
|
|
526
543
|
GH_TOKEN: ${{ github.token }}
|
|
527
544
|
run: >
|
|
528
|
-
uvx --no-progress 'repomatic==6.
|
|
545
|
+
uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live
|
|
529
546
|
--upload-assets release_assets
|