diff --git a/CHANGELOG.rst b/CHANGELOG.rst new file mode 100644 index 0000000..65e2caa --- /dev/null +++ b/CHANGELOG.rst @@ -0,0 +1,114 @@ +^^^^^^^^^ +Changelog +^^^^^^^^^ + +1.16.1 (2026-10-22) +------------------- +* fix(release): name what an override downgrades in the release summary (#31) + +1.16.0 (2026-10-21) +------------------- +* feat(release): carry a package's source tarball to the archive (#27) +* feat(release)!: build the .deb for amd64 and arm64 on native runners (#26) + +1.15.0 (2026-10-21) +------------------- +* feat(ci)!: evaluate also repos.list of every dependency (#29) +* fix(release): detect packages whose package.xml is at the repository root (#25) + +1.14.0 (2026-10-19) +------------------- +* fix(ici): send CI_PAT as an auth header and disable git prompts (#24) +* feat(ici): install every requirements.txt in the repository (#23) + +1.13.0 (2026-10-14) +------------------- +* No changes. + +1.12.0 (2026-10-14) +------------------- +* fix: title check for new packages with previously empty version (#21) + +1.11.0 (2026-10-14) +------------------- +* feat(orchestrator): add extra_distros input (#22) + +1.10.0 (2026-10-12) +------------------- +* feat(ci): publish status badges to a badges branch (#20) + +1.9.0 (2026-10-05) +------------------ +* feat: publish a built package into a signed archive root (#19) + +1.8.0 (2026-09-14) +------------------ +* fix: make workflows composite actions and expand allowed title types (#18) + +1.7.3 (2026-09-10) +------------------ +* chore: add gh all workflows that require it (#16) + +1.7.2 (2026-09-10) +------------------ +* chore: add gh to runner scratch environment (#15) + +1.7.1 (2026-09-09) +------------------ +* fix: release regex coverage and runner inputs to workflows (#14) + +1.7.0 (2026-09-09) +------------------ +* feat(release): generate release pull requests, per package or per repo (#13) +* ci: update CI orchestrator workflow to use duatic_devtools (#12) +* ci: add reusable title check workflow (#11) + +1.6.1 (2026-09-03) +------------------ +* ci: pin the shared pre-commit config to devtools v1 (#10) + +1.6.0 (2026-09-03) +------------------ +* feat: add release helpers (#9) +* ci: add reusable release check workflow (#8) + +1.5.1 (2026-08-26) +------------------ +* fix: increase job timeout from 30 to 60 minutes (#7) + +1.5.0 (2026-08-25) +------------------ +* feat(ci): test with cyclonedds (#6) + +1.4.1 (2026-08-05) +------------------ +* fix: stop @claude review from cancelling itself (#5) + +1.4.0 (2026-08-05) +------------------ +* feat: add @claude review on PRs (#4) + +1.3.2 (2026-07-22) +------------------ +* feat(ci): run all orchestrator jobs on the configured runner + +1.3.1 (2026-07-16) +------------------ +* fix: update badges for skipped or cancelled runs + +1.3.0 (2026-07-14) +------------------ +* feat(ci): add opt-in gist-backed status badges (#3) + +1.2.0 (2026-07-04) +------------------ +* feat(ci): auto-detect requirements.txt and Aptfile in reusable_ici.yml +* feat(ci): add Release workflow (#2) + +1.1.0 (2026-07-03) +------------------ +* feat(ci): add orchestrator entry point, centralize matrix and policy + +1.0.0 (2026-07-03) +------------------ +* feat(ci): add reusable ROS industrial_ci and pre-commit workflows diff --git a/README.md b/README.md index 53a1da2..797c1a6 100644 --- a/README.md +++ b/README.md @@ -446,7 +446,8 @@ with `release:` is left alone. Once that `CHANGELOG.rst` exists, the `release-check` and `title-check` actions check the repository on it: a new version section needs a `release:` title naming it, must come after the last tag, and a -`release:` title needs a new section. +`release:` title needs a new section. A section for a version already tagged is history, which any +pull request may add. ```yaml # .github/workflows/release.yml diff --git a/release/check_release_pr.py b/release/check_release_pr.py index dbfaacf..eefac09 100755 --- a/release/check_release_pr.py +++ b/release/check_release_pr.py @@ -39,7 +39,8 @@ A repository whose root holds CHANGELOG.rst and no package.xml is versioned by that changelog and its v tags instead, and any package.xml deeper in it is not released: a release adds one version section there, ahead of the base's and of every tag, and a section added in any other pull -request is a release nobody titled as one. +request is a release nobody titled as one. A section for a version already tagged is history, not a +release, so the changelog of earlier releases can be added at any time. Usage: check_release_pr.py --base origin/main [--head HEAD] [--title "release: ..."] Exit 0 if consistent, 1 if not. @@ -112,20 +113,25 @@ def changelog_versions(ref, path): return {m.group(1) for m in SECTION.finditer(blob)} -def latest_repo_tag(): - """The highest version among the v tags, or None.""" - versions = [ +def repo_tags(): + """The versions of the v tags.""" + return { t[1:] for t in git("tag", "--list", "v*").split() if as_tuple(t[1:]) and len(as_tuple(t[1:])) == 3 - ] + } + + +def latest_repo_tag(): + """The highest version among the v tags, or None.""" + versions = repo_tags() return max(versions, key=as_tuple) if versions else None def check_changelog_repo(merge_base, head, title, is_release): """The release check for a repository released by its root CHANGELOG.rst. Returns the exit code.""" path = "CHANGELOG.rst" - added = changelog_versions(head, path) - changelog_versions(merge_base, path) + added = changelog_versions(head, path) - changelog_versions(merge_base, path) - repo_tags() problems = [] new = None if len(added) > 1: diff --git a/release/test_check_release_pr.sh b/release/test_check_release_pr.sh index 076d2ff..b3620d0 100755 --- a/release/test_check_release_pr.sh +++ b/release/test_check_release_pr.sh @@ -139,6 +139,26 @@ check 1 "root package bumped, titled as a feature" "feat: something" WORK="${WORK%/root_pkg}" # so the trap removes the outer repository too +echo "=== a repository released by its root changelog may add the history of its tags ===" +WORK="$WORK/changelog_repo" && mkdir "$WORK" && cd "$WORK" +git init -q -b main . && git config user.email t@duatic.invalid && git config user.name t +echo readme > README.md && git add -A && git commit -qm baseline +git tag v1.0.0 && git tag v1.1.0 +section() { printf '%s\n%s\n* something\n\n' "$1" "$(printf '%*s' ${#1} '' | tr ' ' '-')"; } +history() { printf '^^^^^^^^^\nChangelog\n^^^^^^^^^\n\n'; for v in "$@"; do section "$v (2026-01-01)"; done; } +git checkout -qb h1 +history 1.1.0 1.0.0 > CHANGELOG.rst && git add -A && git commit -qm "docs(changelog): add the earlier releases" +check 0 "sections for tagged versions, titled as docs" "docs(changelog): add the earlier releases" +git checkout -q main && git checkout -qb h2 +history 1.2.0 1.1.0 1.0.0 > CHANGELOG.rst && git add -A && git commit -qm "release: 1.2.0" +check 0 "the earlier releases and a new one, titled as a release" "release: 1.2.0" +check 1 "the same, titled as docs" "docs(changelog): add the earlier releases" +git checkout -q main && git checkout -qb h3 +history 1.0.1 1.0.0 > CHANGELOG.rst && git add -A && git commit -qm "release: 1.0.1" +check 1 "a section for an untagged version behind the tags" "release: 1.0.1" + +WORK="${WORK%/changelog_repo}" + echo echo " $pass passed, $fail failed" [ "$fail" -eq 0 ]