Files
nanoclaw/skills-engine/merge.ts

40 lines
1.0 KiB
TypeScript

import { execFileSync, execSync } from 'child_process';
import { MergeResult } from './types.js';
export function isGitRepo(): boolean {
try {
execSync('git rev-parse --git-dir', { stdio: 'pipe' });
return true;
} catch {
return false;
}
}
/**
* Run git merge-file to three-way merge files.
* Modifies currentPath in-place.
* Returns { clean: true, exitCode: 0 } on clean merge,
* { clean: false, exitCode: N } on conflict (N = number of conflicts).
*/
export function mergeFile(
currentPath: string,
basePath: string,
skillPath: string,
): MergeResult {
try {
execFileSync('git', ['merge-file', currentPath, basePath, skillPath], {
stdio: 'pipe',
});
return { clean: true, exitCode: 0 };
} catch (err: any) {
const exitCode = err.status ?? 1;
if (exitCode > 0) {
// Positive exit code = number of conflicts
return { clean: false, exitCode };
}
// Negative exit code = error
throw new Error(`git merge-file failed: ${err.message}`);
}
}