()
| 155 | } |
| 156 | |
| 157 | export function createRuntimeNodeLocalGitAdapter(): RuntimeNodeGitAdapter { |
| 158 | return { |
| 159 | async isInstalled() { |
| 160 | const result = await git(["--version"]) |
| 161 | return { installed: result.success, version: result.success ? result.stdout.trim() : undefined } |
| 162 | }, |
| 163 | async isDirectory(params) { |
| 164 | const directory = str(asRecord(params), "directory") |
| 165 | const root = await repoRoot(directory) |
| 166 | if (!root) return { isGitDirectory: false, error: "not a git directory" } |
| 167 | const prefix = await git(["rev-parse", "--show-prefix"], directory) |
| 168 | return { |
| 169 | isGitDirectory: true, |
| 170 | repoRoot: root, |
| 171 | relativePath: prefix.success ? prefix.stdout.trim().replace(/\/$/, "") : "", |
| 172 | mainBranch: await defaultBranch(directory), |
| 173 | hasGhCli: await commandExists("gh", ["--version"]), |
| 174 | } |
| 175 | }, |
| 176 | async checkGhCli() { |
| 177 | return { hasGhCli: await commandExists("gh", ["--version"]) } |
| 178 | }, |
| 179 | async getOrCreateWorkTree(params) { |
| 180 | const record = asRecord(params) |
| 181 | const repoDir = str(record, "repoDir") |
| 182 | const id = str(record, "id") |
| 183 | const worktreeDir = await worktreePath(repoDir, id) |
| 184 | try { |
| 185 | const stat = await fs.stat(worktreeDir) |
| 186 | if (stat.isDirectory()) return { worktreeDir, matchingDir: worktreeDir, created: false } |
| 187 | } catch { |
| 188 | // Create below. |
| 189 | } |
| 190 | await gitOutput(["worktree", "add", "--detach", worktreeDir, optionalStr(record, "sourceTreeish") ?? "HEAD"], repoDir) |
| 191 | return { worktreeDir, matchingDir: worktreeDir, created: true } |
| 192 | }, |
| 193 | async getWorkTreeDiffPatch(params) { |
| 194 | const record = asRecord(params) |
| 195 | const workDir = await worktreePath(str(record, "repoDir"), str(record, "workTreeId")) |
| 196 | return { patch: await gitOutput(["diff", str(record, "compareToCommit")], workDir) } |
| 197 | }, |
| 198 | async getMergeBase(params) { |
| 199 | const record = asRecord(params) |
| 200 | const workDir = await worktreePath(str(record, "repoDir"), str(record, "workTreeId")) |
| 201 | return { mergeBaseCommit: (await gitOutput(["merge-base", "HEAD", str(record, "targetBranch")], workDir)).trim() } |
| 202 | }, |
| 203 | async getSummary(params) { |
| 204 | const record = asRecord(params) |
| 205 | return summary(await resolveWorkDir(str(record, "repoDir"), optionalStr(record, "workTreeId"))) |
| 206 | }, |
| 207 | async getStatus(params) { |
| 208 | const record = asRecord(params) |
| 209 | const workDir = await resolveWorkDir(str(record, "repoDir"), optionalStr(record, "workTreeId")) |
| 210 | const base = await summary(workDir) |
| 211 | return { |
| 212 | ...base, |
| 213 | staged: { ...base.staged, patch: await gitOutput(["diff", "--cached"], workDir) }, |
| 214 | unstaged: { ...base.unstaged, patch: await gitOutput(["diff"], workDir) }, |
no outgoing calls
no test coverage detected