mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 00:57:45 +00:00
* fix(worktrees): remove repeated scans and keep prepared checkouts fresh * fix(worktrees): reclaim unlocked fallback preparations safely * refactor(worktrees): simplify creation ownership and idle maintenance * fix(git): keep ref maintenance armed after an index-only pass An idle attempt that found the pack index due but refs still cooling down returned without rescheduling, so loose refs from the arming fetch waited for the next write instead of the ref cooldown.
126 lines
4.3 KiB
TypeScript
126 lines
4.3 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import type * as WorktreeCreatePreparation from '../worktree-create-preparation'
|
|
import type { Project } from '../../shared/project-types'
|
|
import type { Repo } from '../../shared/repo-types'
|
|
import { _resetWslCachesForTests, _setWslCachesForTests } from '../wsl'
|
|
|
|
const mocks = vi.hoisted(() => ({
|
|
prefetchWorktreeCreateBase: vi.fn(),
|
|
prepareWorktreeCreateForRepo: vi.fn()
|
|
}))
|
|
|
|
vi.mock('../worktree-create-base-prefetch', () => ({
|
|
prefetchWorktreeCreateBase: mocks.prefetchWorktreeCreateBase
|
|
}))
|
|
vi.mock('../worktree-create-preparation', async (importOriginal) => ({
|
|
...(await importOriginal<typeof WorktreeCreatePreparation>()),
|
|
prepareWorktreeCreateForRepo: mocks.prepareWorktreeCreateForRepo
|
|
}))
|
|
|
|
import { OrcaRuntimeService } from './orca-runtime'
|
|
|
|
const repo: Repo = {
|
|
id: 'repo-1',
|
|
displayName: 'Repo',
|
|
path: String.raw`C:\workspace\repo`,
|
|
badgeColor: '#000000',
|
|
addedAt: 0
|
|
}
|
|
|
|
const project: Project = {
|
|
id: 'project-1',
|
|
displayName: 'Project',
|
|
badgeColor: '#000000',
|
|
sourceRepoIds: ['repo-1'],
|
|
createdAt: 0,
|
|
updatedAt: 0,
|
|
localWindowsRuntimePreference: { kind: 'wsl', distro: 'Ubuntu' }
|
|
}
|
|
|
|
function makeStore(overrides: Partial<Project> = {}): unknown {
|
|
return {
|
|
getRepos: () => [repo],
|
|
getRepo: (id: string) => (id === repo.id ? repo : undefined),
|
|
getProjects: () => [{ ...project, ...overrides }],
|
|
getSettings: () => ({ localWindowsRuntimeDefault: { kind: 'windows-host' } })
|
|
}
|
|
}
|
|
|
|
function setPlatform(platform: NodeJS.Platform): void {
|
|
Object.defineProperty(process, 'platform', { configurable: true, value: platform })
|
|
}
|
|
|
|
const hostPlatform = process.platform
|
|
|
|
beforeEach(() => {
|
|
mocks.prefetchWorktreeCreateBase.mockReset().mockResolvedValue(undefined)
|
|
mocks.prepareWorktreeCreateForRepo.mockReset().mockResolvedValue(undefined)
|
|
})
|
|
|
|
afterEach(() => {
|
|
setPlatform(hostPlatform)
|
|
_resetWslCachesForTests()
|
|
})
|
|
|
|
// The RPC/relay prefetch is the only warm-up a remote client reaches, so it has
|
|
// to resolve the same project runtime the IPC handler does. Constructed through
|
|
// the barrel because the split chain resolves selectors in a later subclass.
|
|
describe('prefetchManagedWorktreeCreateBase (orca-runtime-get-worktree-terminal-provisioning-host)', () => {
|
|
it('warms up in the distro a WSL-routed project runs in', async () => {
|
|
_setWslCachesForTests({ available: true, distros: ['Ubuntu'] })
|
|
setPlatform('win32')
|
|
const runtime = new OrcaRuntimeService(makeStore() as never)
|
|
|
|
await runtime.prefetchManagedWorktreeCreateBase({ repoSelector: 'repo-1' })
|
|
|
|
expect(mocks.prefetchWorktreeCreateBase).toHaveBeenCalledWith(
|
|
expect.objectContaining({ gitOptions: { wslDistro: 'Ubuntu' } })
|
|
)
|
|
})
|
|
|
|
it('warms up on host git when no project runtime routes the repo', async () => {
|
|
setPlatform('darwin')
|
|
const runtime = new OrcaRuntimeService(makeStore() as never)
|
|
|
|
await runtime.prefetchManagedWorktreeCreateBase({ repoSelector: 'repo-1' })
|
|
|
|
expect(mocks.prefetchWorktreeCreateBase).toHaveBeenCalledWith(
|
|
expect.objectContaining({ gitOptions: {} })
|
|
)
|
|
})
|
|
|
|
// A repair-required runtime must degrade to host git, not fail the warm-up.
|
|
it('does not surface a repair-required project runtime as a prefetch failure', async () => {
|
|
_setWslCachesForTests({ available: true, distros: ['Debian'] })
|
|
setPlatform('win32')
|
|
const runtime = new OrcaRuntimeService(makeStore() as never)
|
|
|
|
await expect(
|
|
runtime.prefetchManagedWorktreeCreateBase({ repoSelector: 'repo-1' })
|
|
).resolves.toBeUndefined()
|
|
|
|
expect(mocks.prefetchWorktreeCreateBase).toHaveBeenCalledWith(
|
|
expect.objectContaining({ gitOptions: {} })
|
|
)
|
|
})
|
|
|
|
it('prepares the checkout the prefetch resolved', async () => {
|
|
_setWslCachesForTests({ available: true, distros: ['Ubuntu'] })
|
|
setPlatform('win32')
|
|
mocks.prefetchWorktreeCreateBase.mockImplementation(async ({ prepareCheckout }) => {
|
|
await prepareCheckout('origin/main')
|
|
return 'origin/main'
|
|
})
|
|
const runtime = new OrcaRuntimeService(makeStore() as never)
|
|
|
|
await runtime.prefetchManagedWorktreeCreateBase({ repoSelector: 'repo-1' })
|
|
|
|
expect(mocks.prepareWorktreeCreateForRepo).toHaveBeenCalledWith(
|
|
expect.anything(),
|
|
repo,
|
|
'origin/main',
|
|
undefined
|
|
)
|
|
})
|
|
})
|