Skip to content

Instantly share code, notes, and snippets.

@syavorsky
Last active September 17, 2015 05:07
Show Gist options
  • Save syavorsky/c9a1589738369f821d6f to your computer and use it in GitHub Desktop.
Save syavorsky/c9a1589738369f821d6f to your computer and use it in GitHub Desktop.
'use strict';
/**
* // parser middleware
* // parse `git blame --line-porcelain` output
* app.use(function(req, res, done) {
* req
* .pipe(new Parser())
* .pipe(new Result(function(blamed) {
* req.blamed = blamed;
* done();
* }));
* });
*/
var stream = require('stream');
var util = require('util');
var debug = require('debug')('punish:parser');
function Parser() {
stream.Transform.call(this, {objectMode: true});
var collected = {};
this._parse = function parse(line) {
var record, values;
if (/^\t/.test(line)) {
record = collected;
collected = {};
record.source = line.replace(/^\t/, '');
debug('record', record);
return record;
} else {
values = line.split(' ');
if (/^[0-9a-z]{40}/.test(values[0])) {
collected.commit = values.slice(1);
debug('line: commit = %s', collected.commit);
} else {
collected[values[0]] = values.slice(1).join(' ');
debug('line: %s = %s', values[0], collected[values[0]]);
}
return null;
}
};
this._committers = {};
this._source = [];
}
util.inherits(Parser, stream.Transform);
Parser.prototype._transform = function transform(data, encoding, done) {
var record, lines = data.toString('utf-8');
// debug('data', lines);
lines = lines.split(/\n/);
for (var i = 0, l = lines.length; i < l; i++) {
record = this._parse(lines[i]);
if (record !== null) this.push(record);
}
done();
};
module.exports = Parser;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment