mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-07-07 06:02:43 +08:00
- render a VSCode-style commit graph in the source control history: lane-assignment algorithm, SVG strip with colored rails, merge and branch curves, commit dots, and branch/tag badges per commit - /commits returns parents and ref decorations across all branches (--branches --remotes --tags --topo-order) using unit-separator fields so pipes in commit subjects can't break parsing - collect stats via a single --shortstat pass instead of one `git show --stat` call per commit; raise the history limit to 50 - replace child_process spawn with cross-spawn in all runtimes, routes, and services: it resolves .cmd shims and PATHEXT on Windows (fixing taskmaster's npx invocations) and delegates to native spawn elsewhere, removing the per-file win32 ternaries - unit tests for the log parser and lane assignment
36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
// cross-spawn: drop-in spawn with Windows .cmd/PATHEXT resolution.
|
|
import spawn from 'cross-spawn';
|
|
|
|
function spawnAsync(command, args) {
|
|
return new Promise((resolve, reject) => {
|
|
const child = spawn(command, args, { shell: false });
|
|
let stdout = '';
|
|
child.stdout.on('data', (data) => { stdout += data.toString(); });
|
|
child.on('error', (error) => { reject(error); });
|
|
child.on('close', (code) => {
|
|
if (code === 0) { resolve({ stdout }); return; }
|
|
reject(new Error(`Command failed with code ${code}`));
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Read git configuration from system's global git config
|
|
* @returns {Promise<{git_name: string|null, git_email: string|null}>}
|
|
*/
|
|
export async function getSystemGitConfig() {
|
|
try {
|
|
const [nameResult, emailResult] = await Promise.all([
|
|
spawnAsync('git', ['config', '--global', 'user.name']).catch(() => ({ stdout: '' })),
|
|
spawnAsync('git', ['config', '--global', 'user.email']).catch(() => ({ stdout: '' }))
|
|
]);
|
|
|
|
return {
|
|
git_name: nameResult.stdout.trim() || null,
|
|
git_email: emailResult.stdout.trim() || null
|
|
};
|
|
} catch (error) {
|
|
return { git_name: null, git_email: null };
|
|
}
|
|
}
|