mirror of
https://github.com/stablyai/orca.git
synced 2026-11-01 17:47:40 +00:00
* [comment audit] Shorten daemon, hook, and emulator comments [skip ci] * [comment audit] Shorten VM, conversation, SQLite, and theme-import comments [skip ci] * [comment audit] Tighten Git execution and source-control comment contracts [skip ci] * [comment audit] Clarify repository probes and maintenance comments [skip ci] * [comment audit] Shorten status, diff-cache, and checkout comments [skip ci] * [comment audit] Clarify worktree lifecycle and WSL routing comments [skip ci] * [comment audit] Shorten forge identity and review-refresh comments [skip ci] * [comment audit] Tighten hosted-review client comment contracts [skip ci] * [comment audit] Clarify GitLab compatibility and review comments [skip ci] * [comment audit] Tighten hook ownership and watchdog rationale [skip ci] * [comment audit] Condense host and integration compatibility comments [skip ci] * [comment audit] Clarify IPC authority and remote-routing rationale [skip ci] * [comment audit] Finalize file-import and containment comment cleanup * [comment audit] Fix stale Jira type imports blocking full CI --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { windowsLongPathGitArgs } from '../../shared/windows-long-path-git-args'
|
|
import { gitExecFileAsync } from './runner'
|
|
import { addWorktree, unsetWorktreeCreationBase } from './worktree-add'
|
|
import type {
|
|
AddWorktreeOptions,
|
|
AddWorktreeResult,
|
|
SparseWorktreeCreateError
|
|
} from './worktree-operation-options'
|
|
import { gitExecOptions } from './worktree-operation-options'
|
|
import { removeWorktree } from './worktree-removal'
|
|
|
|
export async function addSparseWorktree(
|
|
repoPath: string,
|
|
worktreePath: string,
|
|
branch: string,
|
|
directories: string[],
|
|
baseBranch?: string,
|
|
refreshLocalBaseRef = false,
|
|
options: AddWorktreeOptions = {}
|
|
): Promise<AddWorktreeResult> {
|
|
let created = false
|
|
let addResult: AddWorktreeResult = {}
|
|
try {
|
|
addResult = await addWorktree(
|
|
repoPath,
|
|
worktreePath,
|
|
branch,
|
|
baseBranch,
|
|
refreshLocalBaseRef,
|
|
true,
|
|
options
|
|
)
|
|
created = true
|
|
// --no-checkout wrote no files; these materialization steps need Windows long-path support.
|
|
const longPathArgs = windowsLongPathGitArgs(worktreePath)
|
|
await gitExecFileAsync(
|
|
['sparse-checkout', 'init', '--cone'],
|
|
gitExecOptions(worktreePath, options)
|
|
)
|
|
await gitExecFileAsync(
|
|
[...longPathArgs, 'sparse-checkout', 'set', '--', ...directories],
|
|
gitExecOptions(worktreePath, options)
|
|
)
|
|
await gitExecFileAsync(
|
|
[...longPathArgs, 'checkout', branch],
|
|
gitExecOptions(worktreePath, options)
|
|
)
|
|
return addResult
|
|
} catch (error) {
|
|
const wrapped: SparseWorktreeCreateError =
|
|
error instanceof Error ? (error as SparseWorktreeCreateError) : new Error(String(error))
|
|
if (created) {
|
|
if (!options.checkoutExistingBranch) {
|
|
try {
|
|
await unsetWorktreeCreationBase(worktreePath, branch, options)
|
|
} catch (cleanupError) {
|
|
console.warn(
|
|
`addSparseWorktree: failed to clear creation base for ${worktreePath}`,
|
|
cleanupError
|
|
)
|
|
}
|
|
}
|
|
try {
|
|
await removeWorktree(repoPath, worktreePath, true, {
|
|
deleteBranch: !options.checkoutExistingBranch,
|
|
// Roll back only the new branch, which has no user commits.
|
|
forceBranchDelete: !options.checkoutExistingBranch,
|
|
...(options.wslDistro ? { wslDistro: options.wslDistro } : {})
|
|
})
|
|
} catch {
|
|
wrapped.cleanupFailed = true
|
|
wrapped.message = `${wrapped.message} (cleanup also failed — the partially created worktree at "${worktreePath}" may need manual removal)`
|
|
}
|
|
}
|
|
throw wrapped
|
|
}
|
|
}
|