123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 'use strict'
- /*
- Usage:
- node scripts/changelog.js [comittish]
- Generates changelog entries in our format as best as its able based on
- commits starting at comittish, or if that's not passed, latest.
- Ordinarily this is run via the gen-changelog shell script, which appends
- the result to the changelog.
- */
- const execSync = require('child_process').execSync
- const branch = process.argv[2] || 'origin/latest'
- const log = execSync(`git log --reverse --pretty='format:%h %H%d %s (%aN)%n%b%n---%n' ${branch}...`).toString().split(/\n/)
- main()
- function shortname (url) {
- let matched = url.match(/https:\/\/github\.com\/([^/]+\/[^/]+)\/(?:pull|issues)\/(\d+)/) ||
- url.match(/https:\/\/(npm\.community)\/t\/(?:[^/]+\/)(\d+)/)
- if (!matched) return false
- let repo = matched[1]
- let id = matched[2]
- if (repo !== 'npm/cli') {
- return `${repo}#${id}`
- } else {
- return `#${id}`
- }
- }
- function printCommit (c) {
- console.log(`* [\`${c.shortid}\`](https://github.com/npm/cli/commit/${c.fullid})`)
- if (c.fixes) {
- let label = shortname(c.fixes)
- if (label) {
- console.log(` [${label}](${c.fixes})`)
- } else {
- console.log(` [npm.community#${c.fixes}](https://npm.community/t/${c.fixes})`)
- }
- } else if (c.prurl) {
- let label = shortname(c.prurl)
- if (label) {
- console.log(` [${label}](${c.prurl})`)
- } else {
- console.log(` [#](${c.prurl})`)
- }
- }
- let msg = c.message
- .replace(/^\s+/mg, '')
- .replace(/^[-a-z]+: /, '')
- .replace(/^/mg, ' ')
- .replace(/\n$/, '')
- // backtickify package@version
- .replace(/^(\s*[^@\s]+@\d+[.]\d+[.]\d+)(\s*\S)/g, '$1:$2')
- .replace(/\b([^@\s]+@\d+[.]\d+[.]\d+)\b/g, '`$1`')
- // linkify commitids
- .replace(/\b([a-f0-9]{7,8})\b/g, '[`$1`](https://github.com/npm/cli/commit/$1)')
- .replace(/\b#(\d+)\b/g, '[#$1](https://npm.community/t/$1)')
- console.log(msg)
- if (c.credit) {
- c.credit.forEach(function (credit) {
- console.log(` ([@${credit}](https://github.com/${credit}))`)
- })
- } else {
- console.log(` ([@${c.author}](https://github.com/${c.author}))`)
- }
- }
- function main () {
- let commit
- log.forEach(function (line) {
- line = line.replace(/\r/g, '')
- let m
- /* eslint no-cond-assign:0 */
- if (/^---$/.test(line)) {
- printCommit(commit)
- } else if (m = line.match(/^([a-f0-9]{7,10}) ([a-f0-9]+) (?:[(]([^)]+)[)] )?(.*?) [(](.*?)[)]/)) {
- commit = {
- shortid: m[1],
- fullid: m[2],
- branch: m[3],
- message: m[4],
- author: m[5],
- prurl: null,
- fixes: null,
- credit: null
- }
- } else if (m = line.match(/^PR-URL: (.*)/)) {
- commit.prurl = m[1]
- } else if (m = line.match(/^Credit: @(.*)/)) {
- if (!commit.credit) commit.credit = []
- commit.credit.push(m[1])
- } else if (m = line.match(/^Fixes: #?(.*)/)) {
- commit.fixes = m[1]
- } else if (m = line.match(/^Reviewed-By: @(.*)/)) {
- commit.reviewed = m[1]
- } else if (/\S/.test(line)) {
- commit.message += `\n${line}`
- }
- })
- }
|