repomatic 6.25.0__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.0 → repomatic-6.26.0}/PKG-INFO +4 -4
- {repomatic-6.25.0 → repomatic-6.26.0}/pyproject.toml +5 -18
- {repomatic-6.25.0 → repomatic-6.26.0}/readme.md +2 -1
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/__init__.py +2 -2
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/changelog.py +84 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/cli.py +48 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/config.py +79 -7
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/_release-engine.yaml +37 -28
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/action-publish-pypi.yaml +1 -1
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/autofix.yaml +51 -59
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/changelog.yaml +32 -34
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/debug.yaml +3 -11
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/docs.yaml +6 -14
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labels.yaml +13 -18
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/lint.yaml +14 -22
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/renovate.json5 +2 -2
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/renovate.yaml +8 -20
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-changelog.md +7 -5
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-ship.md +1 -1
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/tests.yaml +4 -21
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/unsubscribe.yaml +2 -10
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/init_project.py +185 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/metadata.py +28 -10
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/release_prep.py +12 -7
- {repomatic-6.25.0 → repomatic-6.26.0}/license +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/__main__.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/binary.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/broken_links.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/cache.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/checksums.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/__init__.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/agent-grunt-qa.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/agent-qa-engineer.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/agent-sphinx-docs.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/autolock.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/__init__.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/license +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/bumpversion.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/cancel-runs.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/codecov.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labeller-content-based.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labeller-file-based.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labels.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/lychee.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/mdformat.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/mypy.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/pytest.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/release.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/ruff.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-av-false-positive.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-awesome-triage.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-babysit-ci.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-benchmark-update.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-brand-assets.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-file-bug-report.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-audit.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-deps.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-init.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-topics.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-sphinx-docs-sync.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-translation-sync.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-upstream-audit.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/typos.toml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/yamllint.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/zizmor.yaml +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/deps_graph.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/git_ops.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/__init__.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/actions.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/advisories.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/dev_release.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/gh.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/issue.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/matrix.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/pr.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/pr_body.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/release_sync.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/releases.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/status.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/token.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/unsubscribe.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/workflow_sync.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/images.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/lint_repo.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/mailmap.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/myst_converter.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/myst_docstrings.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/py.typed +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/pypi.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/pyproject.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/registry.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/renovate.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/rst_to_myst.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/sponsor.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/__init__.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/available-admonition.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/broken-links-issue.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/bump-version.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/detect-squash-merge.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/development-warning.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/fix-changelog.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/fix-typos.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-images.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-json.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-markdown.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-pyproject.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-python.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-shell.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/generated-footer.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/github-releases.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/immutable-releases.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/prepare-release.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/refresh-tip.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/release-notes.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/release-sync-report.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/renovate-migration.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-token.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-verify.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-bumpversion.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-gitignore.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-mailmap.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-repomatic.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-uv-lock.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/unavailable-admonition.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/update-deps-graph.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/update-docs.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/yanked-admonition.md +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/test_matrix.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/test_plan.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/tool_runner.py +0 -0
- {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/uv.py +0 -0
- {repomatic-6.25.0 → 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
|
|
@@ -45,7 +45,6 @@ Classifier: Topic :: Utilities
|
|
|
45
45
|
Classifier: Typing :: Typed
|
|
46
46
|
Requires-Dist: backports-strenum>=1 ; python_full_version < '3.11'
|
|
47
47
|
Requires-Dist: boltons>=25
|
|
48
|
-
Requires-Dist: bump-my-version>=1.2.6
|
|
49
48
|
Requires-Dist: click-extra>=7.19
|
|
50
49
|
Requires-Dist: extra-platforms>=12.0.2
|
|
51
50
|
Requires-Dist: packaging>=17
|
|
@@ -59,7 +58,7 @@ Requires-Dist: wcmatch>=10
|
|
|
59
58
|
Requires-Python: >=3.10
|
|
60
59
|
Project-URL: Changelog, https://github.com/kdeldycke/repomatic/blob/main/changelog.md
|
|
61
60
|
Project-URL: Documentation, https://kdeldycke.github.io/repomatic
|
|
62
|
-
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
|
|
63
62
|
Project-URL: Funding, https://github.com/sponsors/kdeldycke
|
|
64
63
|
Project-URL: Homepage, https://github.com/kdeldycke/repomatic
|
|
65
64
|
Project-URL: Issues, https://github.com/kdeldycke/repomatic/issues
|
|
@@ -73,8 +72,9 @@ Description-Content-Type: text/markdown
|
|
|
73
72
|
[](https://pypi.org/project/repomatic/)
|
|
74
73
|
[](https://pypi.org/project/repomatic/)
|
|
75
74
|
[](https://pepy.tech/projects/repomatic)
|
|
76
|
-
[](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
|
|
77
76
|
[](https://app.codecov.io/gh/kdeldycke/repomatic)
|
|
77
|
+
[](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
|
|
78
78
|
|
|
79
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.
|
|
80
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 = [
|
|
@@ -79,9 +79,6 @@ dependencies = [
|
|
|
79
79
|
"backports-strenum>=1; python_version<'3.11'",
|
|
80
80
|
# boltons 25.0.0 dropped Python 3.9, matching our requires-python >= 3.10.
|
|
81
81
|
"boltons>=25",
|
|
82
|
-
# bumpversion.config.files.find_config_file() and bumpversion.show.resolve_name()
|
|
83
|
-
# stabilized in 1.x; 1.2.6 fixes Click compatibility affecting our CLI integration.
|
|
84
|
-
"bump-my-version>=1.2.6",
|
|
85
82
|
# Click Extra 7.19.0 ships the `click-extra man --output-dir DIR SCRIPT` CLI
|
|
86
83
|
# the release engine's manpages job shells out to.
|
|
87
84
|
"click-extra>=7.19",
|
|
@@ -126,7 +123,7 @@ repomatic = "repomatic.__main__:main"
|
|
|
126
123
|
[project.urls]
|
|
127
124
|
"Changelog" = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
|
|
128
125
|
"Documentation" = "https://kdeldycke.github.io/repomatic"
|
|
129
|
-
"Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.
|
|
126
|
+
"Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0"
|
|
130
127
|
"Funding" = "https://github.com/sponsors/kdeldycke"
|
|
131
128
|
"Homepage" = "https://github.com/kdeldycke/repomatic"
|
|
132
129
|
"Issues" = "https://github.com/kdeldycke/repomatic/issues"
|
|
@@ -185,16 +182,6 @@ typing = [
|
|
|
185
182
|
[tool.uv]
|
|
186
183
|
# Docs group requires Python >= 3.14 for recent MyST-Parser and click-extra features.
|
|
187
184
|
dependency-groups.docs = { requires-python = ">= 3.14" }
|
|
188
|
-
# bump-my-version 1.3.0 caps click at <8.4, which conflicts with click-extra
|
|
189
|
-
# 7.19.0's click>=8.4.1 floor. Override the cap until upstream relaxes it
|
|
190
|
-
# (callowayproject/bump-my-version#382 was the last bump, to <8.4). We only
|
|
191
|
-
# import bump-my-version's config-loading helpers (get_configuration,
|
|
192
|
-
# find_config_file, resolve_name), none of which touch click 8.4-sensitive
|
|
193
|
-
# Sentinel handling, so the override is safe in practice.
|
|
194
|
-
# NOTE: [tool.uv] override-dependencies is NOT read by `uvx --from .`
|
|
195
|
-
# (tool invocations are isolated from project settings). Workflows propagate
|
|
196
|
-
# this override via UV_OVERRIDE=uv-overrides.txt. See uv-overrides.txt.
|
|
197
|
-
override-dependencies = [ "click>=8.4.1" ]
|
|
198
185
|
# Cooldown period: 7-day buffer before using newly released packages.
|
|
199
186
|
# Relative dates are fine here: uv 0.11.8+ writes a sentinel timestamp to
|
|
200
187
|
# uv.lock for relative spans, so re-resolving never produces churn.
|
|
@@ -217,7 +204,7 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
|
|
|
217
204
|
file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
|
|
218
205
|
# Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
|
|
219
206
|
# package version by the dedicated [tool.bumpversion] rule that strips the suffix.
|
|
220
|
-
file-version = "6.
|
|
207
|
+
file-version = "6.26.0"
|
|
221
208
|
include-data-dir = [
|
|
222
209
|
"repomatic/data/awesome_template=repomatic/data/awesome_template",
|
|
223
210
|
]
|
|
@@ -235,7 +222,7 @@ include-package-data = [ "click_extra" ]
|
|
|
235
222
|
linux-icon = "docs/assets/icon.png"
|
|
236
223
|
macos-app-icon = "docs/assets/icon.icns"
|
|
237
224
|
product-name = "Repomatic"
|
|
238
|
-
product-version = "6.
|
|
225
|
+
product-version = "6.26.0"
|
|
239
226
|
windows-icon-from-ico = "docs/assets/icon.ico"
|
|
240
227
|
|
|
241
228
|
[tool.ruff]
|
|
@@ -319,7 +306,7 @@ run.source = [ "repomatic" ]
|
|
|
319
306
|
report.precision = 2
|
|
320
307
|
|
|
321
308
|
[tool.bumpversion]
|
|
322
|
-
current_version = "6.
|
|
309
|
+
current_version = "6.26.0"
|
|
323
310
|
allow_dirty = true
|
|
324
311
|
ignore_missing_files = true
|
|
325
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"},
|
|
@@ -22,14 +22,6 @@ name: 🚀 Build & release
|
|
|
22
22
|
|
|
23
23
|
permissions: {}
|
|
24
24
|
|
|
25
|
-
env:
|
|
26
|
-
# bump-my-version caps click at <8.4; click-extra>=7.18 requires >=8.4.1.
|
|
27
|
-
# [tool.uv] override-dependencies is not read by uvx --from ., so propagate
|
|
28
|
-
# the override via UV_OVERRIDE. The override is safe: we only import
|
|
29
|
-
# bump-my-version's config-loading helpers, none of which touch Click 8.4-
|
|
30
|
-
# sensitive code. See uv-overrides.txt for the full rationale.
|
|
31
|
-
UV_OVERRIDE: uv-overrides.txt
|
|
32
|
-
|
|
33
25
|
concurrency:
|
|
34
26
|
# Release commits get a unique SHA-based group so they can never be cancelled.
|
|
35
27
|
# See repomatic/github/actions.py for rationale.
|
|
@@ -65,16 +57,16 @@ jobs:
|
|
|
65
57
|
run: git branch --all
|
|
66
58
|
- name: List all commits
|
|
67
59
|
run: git log --decorate=full --oneline
|
|
68
|
-
- uses: astral-sh/setup-uv@
|
|
60
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
69
61
|
- name: Run repomatic metadata
|
|
70
62
|
id: metadata
|
|
71
63
|
run: >
|
|
72
|
-
uvx --no-progress 'repomatic==6.
|
|
64
|
+
uvx --no-progress 'repomatic==6.26.0' metadata
|
|
73
65
|
--format github-json --output "$GITHUB_OUTPUT"
|
|
74
66
|
new_commits_matrix release_commits_matrix build_targets nuitka_matrix
|
|
75
|
-
is_python_project package_name current_version
|
|
76
|
-
release_notes release_notes_with_admonition
|
|
77
|
-
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
|
|
78
70
|
- name: Check VirusTotal API key
|
|
79
71
|
id: check-vt-key
|
|
80
72
|
env:
|
|
@@ -109,9 +101,26 @@ jobs:
|
|
|
109
101
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
110
102
|
with:
|
|
111
103
|
ref: ${{ matrix.commit }}
|
|
112
|
-
- uses: astral-sh/setup-uv@
|
|
104
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
113
105
|
- name: Setup venv
|
|
114
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}
|
|
115
124
|
- name: Pre-bake build metadata
|
|
116
125
|
if: contains(matrix.current_version, '.dev')
|
|
117
126
|
run: uvx --no-progress 'click-extra==7.18.0' prebake all
|
|
@@ -133,7 +142,7 @@ jobs:
|
|
|
133
142
|
# NUITKA_PYTHON_FLAGS holds the entry point's --python-flag (if any),
|
|
134
143
|
# meant to word-split.
|
|
135
144
|
# shellcheck disable=SC2086
|
|
136
|
-
uvx --no-progress 'repomatic==6.
|
|
145
|
+
uvx --no-progress 'repomatic==6.26.0' run nuitka -- \
|
|
137
146
|
${NUITKA_PYTHON_FLAGS} \
|
|
138
147
|
--output-filename="${BIN_NAME}" "${MODULE_PATH}"
|
|
139
148
|
- name: Upload Nuitka crash report
|
|
@@ -167,7 +176,7 @@ jobs:
|
|
|
167
176
|
BIN_NAME: ${{ matrix.bin_name }}
|
|
168
177
|
shell: bash
|
|
169
178
|
run: >
|
|
170
|
-
uvx --no-progress 'repomatic==6.
|
|
179
|
+
uvx --no-progress 'repomatic==6.26.0'
|
|
171
180
|
verify-binary --target "${TARGET}" --binary "${BIN_NAME}"
|
|
172
181
|
- name: Upload binaries
|
|
173
182
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
@@ -242,14 +251,14 @@ jobs:
|
|
|
242
251
|
DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
|
|
243
252
|
BIN_NAME: ${{ matrix.bin_name }}
|
|
244
253
|
run: chmod +x "${DOWNLOAD_PATH}/${BIN_NAME}"
|
|
245
|
-
- uses: astral-sh/setup-uv@
|
|
254
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
246
255
|
- name: Run test plan for binary
|
|
247
256
|
env:
|
|
248
257
|
DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
|
|
249
258
|
BIN_NAME: ${{ matrix.bin_name }}
|
|
250
259
|
shell: bash
|
|
251
260
|
run: >
|
|
252
|
-
uvx --no-progress 'repomatic==6.
|
|
261
|
+
uvx --no-progress 'repomatic==6.26.0' test-plan
|
|
253
262
|
--binary "${DOWNLOAD_PATH}/${BIN_NAME}"
|
|
254
263
|
|
|
255
264
|
create-tag:
|
|
@@ -270,7 +279,7 @@ jobs:
|
|
|
270
279
|
# PAT required so tag pushes trigger downstream on.push.tags workflows.
|
|
271
280
|
# See repomatic/git_ops.py module docstring.
|
|
272
281
|
token: ${{ secrets.REPOMATIC_PAT || github.token }}
|
|
273
|
-
- uses: astral-sh/setup-uv@
|
|
282
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
274
283
|
- name: Create and push tag
|
|
275
284
|
# Idempotent: skips if tag already exists instead of failing. This allows re-running
|
|
276
285
|
# workflows interrupted after tag creation.
|
|
@@ -278,7 +287,7 @@ jobs:
|
|
|
278
287
|
CURRENT_VERSION: ${{ matrix.current_version }}
|
|
279
288
|
COMMIT: ${{ matrix.commit }}
|
|
280
289
|
run: >
|
|
281
|
-
uvx --no-progress 'repomatic==6.
|
|
290
|
+
uvx --no-progress 'repomatic==6.26.0' git-tag
|
|
282
291
|
--tag "v${CURRENT_VERSION}"
|
|
283
292
|
--commit "${COMMIT}"
|
|
284
293
|
--skip-existing
|
|
@@ -302,7 +311,7 @@ jobs:
|
|
|
302
311
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
303
312
|
with:
|
|
304
313
|
ref: ${{ matrix.commit }}
|
|
305
|
-
- uses: astral-sh/setup-uv@
|
|
314
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
306
315
|
with:
|
|
307
316
|
enable-cache: false
|
|
308
317
|
- name: Download Python package
|
|
@@ -319,7 +328,7 @@ jobs:
|
|
|
319
328
|
continue-on-error: true
|
|
320
329
|
env:
|
|
321
330
|
GH_TOKEN: ${{ secrets.REPOMATIC_PAT || github.token }}
|
|
322
|
-
run: uvx --no-progress 'repomatic==6.
|
|
331
|
+
run: uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live --delete
|
|
323
332
|
- name: Create GitHub release draft
|
|
324
333
|
# Idempotent: skips if release already exists (e.g. workflow re-run).
|
|
325
334
|
env:
|
|
@@ -417,7 +426,7 @@ jobs:
|
|
|
417
426
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
418
427
|
with:
|
|
419
428
|
ref: ${{ matrix.commit }}
|
|
420
|
-
- uses: astral-sh/setup-uv@
|
|
429
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
421
430
|
with:
|
|
422
431
|
enable-cache: false
|
|
423
432
|
- name: Install project
|
|
@@ -469,7 +478,7 @@ jobs:
|
|
|
469
478
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
470
479
|
with:
|
|
471
480
|
ref: ${{ matrix.commit }}
|
|
472
|
-
- uses: astral-sh/setup-uv@
|
|
481
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
473
482
|
with:
|
|
474
483
|
enable-cache: false
|
|
475
484
|
- name: Download release binaries
|
|
@@ -488,7 +497,7 @@ jobs:
|
|
|
488
497
|
VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
|
|
489
498
|
CURRENT_VERSION: ${{ matrix.current_version }}
|
|
490
499
|
run: >
|
|
491
|
-
uvx --no-progress 'repomatic==6.
|
|
500
|
+
uvx --no-progress 'repomatic==6.26.0' scan-virustotal
|
|
492
501
|
--tag "v${CURRENT_VERSION}"
|
|
493
502
|
--repo "${{ github.repository }}"
|
|
494
503
|
--binaries-dir ./binaries
|
|
@@ -498,7 +507,7 @@ jobs:
|
|
|
498
507
|
VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
|
|
499
508
|
CURRENT_VERSION: ${{ matrix.current_version }}
|
|
500
509
|
run: >
|
|
501
|
-
uvx --no-progress 'repomatic==6.
|
|
510
|
+
uvx --no-progress 'repomatic==6.26.0' scan-virustotal
|
|
502
511
|
--tag "v${CURRENT_VERSION}"
|
|
503
512
|
--repo "${{ github.repository }}"
|
|
504
513
|
--poll
|
|
@@ -523,7 +532,7 @@ jobs:
|
|
|
523
532
|
contents: write
|
|
524
533
|
steps:
|
|
525
534
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
526
|
-
- uses: astral-sh/setup-uv@
|
|
535
|
+
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
527
536
|
- name: Download all build artifacts
|
|
528
537
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
529
538
|
with:
|
|
@@ -533,5 +542,5 @@ jobs:
|
|
|
533
542
|
env:
|
|
534
543
|
GH_TOKEN: ${{ github.token }}
|
|
535
544
|
run: >
|
|
536
|
-
uvx --no-progress 'repomatic==6.
|
|
545
|
+
uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live
|
|
537
546
|
--upload-assets release_assets
|