| 100 | } |
| 101 | |
| 102 | export function detectBaseRef(): string { |
| 103 | const candidates: string[][] = [ |
| 104 | ["rev-parse", "--abbrev-ref", "origin/HEAD"], |
| 105 | ["rev-parse", "--verify", "main"], |
| 106 | ["rev-parse", "--verify", "master"], |
| 107 | ["rev-parse", "--verify", "origin/main"], |
| 108 | ["rev-parse", "--verify", "origin/master"], |
| 109 | ]; |
| 110 | |
| 111 | for (const args of candidates) { |
| 112 | try { |
| 113 | const out = execFileSync("git", args, { |
| 114 | encoding: "utf8", |
| 115 | stdio: ["ignore", "pipe", "ignore"], |
| 116 | }).trim(); |
| 117 | if (out) return out; |
| 118 | } catch { |
| 119 | // try next candidate |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | throw new Error( |
| 124 | "No default branch detected. Tried origin/HEAD, main, master, origin/main, and origin/master.", |
| 125 | ); |
| 126 | } |
| 127 | |
| 128 | export function resolveMergeBase(base: string): string { |
| 129 | return execFileSync("git", ["merge-base", base, "HEAD"], { |