feat(release): build notes from highlights and the change list together - #393
Merged
Conversation
581a33c added this check to catch a missing `### Highlights` while it was still an edit, because v1.34.2 through v1.34.4 each cut a tag and a GitHub release with no DMG behind them. That part works and stays. What it did not account for is that release-please never writes that section, so every release PR fails this by construction — and the version comes from the manifest, so once one merged red, every other PR failed the same way, at a step ahead of Lint, Build and Test. Nothing reached the compiler for 22 hours after 1.35.0, and #386 had to smuggle the changelog fix into a UI PR to verify itself. Keep it fatal on the release PR and on master, where it guards the tag and says master is unshippable. Everywhere else report the same finding as a warning: still visible, no longer everyone's outage. Both paths now spell out what to add and why.
Greptile SummaryThe PR builds Sparkle release notes from optional curated Highlights followed by selected user-facing changelog sections, while retaining rejection when both sources are empty.
Confidence Score: 4/5The PR does not appear safe to merge until ordinary pull requests distinguish an expected lack of user-facing notes from unexpected release-note generation failures. The existing catch-all remains: any nonzero release-note command result on an ordinary pull request, including missing releases and filesystem failures, is converted into a successful warning rather than failing CI. Files Needing Attention: .github/workflows/pr.yml
|
| Filename | Overview |
|---|---|
| .github/workflows/pr.yml | Scopes the release-note gate by branch and event, but still conflates expected empty-note failures with unrelated command and I/O failures on ordinary pull requests. |
| xtask/src/commands/release/notes.rs | Combines Highlights with user-facing changelog sections, strips generated link trailers, rejects empty output, and adds representative tests. |
| CONTRIBUTING.md | Documents Highlights as optional when user-facing changelog entries provide fallback release notes. |
| xtask/README.md | Updates the release-notes command description to reflect combined extraction and empty-output rejection. |
Reviews (3): Last reviewed commit: "Merge branch 'master' into ci/scope-high..." | Re-trigger Greptile
Highlights were the *only* source of release notes, so a release without them had nothing to ship and `release notes` refused to build — which is why every release PR failed by construction and why v1.34.2 through v1.34.4 each cut a tag with no DMG behind it. The prose and the list answer different questions. Curated Highlights say why to update; the Features and Bug Fixes entries say what changed. Emit both, in that order, and let either be absent. Only a release with neither now fails, which is a real signal rather than a standing tax: a bare engine bump lands under Miscellaneous and produces no user-facing entry, so a human still has to say what it means. Section titles reuse ChangelogParser's user-facing set, so the About window and the update dialog cannot disagree about what counts. The `([#387](…)) ([abc1234](…))` trailers are dropped — right for a changelog, noise in an update dialog.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Highlights were the only source of release notes, so a release without them had nothing to ship and
cargo xtask release notesrefused to build. Two consequences, both observed:release.yml:80), and it runs after release-please has already tagged.Lint/Build/Run Tests— 22 hours of blocked CI after 1.35.0, and fix(ui): slide the detail tab indicator instead of morphing glass #386 had to smuggle the changelog fix into a UI PR to verify itself.The change
The prose and the list answer different questions. Curated Highlights say why to update; Features and Bug Fixes say what changed. So emit both, in that order, and let either be absent.
Live, against the current release branch:
Before —
Error: release 1.37.0 has no non-empty ### Highlights sectionAfter
And with Highlights written (real 1.36.0), the two appear together:
What still fails, and why that one is worth keeping
Only a release with neither prose nor user-facing entries. That is a real signal instead of a standing tax: a bare engine bump lands under
Miscellaneous, produces no user-facing entry, and genuinely needs a human to say what it means — 1.36.1 was exactly that release.Two supporting decisions:
ChangelogParser's user-facing set (Features,Bug Fixes,Performance,Security), so the About window and the update dialog cannot disagree about what counts as user-facing.([#387](…)) ([abc1234](…))trailers are stripped. Right for a changelog, noise in an update dialog — and shipping them would reintroduce exactly what fix(updater): embed release notes in appcast instead of linking GitHub #233 removed when it stopped linking GitHub. Judgment call, reversible by deletingstrip_trailing_links; say the word if you'd rather keep them.Second commit: scope the gate
Kept from the earlier version of this PR. Fatal on the release PR and on master, where it guards the tag and says master is unshippable; a warning on every other PR, where failing turned one bad release PR into everyone's outage.
github.head_refis read viaenv:rather than interpolated, since it is attacker-controllable on forked PRs.Verification
make test-xtask: 15 passed. Five new cases — pairing, fallback with no Highlights, the nothing-user-facing rejection, an absent release, and that link stripping leaves ordinary parenthesised prose alone.make lint-xtaskclean,actionlintclean,zizmoradds no new findings.CONTRIBUTING.mdandxtask/README.mdboth described Highlights as mandatory; updated.Not addressed
Nothing here stops a release PR merging red — the
masterruleset still has norequired_status_checksrule at all. That is a settings change; the prepared payload is still waiting.