perf: avoid blocking base-ref resolution

This commit is contained in:
Neil
2026-07-10 19:59:53 -07:00
parent 66437d19c3
commit f586121cba
4 changed files with 28 additions and 23 deletions
+6 -5
View File
@@ -28,7 +28,7 @@ const {
removeWorktreeMock,
forceDeleteLocalBranchMock,
resolveLocalGitUsernameMock,
getDefaultBaseRefMock,
getBaseRefDefaultMock,
resolveDefaultBaseRefViaExecMock,
getDefaultRemoteMock,
getBranchConflictKindMock,
@@ -77,7 +77,7 @@ const {
removeWorktreeMock: vi.fn(),
forceDeleteLocalBranchMock: vi.fn(),
resolveLocalGitUsernameMock: vi.fn(),
getDefaultBaseRefMock: vi.fn(),
getBaseRefDefaultMock: vi.fn(),
resolveDefaultBaseRefViaExecMock: vi.fn(),
getDefaultRemoteMock: vi.fn(),
getBranchConflictKindMock: vi.fn(),
@@ -130,7 +130,7 @@ vi.mock('../git/runner', () => ({
}))
vi.mock('../git/repo', () => ({
getDefaultBaseRef: getDefaultBaseRefMock,
getBaseRefDefault: getBaseRefDefaultMock,
resolveDefaultBaseRefViaExec: resolveDefaultBaseRefViaExecMock,
getDefaultRemote: getDefaultRemoteMock,
getBranchConflictKind: getBranchConflictKindMock
@@ -299,7 +299,7 @@ describe('registerWorktreeHandlers', () => {
removeWorktreeMock,
forceDeleteLocalBranchMock,
resolveLocalGitUsernameMock,
getDefaultBaseRefMock,
getBaseRefDefaultMock,
resolveDefaultBaseRefViaExecMock,
getDefaultRemoteMock,
getBranchConflictKindMock,
@@ -400,7 +400,7 @@ describe('registerWorktreeHandlers', () => {
])
store.getAllWorktreeLineage.mockReturnValue({})
resolveLocalGitUsernameMock.mockResolvedValue('')
getDefaultBaseRefMock.mockReturnValue('origin/main')
getBaseRefDefaultMock.mockResolvedValue('origin/main')
resolveDefaultBaseRefViaExecMock.mockResolvedValue('origin/main')
getDefaultRemoteMock.mockResolvedValue('origin')
getBranchConflictKindMock.mockResolvedValue(null)
@@ -523,6 +523,7 @@ describe('registerWorktreeHandlers', () => {
await handlers['worktrees:prefetchCreateBase'](null, { repoId: 'repo-1' })
expect(getBaseRefDefaultMock).toHaveBeenCalledWith('/workspace/repo')
expect(runtimeStub.resolveRemoteTrackingBase).toHaveBeenCalledWith(
'/workspace/repo',
'origin/master'
+17 -10
View File
@@ -41,7 +41,7 @@ import {
runHook,
shouldRunSetupForCreate
} from '../hooks'
import { getBranchConflictKind, getDefaultBaseRef } from '../git/repo'
import { getBaseRefDefault, getBranchConflictKind } from '../git/repo'
import type { OrchestrationDb } from './orchestration/db'
import type { MessagePriority, MessageRow, MessageType } from './orchestration/types'
import {
@@ -516,16 +516,23 @@ vi.mock('../github/issues', async (importOriginal) => {
}
})
// Why: the CLI create-worktree path calls getDefaultBaseRef to resolve a
// fallback base branch. Real resolution shells out to `git` against the
// test's fabricated repo path, which has no refs, so we stub it to a
// predictable 'origin/main'. The runtime no longer silently fabricates this
// default, so tests that want the legacy behavior must express it via the mock.
// Why: CLI worktree creation resolves a default against fabricated repo paths
// in these tests, so keep the async resolver deterministic.
vi.mock('../git/repo', async (importOriginal) => {
const actual = (await importOriginal()) as Record<string, unknown>
const actualGetBaseRefDefault = actual.getBaseRefDefault as (
path: string,
options?: { wslDistro?: string }
) => Promise<string | null>
return {
...actual,
getDefaultBaseRef: vi.fn().mockReturnValue('origin/main'),
// Why: fabricated local test repos need a deterministic default, while
// WSL coverage must still exercise the real async Git-options path.
getBaseRefDefault: vi
.fn()
.mockImplementation((path: string, options?: { wslDistro?: string }) =>
options?.wslDistro ? actualGetBaseRefDefault(path, options) : Promise.resolve('origin/main')
),
getBranchConflictKind: vi.fn().mockResolvedValue(null)
}
})
@@ -2825,7 +2832,7 @@ describe('OrcaRuntimeService', () => {
suggestLocalBaseRefUpdate: true
}
)
expect(getDefaultBaseRef).toHaveBeenCalled()
expect(getBaseRefDefault).toHaveBeenCalled()
} finally {
getReposSpy.mockRestore()
gitSpy.mockRestore()
@@ -5330,7 +5337,7 @@ describe('OrcaRuntimeService', () => {
it('treats SSH worktree drift as unknown without local git probes', async () => {
vi.mocked(listWorktrees).mockClear()
vi.mocked(getDefaultBaseRef).mockClear()
vi.mocked(getBaseRefDefault).mockClear()
const remoteStore = {
...store,
getRepos: () => [
@@ -5366,7 +5373,7 @@ describe('OrcaRuntimeService', () => {
}
expect(gitProvider.listWorktrees).toHaveBeenCalledWith('/remote/repo')
expect(getDefaultBaseRef).not.toHaveBeenCalled()
expect(getBaseRefDefault).not.toHaveBeenCalled()
expect(listWorktrees).not.toHaveBeenCalled()
})
+3 -6
View File
@@ -599,7 +599,6 @@ import type {
} from '../../shared/github-project-types'
import {
getBaseRefDefault,
getDefaultBaseRef,
getDefaultRemote,
getBranchConflictKind,
isGitRepo,
@@ -14249,7 +14248,7 @@ export class OrcaRuntimeService {
resolveDefaultBaseRef: () =>
hasLocalWorktreeGitOptions
? resolveDefaultBaseRefViaExec((argv) => gitExecFileAsync(argv, localGitExecOptions))
: Promise.resolve(getDefaultBaseRef(repo.path)),
: getBaseRefDefault(repo.path),
isBaseUsable: async (baseBranchCandidate) => {
const remoteTrackingBase = await this.resolveRemoteTrackingBase(
repo.path,
@@ -14280,10 +14279,8 @@ export class OrcaRuntimeService {
}
})
if (!baseBranch) {
// Why: getDefaultBaseRef returns null when no suitable ref exists.
// Don't fabricate 'origin/main' — passing it to addWorktree would
// produce an opaque git failure. Surface a clear error so the CLI
// caller can pick an explicit --base ref.
// Why: a null default means no suitable ref exists; fail clearly instead
// of handing Git a fabricated origin/main ref.
throw new Error(
'Could not resolve a default base ref for this repo. Pass an explicit --base and try again.'
)
+2 -2
View File
@@ -2,7 +2,7 @@ import { isFolderRepo } from '../shared/repo-kind'
import type { Repo } from '../shared/types'
import { hasLocalCommitObject, isFullGitObjectId } from './git/commit-object-ref'
import { hasWorktreeBaseCommitRef } from './git/worktree-base-ref-probe'
import { getDefaultBaseRef } from './git/repo'
import { getBaseRefDefault } from './git/repo'
import { getSshGitProvider } from './providers/ssh-git-dispatch'
import { prefetchRemoteWorktreeCreateBase } from './ipc/worktree-remote'
import { resolveWorktreeCreateBase } from './worktree-create-base'
@@ -48,7 +48,7 @@ async function prefetchLocalWorktreeCreateBase(
const resolvedBaseBranch = await resolveWorktreeCreateBase({
requestedBaseBranch: baseBranch,
repoWorktreeBaseRef: repo.worktreeBaseRef,
resolveDefaultBaseRef: async () => getDefaultBaseRef(repo.path),
resolveDefaultBaseRef: () => getBaseRefDefault(repo.path),
isBaseUsable: async (baseBranchCandidate) => {
const remoteTrackingBase = await runtime.resolveRemoteTrackingBase(
repo.path,