UNPKG

node-git-2-json

Version:

Simple tool to get a JSON from your git log. Inspired by @fabien0102/git2json

86 lines 3.27 kB
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