Skip to content

Commit

Permalink
tools: generate authors list automatically
Browse files Browse the repository at this point in the history
* Add new `update-authors.js` tool that traverses commit history using
  `git log` and creates authors list.

* Decouple common functions into a module shared between tools.

* Add `.mailmap` file with proper names and emails of active
  collaborators.  This file is automatically parsed by Git so that
  `git log --format='%aN <%aE>'` won't show duplicate entries in case
  something was committed with misconfigured Git.  E.g., without this
  file @tshemsedinov appears twice in the list, as Timur Shemsedinov
  and as tshemsedinov, but with mailmap applied Git automatically
  coalesces these entries to use the full name only.
  • Loading branch information
aqrln committed Feb 26, 2017
1 parent c768831 commit 8915cd7
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 22 deletions.
3 changes: 3 additions & 0 deletions .mailmap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Timur Shemsedinov <timur.shemsedinov@gmail.com>
Alexey Orlenko <eaglexrlnk@gmail.com>
Mykola Bilochub <nbelochub@gmail.com>
27 changes: 27 additions & 0 deletions tools/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Common utilities used by tools
'use strict';

const childProcess = require('child_process');
const fs = require('fs');

const common = {};
module.exports = common;

common.getCommandOutput = (cmd) => {
const exec = common.promisify(childProcess.exec);
return exec(cmd).then((stdout, stderr) => {
if (stderr) console.error(stderr);
return stdout;
});
};

common.promisify = (fn) => (...args) => (
new Promise((resolve, reject) => {
fn(...args, (error, ...result) => {
if (error) reject(error);
else resolve(...result);
});
})
);

common.writeFile = common.promisify(fs.writeFile);
24 changes: 2 additions & 22 deletions tools/prepare-release.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

'use strict';

const childProcess = require('child_process');
const fs = require('fs');
const https = require('https');
const path = require('path');

const { getCommandOutput, writeFile } = require('./common');

const commandName = path.relative('.', __filename);
const help = `\
This tool allows to filter the result of
Expand Down Expand Up @@ -83,14 +83,6 @@ getCommandOutput('git cherry ' + branch).then((cherryOut) => {
process.exit(1);
});

function getCommandOutput(cmd) {
const exec = promisify(childProcess.exec);
return exec(cmd).then((stdout, stderr) => {
if (stderr) console.error(stderr);
return stdout;
});
}

function getMetadata(commitHash) {
const command = 'git log --format="%aN%n%B" -n 1 ' + commitHash;
return getCommandOutput(command).then((output) => {
Expand Down Expand Up @@ -188,17 +180,6 @@ function getStreamData(stream, callback) {
stream.on('error', callback);
}

function promisify(fn) {
return (...args) => (
new Promise((resolve, reject) => {
fn(...args, (error, ...result) => {
if (error) reject(error);
else resolve(...result);
});
})
);
}

function processCommits(commits) {
commits = filterCommits(commits, maxLevel);

Expand Down Expand Up @@ -233,7 +214,6 @@ function processCommits(commits) {

script += '\n';

const writeFile = promisify(fs.writeFile);
return Promise.all([
writeFile(`${branch}-apply-commits.sh`, script),
writeFile(`${branch}-commits.md`, changelog)
Expand Down
24 changes: 24 additions & 0 deletions tools/update-authors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env node

'use strict';

const path = require('path');
const { getCommandOutput, writeFile } = require('./common');

const AUTHORS_PATH = path.resolve(__dirname, '..', 'AUTHORS');

getCommandOutput('git log --reverse --format="%aN <%aE>"').then((out) => {
const seen = new Set();
const authors = out.split('\n').reduce((list, author) => {
if (!seen.has(author)) {
list.push(author);
seen.add(author);
}
return list;
}, []);
return writeFile(AUTHORS_PATH, authors.join('\n'));
}).catch((error) => {
const message = error.stack || error.toString();
console.error(message);
process.exit(1);
});

0 comments on commit 8915cd7

Please sign in to comment.