From c02e308739452f760d0cb54386da5fbc36bdf3e7 Mon Sep 17 00:00:00 2001 From: Matt Fiddaman Date: Mon, 27 Apr 2026 21:52:07 +0100 Subject: [PATCH] fix cherrypicked commits not being respected and lint race in release note generation workflow (#7640) * fix cherrypicked commits not being respected and lint race * note * coderabbit suggestions * fix lint * make double restore possibility safe --- .../ci-actions/bin/release-notes-generate.mjs | 51 ++++++++++++++----- upcoming-release-notes/7640.md | 6 +++ 2 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 upcoming-release-notes/7640.md diff --git a/packages/ci-actions/bin/release-notes-generate.mjs b/packages/ci-actions/bin/release-notes-generate.mjs index d059ccfa73..7e9ff755fa 100644 --- a/packages/ci-actions/bin/release-notes-generate.mjs +++ b/packages/ci-actions/bin/release-notes-generate.mjs @@ -81,18 +81,35 @@ await group('Prepare branch', async () => { }); } - // the previous generation commit deletes source files from - // upcoming-release-notes, refetch them so we can regenerate from all of them + // recover deleted release note files from previous generation commits const baseRef = process.env.GITHUB_BASE_REF || 'master'; await exec(`git fetch origin ${baseRef}`, { stdio: 'inherit' }); const { stdout: mergeBase } = await exec( `git merge-base HEAD origin/${baseRef}`, ); const base = mergeBase.trim(); - console.log(`Restoring upcoming-release-notes from merge-base ${base}`); - await exec(`git checkout ${base} -- upcoming-release-notes`, { - stdio: 'inherit', - }); + const { stdout: genLog } = await exec( + `git log --grep='${commitMessage}' --format=%H ${base}..HEAD`, + ); + const genCommits = genLog.split('\n').filter(Boolean); + console.log( + `Reversing upcoming-release-notes deletions from ${genCommits.length} prior generation commit(s)`, + ); + const tmpDir = process.env.RUNNER_TEMP || '/tmp'; + for (const sha of genCommits) { + const patchPath = join(tmpDir, `revert-${sha}.patch`); + try { + await exec( + `git diff --diff-filter=D ${sha}~1..${sha} -- upcoming-release-notes > ${patchPath}`, + ); + const { size } = await fs.stat(patchPath); + if (size > 0) { + await exec(`git apply -R --3way ${patchPath}`, { stdio: 'inherit' }); + } + } finally { + await fs.unlink(patchPath).catch(() => undefined); + } + } }); const { notesByCategory, files } = await parseReleaseNotes( @@ -109,12 +126,13 @@ if (files.length === 0) { const highlights = '- TODO: Add release highlights'; -await group('Generate blog post', async () => { - const blogPath = join( - 'packages/docs/blog', - `${releaseDate}-release-${slug}.md`, - ); +const blogPath = join( + 'packages/docs/blog', + `${releaseDate}-release-${slug}.md`, +); +const releasesPath = 'packages/docs/docs/releases.md'; +await group('Generate blog post', async () => { const template = `--- title: Release ${version} description: New release of Actual. @@ -132,6 +150,7 @@ ${highlights} **Docker Tag: ${version}** ${AUTOGEN_MARKER} + ${categorizedNotes} `; @@ -161,7 +180,6 @@ ${categorizedNotes} }); await group('Update releases.md', async () => { - const releasesPath = 'packages/docs/docs/releases.md'; const existing = await fs.readFile(releasesPath, 'utf-8'); const sectionRe = new RegExp( @@ -193,6 +211,7 @@ ${highlights} **Docker Tag: ${version}** ${AUTOGEN_MARKER} + ${categorizedNotes}`; updated = existing.replace( '# Release Notes\n', @@ -210,6 +229,14 @@ await group('Remove used release notes', async () => { ); }); +await group('Lint generated files', async () => { + const targets = `${blogPath} ${releasesPath}`; + await exec(`yarn exec oxfmt ${targets}`, { stdio: 'inherit' }); + await exec(`yarn exec oxlint --fix --type-aware --quiet ${targets}`, { + stdio: 'inherit', + }); +}); + await group('Commit and push', async () => { await exec( 'git add upcoming-release-notes packages/docs/blog packages/docs/docs/releases.md', diff --git a/upcoming-release-notes/7640.md b/upcoming-release-notes/7640.md new file mode 100644 index 0000000000..bf30f5b336 --- /dev/null +++ b/upcoming-release-notes/7640.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [matt-fidd] +--- + +Make release note generation script respect cherry picked commits