From 3a7f8efe60eedeac4d03489521a6acb5249e480e Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 11 Jun 2025 17:02:35 +0200 Subject: [PATCH] tools: improve release proposal linter PR-URL: https://github.com/nodejs/node/pull/58647 Reviewed-By: Marco Ippolito Reviewed-By: Rafael Gonzaga Reviewed-By: Tierney Cyren Reviewed-By: Xuguang Mei --- .../lint-release-proposal-commit-list.mjs | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/tools/actions/lint-release-proposal-commit-list.mjs b/tools/actions/lint-release-proposal-commit-list.mjs index c0cef2dcf02..b6ec7213baf 100755 --- a/tools/actions/lint-release-proposal-commit-list.mjs +++ b/tools/actions/lint-release-proposal-commit-list.mjs @@ -5,7 +5,8 @@ // // Example: // $ git log upstream/vXX.x...upstream/vX.X.X-proposal \ -// --format='{"prURL":"%(trailers:key=PR-URL,valueonly,separator=)","title":"%s","smallSha":"%h"}' \ +// --reverse --format='{"prURL":"%(trailers:key=PR-URL,valueonly,separator=)","title":"%s","smallSha":"%h"}' \ +// | sed 's/,"title":"Revert "\([^"]\+\)""/,"title":"Revert \\"\1\\""/g' \ // | ./lint-release-proposal-commit-list.mjs "path/to/CHANGELOG.md" "$(git rev-parse upstream/vX.X.X-proposal)" const [,, CHANGELOG_PATH, RELEASE_COMMIT_SHA] = process.argv; @@ -52,20 +53,33 @@ for await (const line of stdinLineByLine) { assert.notStrictEqual(lineStart, -1, `Cannot find ${smallSha} on the list`); const lineEnd = commitList.indexOf('\n', lineStart + 1); - const colonIndex = title.indexOf(':'); - const expectedCommitTitle = `${`**${title.slice(0, colonIndex)}`.replace('**Revert "', '_**Revert**_ "**')}**${title.slice(colonIndex)}`; try { - assert(commitList.lastIndexOf(`/${smallSha})] - ${expectedCommitTitle} (`, lineEnd) > lineStart, `Commit title doesn't match`); - } catch (e) { - if (e?.code === 'ERR_ASSERTION') { - e.operator = 'includes'; - e.expected = expectedCommitTitle; - e.actual = commitList.slice(lineStart + 1, lineEnd); + const colonIndex = title.indexOf(':'); + const expectedCommitTitle = `${`**${title.slice(0, colonIndex)}`.replace('**Revert "', '_**Revert**_ "**')}**${title.slice(colonIndex)}`; + try { + assert(commitList.lastIndexOf(`/${smallSha})] - ${expectedCommitTitle} (`, lineEnd) > lineStart, `Changelog entry doesn't match for ${smallSha}`); + } catch (e) { + if (e?.code === 'ERR_ASSERTION') { + e.operator = 'includes'; + e.expected = expectedCommitTitle; + e.actual = commitList.slice(lineStart + 1, lineEnd); + } + throw e; } - throw e; - } - assert.strictEqual(commitList.slice(lineEnd - prURL.length - 2, lineEnd), `(${prURL})`, `when checking ${smallSha} ${title}`); + assert.strictEqual(commitList.slice(lineEnd - prURL.length - 2, lineEnd), `(${prURL})`, `when checking ${smallSha} ${title}`); + } catch (e) { + if (e?.code !== 'ERR_ASSERTION') { + throw e; + } + let line = 1; + for (let i = 0; i < lineStart + commitListingStart; i = changelog.indexOf('\n', i + 1)) { + line++; + } + console.error(`::error file=${CHANGELOG_PATH},line=${line},title=Release proposal linter::${e.message}`); + console.error(e); + process.exitCode ||= 1; + } expectedNumberOfCommitsLeft--; console.log(prURL); }