@pollabd/gitu
Version:
Switch Git identity with one word. Zero setup. Pure bliss.
126 lines (106 loc) • 3.23 kB
JavaScript
#!/usr/bin/env node
"use strict";
const fs = require("fs");
const os = require("os");
const path = require("path");
const { execSync } = require("child_process");
const CONFIG_FILE = path.join(os.homedir(), ".gitu.json");
function load() {
if (!fs.existsSync(CONFIG_FILE)) return { current: null, identities: {} };
try {
return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
} catch {
console.error("Corrupted ~/.gitu.json - resetting...");
return { current: null, identities: {} };
}
}
function save(config) {
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
}
function run(cmd) {
try {
execSync(cmd, { stdio: "ignore" });
} catch {
console.error(`Failed: ${cmd}`);
process.exit(1);
}
}
const args = process.argv.slice(2);
const cmd = args[0] || "";
if (cmd === "" || cmd === "--help" || cmd === "-h") {
console.log(`
gitu - Dead simple Git identity switcher
Usage:
gitu personal → switch to personal
gitu work → switch to work
gitu who → show current
gitu list → list all
gitu add <id> "Name" email [ssh-key]
gitu rm <id> → remove identity
`);
process.exit(0);
}
if (cmd === "--version" || cmd === "-v") {
console.log("gitu v1.2.3");
process.exit(0);
}
if (cmd === "who") {
const c = load();
const i = c.identities[c.current || ""];
console.log(i ? `Current → ${c.current} (${i.email})` : "No identity set");
process.exit(0);
}
if (cmd === "list") {
const c = load();
console.log("Identities:");
Object.keys(c.identities).forEach((k) => {
const marker = k === c.current ? "→ " : " ";
console.log(`${marker}${k.padEnd(12)} ${c.identities[k].email}`);
});
process.exit(0);
}
if (cmd === "add") {
const [id, name, email, ssh = null] = args.slice(1);
if (!id || !name || !email) {
console.log('Usage: gitu add <id> "Full Name" email [~/.ssh/key]');
process.exit(1);
}
const c = load();
c.identities[id] = { name, email, ssh };
if (!c.current) c.current = id;
save(c);
console.log(`Added → ${id} (${email})`);
process.exit(0);
}
if (cmd === "rm") {
const id = args[1];
const c = load();
if (!c.identities[id]) {
console.log(`Identity "${id}" not found`);
process.exit(1);
}
delete c.identities[id];
if (c.current === id) c.current = null;
save(c);
console.log(`Removed → ${id}`);
process.exit(0);
}
// —— SWITCH IDENTITY ——
const config = load();
const identity = config.identities[cmd];
if (!identity) {
console.log(`Identity "${cmd}" not found. Use 'gitu list'`);
process.exit(1);
}
// Properly escape names with spaces
run(`git config user.name "${identity.name.replace(/"/g, '\\"')}"`);
run(`git config user.email "${identity.email}"`);
if (identity.ssh) {
const key = identity.ssh.replace(/^~/, os.homedir());
run(`git config core.sshCommand "ssh -i '${key}' -F /dev/null"`);
} else {
run(`git config --unset core.sshCommand || true`);
}
config.current = cmd;
save(config);
console.log(`Switched to ${cmd} → ${identity.email}`);