40 lines
1.0 KiB
TypeScript
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}`);
|
|
}
|
|
}
|