git-stats/bin/git-stats

211 lines
6.3 KiB
JavaScript
Executable File

#!/usr/bin/env node
"use strict";
const Tilda = require("tilda")
, GitStatsLib = require("..")
, Ul = require("ul")
, Moment = require("moment")
, Logger = require("bug-killer")
, Abs = require("abs")
, Typpy = require("typpy")
, Package = require("../package")
, ReadJson = require("r-json")
, IsThere = require("is-there")
;
// Constants
const GitStats = new GitStatsLib()
, CONFIG_PATH = GitStatsLib.CONFIG_PATH
, DEFAULT_CONFIG = GitStatsLib.DEFAULT_CONFIG
;
try {
GitStats.initConfig();
} catch (err) {
if (err.code !== "MODULE_NOT_FOUND") {
Logger.log("Failed to read the config file:\n" + err.stack, "warn");
}
}
// Configurations
Moment.suppressDeprecationWarnings = true;
new Tilda(`${__dirname}/../package.json`, {
options: [
{
opts: ["record"]
, desc: "Records a new commit. Don't use this unless you are a mad scientist. If you are a developer just use this option as part of the module."
, name: "data"
}
, {
opts: ["s", "since"]
, desc: "Optional start date."
, name: "date"
, default: GitStats.config.since
}
, {
opts: ["u", "until"]
, desc: "Optional end date."
, name: "date"
, default: GitStats.config.until
}
, {
opts: ["a", "authors"]
, desc: "Shows a pie chart with the author related contributions in the current repository."
}
,{
opts: ["A", "author"]
, desc: "Filter author related contributions in the current repository."
}
, {
opts: ["n", "disable-ansi"]
, desc: "Forces the tool not to use ANSI styles."
}
, {
opts: ["l", "light"]
, desc: "Enables the light theme."
}
, {
opts: ["d", "data"]
, desc: "Sets a custom data store file."
, name: "path"
, default: GitStats.config.path
}
, {
opts: ["g", "global-activity"]
, desc: "Shows global activity calendar in the current repository."
}
, {
opts: ["r", "raw"]
, desc: "Outputs a dump of the raw JSON data."
}
]
, examples: [
"git-stats # Default behavior (stats in the last year)"
, "git-stats -l # Light mode"
, "git-stats -s '1 January 2012' # All the commits from 1 January 2012 to now"
, "git-stats -s '1 January 2012' -u '31 December 2012' # All the commits from 2012"
]
, notes: "Your commit history is kept in ~/.git-stats by default. You can create ~/.git-stats-config.js to specify different defaults."
}).main(action => {
let recordOpt = action.options.record
, sinceDateOpt = action.options.since
, untilDateOpt = action.options.until
, authorsOpt = action.options.authors
, noAnsiOpt = action.options.disableAnsi
, lightOpt = action.options.light
, dataPathOpt = action.options.data
, globalActivityOpt = action.options.globalActivity
, rawOpt = action.options.raw
, authorOpt = action.options.author
;
let options = {};
if(GitStats.config.path) {
dataPathOpt.is_provided = true;
}
if (GitStats.config.authors) {
authorsOpt.is_provided = true;
}
if (GitStats.config.global_activity) {
globalActivityOpt.is_provided = true;
}
// Handle data path
if (dataPathOpt.is_provided) {
if (IsThere(dataPathOpt.value)) {
GitStats.path = Abs(dataPathOpt.value);
GitStats.config.data_path = GitStats.path;
}
else {
Logger.log("Cannot find the the specified data path file.", "warn");
}
}
// --record
if (recordOpt.is_provided) {
try {
options = JSON.parse(recordOpt.value.replace(/^\"|\"$/g, ""));
} catch (e) {
Logger.log(e, "error");
return process.exit(1);
}
return GitStats.record(options, function (err) {
if (err) { return Logger.log(err, "error"); }
process.exit(0);
});
}
// Create the options
options = {
start: sinceDateOpt.value ? Moment(sinceDateOpt.value) : Moment().subtract(1, "years")
, end: untilDateOpt.value ? Moment(untilDateOpt.value) : Moment()
, raw: rawOpt.is_provided
};
// Validate the dates
if (!options.start || !options.start.isValid()) {
options.start = Moment().subtract(1, "years");
Logger.log("Invalid start date. Using default instead (" + options.start.format("LL") + ").", "warn");
}
// Handle time range options
if (!options.end || !options.end.isValid()) {
options.end = Moment();
Logger.log("Invalid end date. Using default instead (" + options.end.format("LL") + ").", "warn");
}
// Add the repo path
if (authorsOpt.is_provided || globalActivityOpt.is_provided) {
options.repo = process.cwd();
}
// Add the author opt
if(authorOpt.is_provided){
options.author = authorOpt.value
}
// Handle authors
if (authorsOpt.is_provided) {
options.no_ansi = noAnsiOpt.is_provided;
options.radius = (process.stdout.rows / 2) - 4;
}
if (!authorsOpt.is_provided || globalActivityOpt.is_provided) {
// This can be a string or an object
if (/^object|string$/.test(Typpy(GitStats.config.theme)) && !noAnsiOpt.is_provided && !lightOpt.is_provided) {
options.theme = GitStats.config.theme;
if (typeof GitStats.config.theme === "string") {
if (!/^DARK|LIGHT$/.test(options.theme)) {
options.theme = null;
}
}
} else {
options.theme = noAnsiOpt.is_provided ? null
: lightOpt.is_provided ? "LIGHT": "DARK"
;
}
}
function display (err, data) {
if (err) { return Logger.log(err, "error"); }
if (typeof data !== "string") {
data = JSON.stringify(data);
}
process.stdout.write(data + "\n");
}
if (globalActivityOpt.is_provided) {
return GitStats.globalActivity(options, display);
}
// Show the graphs
GitStats[authorsOpt.is_provided ? "authorsPie" : "ansiCalendar"](options, display);
});