From 6cbbcedc60a59d4745afada6cde4f6e8a2ea106f Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Thu, 7 Jan 2016 15:56:41 -0800 Subject: scripts: Add @iarna's changelog generator tool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/npm/npm/pull/11077 Credit: @iarna Reviewed-By: ¯\_(ツ)_/¯ Reviewed-By: @othiym23 --- scripts/changelog.js | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/gen-changelog | 7 ++++ 2 files changed, 99 insertions(+) create mode 100644 scripts/changelog.js create mode 100755 scripts/gen-changelog (limited to 'scripts') diff --git a/scripts/changelog.js b/scripts/changelog.js new file mode 100644 index 000000000..ae3ba5a6a --- /dev/null +++ b/scripts/changelog.js @@ -0,0 +1,92 @@ +'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, master. + +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] || 'master' +const log = execSync(`git log --pretty='format:%h %H%d %s (%aN)%n%b%n---%n' ${branch}...`).toString().split(/\n/) +const authormap = { + 'Rebecca Turner': 'iarna', + 'Forrest L Norvell': 'othiym23', + 'Kyle Mitchell': 'kemitchell', + 'Chris Rebert': 'cvrebert', + 'Kat Marchán': 'zkat' +} + +main() + +function print_commit (c) { + let m + console.log(`* [\`${c.shortid}\`](https://github.com/npm/npm/commit/${c.fullid})`) + if (c.fixes) { + console.log(` [#${c.fixes}](https://github.com/npm/npm/issues/${c.fixes})`) + } else if (c.prurl && (m = c.prurl.match(/https:\/\/github.com\/([^/]+\/[^/]+)\/pull\/(\d+)/))) { + let repo = m[1] + let prid = m[2] + if (repo !== 'npm/npm') { + console.log(` [${repo}#${prid}](${c.prurl})`) + } else { + console.log(` [#${prid}](${c.prurl})`) + } + } else if (c.prurl) { + 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/npm/commit/$1)') + .replace(/\b#(\d+)\b/g, '[#$1](https://github.com/npm/npm/issues/$1)') + console.log(msg) + if (c.credit) { + console.log(` ([@${c.credit}](https://github.com/${c.credit}))`) + } else { + console.log(` ([@${c.author}](https://github.com/${c.author}))`) + } +} + +function main () { + let commit + log.forEach(function (line) { + let m + /*eslint no-cond-assign:0*/ + if (/^---$/.test(line)) { + print_commit(commit) + } else if (m = line.match(/^([a-f0-9]{7}) ([a-f0-9]+) (?:[(]([^)]+)[)] )?(.*?) [(](.*?)[)]/)) { + commit = { + shortid: m[1], + fullid: m[2], + branch: m[3], + message: m[4], + author: authormap[m[5]] || 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: @(.*)/)) { + commit.credit = 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}` + } + }) +} diff --git a/scripts/gen-changelog b/scripts/gen-changelog new file mode 100755 index 000000000..efec4d54e --- /dev/null +++ b/scripts/gen-changelog @@ -0,0 +1,7 @@ +#!/bin/sh +# Usage: gen-changelog [comittish] +# Reads all the commits since comittish and produces changelog entries in +# our style as best as it can, appendning them to CHANGELOG.md. If it +# encounters a git error it won't modify CHANGELOG.md +# @iarna uses this as the first step in producing changelogs for a release. +(node $(npm prefix)/scripts/changelog.js "$@"; cat CHANGELOG.md) > new.md && mv new.md CHANGELOG.md -- cgit v1.2.3