ruins
Version:
> [!IMPORTANT] > This is in beta. Not everything is ironed out and some modules might misbehave
52 lines (48 loc) • 1.6 kB
text/typescript
import { exec } from "child_process";
import { writeFile } from "node:fs/promises";
import { promisify } from "node:util";
import { getConfig } from "../config/getConfig.js";
import { resolve } from "node:path";
import consola from "consola";
import type { RuinsGitlog, RuinsOutput } from "../types/ruins.js";
import { parseConventionalCommit } from "./utils/conventional-commit.js";
const execPromise = promisify(exec);
/**
* Create a file collecting all TODOs in the project
*
* @param {string} ruinsPath - path to Ruins project directory
* @returns {Promise<void>}
*/
export const createGitLog = async () => {
const settings = await getConfig();
const outputFile = resolve(settings.dir, settings.files.gitlog);
try {
const m = settings.gitlog.months;
const grepOutput = await execPromise(
`cd ${process.cwd()} && git log --since="${m} months ago" --pretty=format:"%h | %ae | %s | %ad" --date=short --no-merges`
);
const formattedOutput = grepOutput.stdout
.split(/\r?\n/)
.map((line) => {
if (!line) return;
const [hash, email, message, date] = line.split(" | ");
return {
hash,
email,
message,
date,
meta: parseConventionalCommit(message),
};
})
.filter((line) => line !== undefined);
const output: RuinsOutput<RuinsGitlog> = {
meta: {
timestamp: Date.now(),
},
data: formattedOutput,
};
await writeFile(outputFile, JSON.stringify(output, null, 2));
} catch {
consola.error("Something went wrong!");
}
};