Skip to content

Instantly share code, notes, and snippets.

@vieron
Last active August 29, 2015 14:14
Show Gist options
  • Save vieron/710b0dfc87b9c36a7375 to your computer and use it in GitHub Desktop.
Save vieron/710b0dfc87b9c36a7375 to your computer and use it in GitHub Desktop.
post-checkout hook to notify breaking changes
#!/usr/bin/env node
var PREV_HEAD = process.argv[2];
var NEW_HEAD = process.argv[3];
var sys = require('sys'),
exec = require('child_process').exec,
FgRed = "\x1b[31m", FgGreen = "\x1b[32m", FgYellow = "\x1b[33m",
FgBlue = "\x1b[34m", FgMagenta = "\x1b[35m", FgCyan = "\x1b[36m",
FgWhite = "\x1b[37m",
banner = '\n\n' +
' ######## ######## ######## ### ## ## #### ## ## ###### \n' +
' ## ## ## ## ## ## ## ## ## ## ### ## ## ## \n' +
' ## ## ## ## ## ## ## ## ## ## #### ## ## \n' +
' ######## ######## ###### ## ## ##### ## ## ## ## ## #### \n' +
' ## ## ## ## ## ######### ## ## ## ## #### ## ## \n' +
' ## ## ## ## ## ## ## ## ## ## ## ### ## ## \n' +
' ######## ## ## ######## ## ## ## ## #### ## ## ###### \n\n' +
' ###### ## ## ### ## ## ###### ######## ###### \n' +
' ## ## ## ## ## ## ### ## ## ## ## ## ## \n' +
' ## ## ## ## ## #### ## ## ## ## \n' +
' ## ######### ## ## ## ## ## ## #### ###### ###### \n' +
' ## ## ## ######### ## #### ## ## ## ## \n' +
' ## ## ## ## ## ## ## ### ## ## ## ## ## \n' +
' ###### ## ## ## ## ## ## ###### ######## ###### \n';
var formatter = function(format) { return format.replace(/"/g, '^@^'); }
var format = formatter('\'{%n"hash":"%h",%n"subject":"%f",%n"author":"%an",%n"date":"%ad",%n"body":"%b"},\' ');
// http://git-scm.com/docs/git-log
exec('git log --no-merges --pretty=' + format + PREV_HEAD + '..' + NEW_HEAD, function(err, std) {
// output to json
var out = ("" + std).replace(/"/gm, '\\"').replace(/:\s*\^@\^([^]+?)\^@\^/gm, function(r) {
return r.replace(/\r\n|\n/g, '\\n');
}).replace(/\^@\^/gm, '"');
var commits = JSON.parse('[' + out.slice(0, out.lastIndexOf(',')) + ']');
// look for breaking changes and build output
var match, breaking = '';
for (var i = 0; i < commits.length; i++) {
commit = commits[i];
match = /\nbreaking\s+changes\n*([^]+)/ig.exec(commit.body);
if (match && match[1]) {
breaking += '\n\n' + FgYellow + commit.hash + FgWhite + ' · ' +
FgMagenta + commit.subject + ' · ' + FgWhite + commit.author + '\n' +
FgWhite + match[1] + '\n';
}
}
// output
breaking.length && sys.puts(FgRed + banner + breaking + '\n');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment