diff --git a/README.md b/README.md index b5b2535..2aa2722 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ npm i changelog-maker -g `github-user` and `github-project` should point to the GitHub repository that can be used to find the `PR-URL` data if just an issue number is provided and will also impact how the PR-URL issue numbers are displayed * `--format`: dictates what formatting the output will have. Possible options are: `simple`, `markdown`, `plaintext`, `messageonly` and `sha`. The default is to print a `simple` output suitable for stdout. + - `sequence`: hybrid format that can be pasted directly in the sequence editor of a `git rebase --interactive` session, without retaining info such as commit title, author, labels, PR URL. - `simple`: don't print full markdown output, good for console printing without the additional fluff. - `sha`: print only the 10-character truncated commit hashes. - `plaintext`: a very simple form, without commit details, implies `--group`. @@ -60,6 +61,7 @@ npm i changelog-maker -g * `--start-ref=`: use the given git `` as a starting point rather than the _last tag_. The `` can be anything commit-ish including a commit sha, tag, branch name. If you specify a `--start-ref` argument the commit log will not be pruned so that version commits and `working on ` commits are left in the list. * `--end-ref=`: use the given git `` as a end-point rather than the _now_. The `` can be anything commit-ish including a commit sha, tag, branch name. * `--filter-release`: exclude Node-style release commits from the list. e.g. "Working on v1.0.0" or "2015-10-21 Version 2.0.0" and also "npm version X" style commits containing _only_ an `x.y.z` semver designator. +* `--sequence-drop=[,[,…]]`: when `--format=sequence`, will output the commits belonging to a PR with a label listed here as `drop` instead of `pick`. This can be useful for human backporter to understand why a specific commit does not apply cleanly, to spot which commit might be creating conflicts. * `--find-matching-prs`: use the GitHub API to find the pull requests that match commits that don't have the `PR-URL` metadata in their message text. Without metadata, it may be necessary to also pass the org/user and repo name on the commandline (as the `github-user` and `github-project` arguments as demonstrated above). * `--quiet` or `-q`: do not print to `process.stdout` * `--all` or `-a`: process all commits since beginning, instead of last tag. diff --git a/changelog-maker.js b/changelog-maker.js index c518bb9..08c100b 100755 --- a/changelog-maker.js +++ b/changelog-maker.js @@ -18,6 +18,7 @@ const { values, positionals } = parseArgs({ 'commit-url': { type: 'string' }, 'end-ref': { type: 'string' }, 'filter-release': { type: 'boolean' }, + 'sequence-drop': { type: 'string' }, 'find-matching-prs': { type: 'boolean' }, format: { type: 'string' }, group: { type: 'boolean', short: 'g' }, diff --git a/commit-to-output.js b/commit-to-output.js index 31bbfdb..45d9be2 100644 --- a/commit-to-output.js +++ b/commit-to-output.js @@ -33,6 +33,7 @@ export const formatType = { SHA: 'sha', PLAINTEXT: 'plaintext', MARKDOWN: 'markdown', + SEQUENCE: 'sequence', SIMPLE: 'simple', MESSAGEONLY: 'messageonly' } @@ -58,9 +59,8 @@ function toStringPlaintext (data) { return ` * ${s.trim()}` } -function toStringSimple (data) { +function toStringSimple (data, withLabels = false) { let s = '' - s += `* [${data.sha.substr(0, 10)}] - ` s += (data.semver || []).length ? `(${data.semver.join(', ').toUpperCase()}) ` : '' s += data.revert ? 'Revert "' : '' s += data.group ? `${data.group}: ` : '' @@ -68,8 +68,12 @@ function toStringSimple (data) { s += data.revert ? '" ' : ' ' s += data.author ? `(${data.author}) ` : '' s += data.pr ? data.prUrl : '' - s = s.trim() + if (withLabels && data.labels?.length) s += ' (' + data.labels.join(', ') + ')' + return s.trim() +} +function toStringSimpleWithListMarker (data) { + const s = `* [${data.sha.substr(0, 10)}] - ${toStringSimple(data)}` return (data.semver && data.semver.length) ? chalk.green.bold(s) : (data.group === 'doc' @@ -110,6 +114,7 @@ export function commitToOutput (commit, format, ghId, commitUrl) { data.sha = commit.sha data.shaUrl = commitUrl.replace(/\{ghUser\}/g, ghId.user).replace(/\{ghRepo\}/g, ghId.repo).replace(/\{ref\}/g, ref) data.semver = commit.labels && commit.labels.filter((l) => l.includes('semver')) + data.labels = commit.labels data.revert = isRevert(commit.summary) data.group = toGroups(commit.summary) data.summary = cleanGroupSummary(cleanRevertSummary(commit.summary)) @@ -119,7 +124,9 @@ export function commitToOutput (commit, format, ghId, commitUrl) { data.cveId = commit.cveId if (format === formatType.SIMPLE) { - return toStringSimple(data) + return toStringSimpleWithListMarker(data) + } else if (format === formatType.SEQUENCE) { + return toStringSimple(data, true) } else if (format === formatType.PLAINTEXT) { return toStringPlaintext(data) } else if (format === formatType.MESSAGEONLY) { diff --git a/process-commits.js b/process-commits.js index c54b232..0574282 100644 --- a/process-commits.js +++ b/process-commits.js @@ -43,6 +43,9 @@ export async function processCommits (argv, ghId, list) { if (format === formatType.SHA) { list = list.map((commit) => `${commit.sha.substr(0, 10)}`) + } else if (format === formatType.SEQUENCE) { + const droppableLabels = argv['sequence-drop']?.split(',') ?? [] + list = list.map((commit) => `${commit.labels?.some(l => droppableLabels.includes(l)) ? 'drop' : 'pick'} ${commit.sha} # ${commitToOutput(commit, format, ghId, commitUrl)}`) } else if ( format === formatType.PLAINTEXT || format === formatType.MESSAGEONLY diff --git a/test.js b/test.js index 59d037b..462930a 100644 --- a/test.js +++ b/test.js @@ -45,6 +45,32 @@ test('test simple', (t) => { t.end() }) +test('test sequence', (t) => { + t.equal(exec('--start-ref=v2.2.7 --end-ref=9c700d29 --group --filter-release --format=sequence'), + `pick cc442b65343cd1bb7cb4ecc3c6e729b4e4625f97 # (SEMVER-MINOR) minor nit (Rod Vagg) https://github.com/nodejs/node/pull/23715 (semver-minor, build, i18n-api) +pick 4f2b7f8136358bc3ecd720e33457fdeff9581733 # deps: use strip-ansi instead of chalk.stripColor (Rod Vagg) +pick 6898501e18f231db40a84b511d2a6a4b8f5f17f3 # deps: update deps, introduce test & lint deps (Rod Vagg) +pick 9c700d29104b5a22fcf79ba21f5f009d7f1cdfc5 # feature: refactor and improve --commit-url (Rod Vagg) +pick 50945246557b4a25133435b106d0e5dd5d88a9be # feature: make the commit url configurable via an additional argument (Jim Nielsen) https://github.com/nodejs/changelog-maker/pull/55 +pick 42f248cf8904224a585e9f3834cc1283713c56cf # src: use \`standard\` for linting (Rod Vagg) +pick 64a8fdef3c35627ca50c48e9acb80c57a3f6d2a2 # test: basic test infrastructure (Rod Vagg) +`) + t.end() +}) + +test('test sequence-drop', (t) => { + t.equal(exec('--start-ref=v2.2.7 --end-ref=9c700d29 --group --filter-release --format=sequence --reverse --sequence-drop=semver-minor'), + `pick 64a8fdef3c35627ca50c48e9acb80c57a3f6d2a2 # test: basic test infrastructure (Rod Vagg) +pick 42f248cf8904224a585e9f3834cc1283713c56cf # src: use \`standard\` for linting (Rod Vagg) +pick 50945246557b4a25133435b106d0e5dd5d88a9be # feature: make the commit url configurable via an additional argument (Jim Nielsen) https://github.com/nodejs/changelog-maker/pull/55 +pick 9c700d29104b5a22fcf79ba21f5f009d7f1cdfc5 # feature: refactor and improve --commit-url (Rod Vagg) +pick 6898501e18f231db40a84b511d2a6a4b8f5f17f3 # deps: update deps, introduce test & lint deps (Rod Vagg) +pick 4f2b7f8136358bc3ecd720e33457fdeff9581733 # deps: use strip-ansi instead of chalk.stripColor (Rod Vagg) +drop cc442b65343cd1bb7cb4ecc3c6e729b4e4625f97 # (SEMVER-MINOR) minor nit (Rod Vagg) https://github.com/nodejs/node/pull/23715 (semver-minor, build, i18n-api) +`) + t.end() +}) + test('test plaintext', (t) => { t.equal(exec('--start-ref=9c700d2 --end-ref=dd937e9 --group --filter-release --format=plaintext'), `feature: