node-git-2-json
Version:
Simple tool to get a JSON from your git log. Inspired by @fabien0102/git2json
86 lines • 3.27 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { spawn } from 'child_process';
import { gitFormatMapping, loggingEnabled, loggingPrefix } from './constants.js';
import { ProcessingError } from './error.js';
export function gitLog(repo, count) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
let stdout = '';
let stderr = '';
const args = [
'-C',
repo,
'log',
'--numstat',
'--date-order',
'--all',
getFormat(),
];
if (getNumber(count) != '') {
args.push(getNumber(count));
}
const g = spawn('git', args);
g.stdout.on('data', d => {
stdout += d;
});
g.stderr.on('data', d => {
stderr += d;
});
g.on('error', (err) => {
console.error(err);
reject(err);
});
g.on('close', (code) => {
if (code !== 0) {
console.error(`Git exited with code ${code}`);
reject(code);
}
else {
resolve([stdout, stderr]);
}
});
});
});
}
export function getFormat() {
const base = '--pretty=format:%x02###%x02';
const k = Object.keys(gitFormatMapping);
const v = k.map(i => gitFormatMapping[i]).join('%x00');
return base.replace('###', v);
}
function getNumber(num) {
if (num == -1) {
return '';
}
else if (num >= 0) {
return `-n ${num}`;
}
else {
throw new RangeError('The count must be a positive number or -1 for all');
}
}
export function handleOutput(out, err) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const dataChunk = out.split('\u0002').slice(1);
const commits = dataChunk.filter((val, idx) => (idx + 1) % 2);
const stats = dataChunk.filter((val, idx) => idx % 2);
if (commits.length !== stats.length) {
throw new ProcessingError(`Data returned was invalid.\nCommits Length: ${commits.length}\nStats Length: ${stats.length}`);
}
if (loggingEnabled) {
console.log(`${loggingPrefix}The repository returned ${commits.length} commits`);
}
resolve([commits, stats]);
});
});
}
//# sourceMappingURL=git.js.map