build: add --unique option to release notes script (#34296)

Useful when looking for changes unique to a single branch
This commit is contained in:
Charles Kerr 2022-06-06 00:51:10 -05:00 committed by GitHub
parent 4f99e3e46c
commit 92b0f3e808
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 12 deletions

View file

@ -147,7 +147,7 @@ const getPreviousPoint = async (point) => {
} }
}; };
async function getReleaseNotes (range, newVersion) { async function getReleaseNotes (range, newVersion, unique) {
const rangeList = range.split('..') || ['HEAD']; const rangeList = range.split('..') || ['HEAD'];
const to = rangeList.pop(); const to = rangeList.pop();
const from = rangeList.pop() || (await getPreviousPoint(to)); const from = rangeList.pop() || (await getPreviousPoint(to));
@ -158,7 +158,7 @@ async function getReleaseNotes (range, newVersion) {
const notes = await notesGenerator.get(from, to, newVersion); const notes = await notesGenerator.get(from, to, newVersion);
const ret = { const ret = {
text: notesGenerator.render(notes) text: notesGenerator.render(notes, unique)
}; };
if (notes.unknown.length) { if (notes.unknown.length) {
@ -170,7 +170,7 @@ async function getReleaseNotes (range, newVersion) {
async function main () { async function main () {
const opts = minimist(process.argv.slice(2), { const opts = minimist(process.argv.slice(2), {
boolean: ['help'], boolean: ['help', 'unique'],
string: ['version'] string: ['version']
}); });
opts.range = opts._.shift(); opts.range = opts._.shift();
@ -179,13 +179,14 @@ async function main () {
console.log(` console.log(`
easy usage: ${name} version easy usage: ${name} version
full usage: ${name} [begin..]end [--version version] full usage: ${name} [begin..]end [--version version] [--unique]
* 'begin' and 'end' are two git references -- tags, branches, etc -- * 'begin' and 'end' are two git references -- tags, branches, etc --
from which the release notes are generated. from which the release notes are generated.
* if omitted, 'begin' defaults to the previous tag in end's branch. * if omitted, 'begin' defaults to the previous tag in end's branch.
* if omitted, 'version' defaults to 'end'. Specifying a version is * if omitted, 'version' defaults to 'end'. Specifying a version is
useful if you're making notes on a new version that isn't tagged yet. useful if you're making notes on a new version that isn't tagged yet.
* '--unique' omits changes that also landed in other branches.
For example, these invocations are equivalent: For example, these invocations are equivalent:
${process.argv[1]} v4.0.1 ${process.argv[1]} v4.0.1
@ -194,7 +195,7 @@ For example, these invocations are equivalent:
return 0; return 0;
} }
const notes = await getReleaseNotes(opts.range, opts.version); const notes = await getReleaseNotes(opts.range, opts.version, opts.unique);
console.log(notes.text); console.log(notes.text);
if (notes.warning) { if (notes.warning) {
throw new Error(notes.warning); throw new Error(notes.warning);

View file

@ -596,10 +596,14 @@ function renderDescription (commit) {
const renderNote = (commit, excludeBranch) => const renderNote = (commit, excludeBranch) =>
`* ${renderDescription(commit)} ${renderLink(commit)} ${renderTrops(commit, excludeBranch)}\n`; `* ${renderDescription(commit)} ${renderLink(commit)} ${renderTrops(commit, excludeBranch)}\n`;
const renderNotes = (notes) => { const renderNotes = (notes, unique = false) => {
const rendered = [`# Release Notes for ${notes.name}\n\n`]; const rendered = [`# Release Notes for ${notes.name}\n\n`];
const renderSection = (title, commits) => { const renderSection = (title, commits, unique) => {
if (unique) {
// omit changes that also landed in other branches
commits = commits.filter((commit) => renderTrops(commit, notes.toBranch).length === 0);
}
if (commits.length > 0) { if (commits.length > 0) {
rendered.push( rendered.push(
`## ${title}\n\n`, `## ${title}\n\n`,
@ -608,17 +612,17 @@ const renderNotes = (notes) => {
} }
}; };
renderSection('Breaking Changes', notes.breaking); renderSection('Breaking Changes', notes.breaking, unique);
renderSection('Features', notes.feat); renderSection('Features', notes.feat, unique);
renderSection('Fixes', notes.fix); renderSection('Fixes', notes.fix, unique);
renderSection('Other Changes', notes.other); renderSection('Other Changes', notes.other, unique);
if (notes.docs.length) { if (notes.docs.length) {
const docs = notes.docs.map(commit => renderLink(commit)).sort(); const docs = notes.docs.map(commit => renderLink(commit)).sort();
rendered.push('## Documentation\n\n', ` * Documentation changes: ${docs.join(', ')}\n`, '\n'); rendered.push('## Documentation\n\n', ` * Documentation changes: ${docs.join(', ')}\n`, '\n');
} }
renderSection('Unknown', notes.unknown); renderSection('Unknown', notes.unknown, unique);
return rendered.join(''); return rendered.join('');
}; };