Files
orca/src/relay/git-handler-command-termination.ts
T
Neil 91a35b9257 Split relay Git handler responsibilities (#17217)
* Split speech session lifecycle

* Split terminal output scheduler pipeline

* Split mobile browser pane modules

* Prune resolved max-lines suppressions

* Split pane tree equalization logic

* Extract mobile troubleshoot screen styles

* Split external automation manager

* Split main window service attachments

* Split hosted review creation checks

* Split automation dispatch event handling

* Split settings navigation metadata

* Split daemon initialization lifecycle

* Split GitLab item dialog

* Split relay dispatcher layers

* Split mobile host screen

* Retarget mobile view settings source test

* Split runtime file client layers

* Split ports panel layers

* Split runtime environments pane layers

* Split local PTY provider responsibilities

* Split CDP bridge responsibilities

* Split relay Git handler responsibilities

* Track moved relay Git fetch audit

* Fix F3-speech for #17123

* Fix F1-cycle for #17131

* Fix F4-navtest for #17157

* Fix F2-allowlist for #17161
2026-08-29 20:19:09 -07:00

54 lines
1.6 KiB
TypeScript

import { runProcess } from '../shared/child-process/run-process'
export const MAX_GIT_BUFFER = 10 * 1024 * 1024
const GIT_REBASE_PROCESS_FALLBACK_TIMEOUT_MS = 2_147_000_000
type GitTerminationOptions = {
cwd?: string
env?: NodeJS.ProcessEnv
timeout?: number
maxBuffer?: number
signal?: AbortSignal
}
export async function runGitToTermination(
args: string[],
options: GitTerminationOptions,
stdin: string | undefined
): Promise<{ stdout: string; stderr: string }> {
const result = await runProcess({
program: 'git',
args,
cwd: typeof options.cwd === 'string' ? options.cwd : undefined,
env: options.env,
timeoutMs:
typeof options.timeout === 'number'
? options.timeout
: GIT_REBASE_PROCESS_FALLBACK_TIMEOUT_MS,
maxOutputBytes: typeof options.maxBuffer === 'number' ? options.maxBuffer : MAX_GIT_BUFFER,
signal: options.signal,
terminationBarrier: true,
...(stdin === undefined ? {} : { input: stdin })
})
if (result.code === 0 && !result.timedOut && !options.signal?.aborted) {
return { stdout: result.stdout, stderr: result.stderr }
}
const error = new Error(
result.timedOut
? `git ${args[0] ?? 'command'} timed out.`
: options.signal?.aborted
? 'The operation was aborted.'
: result.stderr.trim() || `git ${args[0] ?? 'command'} failed.`
)
if (options.signal?.aborted) {
error.name = 'AbortError'
}
throw Object.assign(error, {
code: result.code,
killed: result.timedOut || result.signal !== null || options.signal?.aborted === true,
signal: result.signal,
stdout: result.stdout,
stderr: result.stderr
})
}