import { execFile } from 'node:child_process';
import { promisify } from 'node:util';
import { ROOT } from './specs.mjs';
const execFileAsync = promisify(execFile);
async function gitLines(args, cwd = ROOT) {
try {
const { stdout } = await execFileAsync('git', args, { cwd, encoding: 'utf8' });
return stdout.split('\n').map((line) => line.trim()).filter(Boolean);
} catch {
return [];
}
}
export async function getChangedFiles(since = 'origin/main', cwd = ROOT) {
const files = new Set();
for (const line of await gitLines(['diff', '--name-only', `${since}...HEAD`], cwd)) files.add(line);
for (const line of await gitLines(['diff', '--cached', '--name-only'], cwd)) files.add(line);
for (const line of await gitLines(['diff', '--name-only'], cwd)) files.add(line);
for (const line of await gitLines(['ls-files', '--others', '--exclude-standard'], cwd)) files.add(line);
return [...files].sort();
}