Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/git-safe/git-wrapper.cjs

Raw
#!/usr/bin/env node

const { spawnSync } = require("node:child_process");

const realGit = "__PI_GIT_SAFE_REAL_GIT__";

const globalValueOptions = new Set([
	"-C",
	"-c",
	"--config-env",
	"--exec-path",
	"--git-dir",
	"--namespace",
	"--super-prefix",
	"--work-tree",
]);

function optionName(argument) {
	const equals = argument.indexOf("=");
	return equals < 0 ? argument : argument.slice(0, equals);
}

function consumesNext(argument, options) {
	return !argument.includes("=") && options.has(optionName(argument));
}

function commandPosition(args) {
	for (let index = 0; index < args.length; index++) {
		const argument = args[index];
		if (argument === "--") return index + 1;
		if (!argument.startsWith("-")) return index;
		if (consumesNext(argument, globalValueOptions)) index++;
	}
	return -1;
}

const args = process.argv.slice(2);

const commandIndex = commandPosition(args);
const editorQuery =
	args[commandIndex] === "var" &&
	(args[commandIndex + 1] === "GIT_EDITOR" ||
		args[commandIndex + 1] === "GIT_SEQUENCE_EDITOR");

const env = { ...process.env };
if (!editorQuery) {
	env.GIT_EDITOR = "true";
	env.GIT_SEQUENCE_EDITOR = "true";
	env.GIT_MERGE_AUTOEDIT = "no";
}

const result = spawnSync(realGit, args, { stdio: "inherit", env });
if (result.error) {
	console.error(result.error.message);
	process.exit(127);
}
if (result.signal) process.kill(process.pid, result.signal);
process.exit(result.status ?? 1);