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);