diff --git a/bin/generate-changelog.js b/bin/generate-changelog.js new file mode 100755 index 0000000..c881a46 --- /dev/null +++ b/bin/generate-changelog.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +/** + * Simple util based on npm package generate-changelog + * + * Usage: ./generate-changelog.js previousTag currentTag + */ + +const program = require("commander"); +const packageJson = require("../package.json"); +const githubUrlFromGit = require("github-url-from-git"); +const generateChangelog = require("generate-changelog"); +const { exec } = require("child_process"); + +const githubRepoUrl = + (packageJson.repository && + packageJson.repository.url && + githubUrlFromGit(packageJson.repository.url)) || + undefined; + +/** + * generate-changelog always takes the latest tag as title / date + * this patches this little bug and retrieves the exact date of the targetted tag + */ +const retrieveGitTagDate = tag => + new Promise((res, rej) => { + exec(`git show -s --format=%ci ${tag}^{commit}`, (error, stdout) => { + if (error) { + return rej(error); + } + return res(stdout); + }); + }); + +program + .usage(" ") + .command("* ") + .action((previousTag, currentTag) => { + const githubDiffLink = `Diff: ${githubRepoUrl}/compare/${previousTag}...${currentTag}`; + + Promise.all([ + generateChangelog.generate({ + tag: `${previousTag}...${currentTag}`, + repoUrl: githubRepoUrl + }), + retrieveGitTagDate(currentTag) + ]).then(([changelog, currentTagDate]) => { + console.log( + changelog.replace( + /^(.*)$/m, + `#### ${currentTag} (${currentTagDate.substr(0, 10)})` + ) + githubDiffLink + ); + }); + }); + +program.parse(process.argv); diff --git a/package-lock.json b/package-lock.json index b6239f2..c559f16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4863,6 +4863,17 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "generate-changelog": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/generate-changelog/-/generate-changelog-1.7.1.tgz", + "integrity": "sha512-f57zId4iD0AVRyjHHH6SwOdevrW+5ikjr6ooqlzUf7Z27DBW4BZvWZtlXmy+LShf5C52aFBCvKVwd86ZA56ObQ==", + "dev": true, + "requires": { + "bluebird": "^3.0.6", + "commander": "^2.9.0", + "github-url-from-git": "^1.4.0" + } + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -4908,6 +4919,12 @@ "shelljs": "0.7.7" } }, + "github-url-from-git": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", + "integrity": "sha1-+YX+3MCpqledyI16/waNVcxiUaA=", + "dev": true + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", diff --git a/package.json b/package.json index bec4b6e..96530bf 100644 --- a/package.json +++ b/package.json @@ -34,17 +34,21 @@ "test:precommit": "npm test", "eject": "react-scripts eject", "lint": "npx eslint .", + "generate-changelog": "./bin/generate-changelog.js", "pretty": "npx prettier --write '**/*.{js,jsx,json,css,scss}'", "precommit": "lint-staged && npm run lint && npm run test:precommit", "serve": "npx serve --clipless --port 5000 build" }, "devDependencies": { + "commander": "^2.15.1", "cross-env": "^5.1.5", "eslint-config-airbnb": "^16.1.0", "eslint-config-prettier": "^2.9.0", "eslint-plugin-cypress": "^2.0.1", "eslint-plugin-prettier": "^2.6.0", + "generate-changelog": "^1.7.1", "git-rev-sync": "^1.12.0", + "github-url-from-git": "^1.5.0", "husky": "^0.14.3", "lint-staged": "^7.1.2", "moment": "^2.22.1",