/** * ───────────────────────────────────────────── * SPB Git — Personal Git Platform * ───────────────────────────────────────────── * Author : Simon-Pierre Boucher * Contact : contact@spboucher.ai * File : cli/commands/commit.mjs * Purpose : `spbgit commit |--all -m` — add-all + commit * License : MIT © Simon-Pierre Boucher * ───────────────────────────────────────────── */ import { basename, join } from 'node:path'; import { existsSync } from 'node:fs'; import pc from 'picocolors'; import { requireCliConfig } from '../lib/config.mjs'; import { workspaceRepos, git } from '../lib/git.mjs'; import { mapLimit, SYM } from '../lib/ui.mjs'; import { EXIT } from '../lib/api.mjs'; /** Resolve the list of target repo dirs for name/--all commands. */ export function resolveTargets(config, name, all) { if (all) return workspaceRepos(config.workspace); if (!name) { console.error(pc.red('✗ Provide a repository name or --all')); process.exit(EXIT.USER); } const dir = join(config.workspace, name); if (!existsSync(join(dir, '.git'))) { console.error(pc.red(`✗ No such workspace repo: ${name}`)); process.exit(EXIT.USER); } return [dir]; } export function registerCommit(program) { program .command('commit [name]') .description('git add -A && git commit in target repo(s)') .option('--all', 'every workspace repository', false) .requiredOption('-m, --message ', 'commit message') .action(async (name, opts) => { const config = requireCliConfig(); const targets = resolveTargets(config, name, opts.all); let failures = 0; await mapLimit(targets, 4, async (dir) => { const repo = basename(dir); const status = await git(dir, ['status', '--porcelain']); if (status.ok && status.stdout.trim() === '') { console.log(`${SYM.skip} ${repo} ${pc.dim('clean — skipped')}`); return; } await git(dir, ['add', '-A']); const commit = await git(dir, ['commit', '-m', opts.message]); if (commit.ok) console.log(`${SYM.ok} ${repo} ${pc.dim('committed')}`); else { failures += 1; console.error(`${SYM.fail} ${repo}: ${commit.stderr.trim().split('\n').pop()}`); } }); if (failures > 0) process.exit(EXIT.PARTIAL); }); }