Revert "feat(workspace): set project location from the create-worktree host p…" (#14912)

This reverts commit e4e54a17d0.
This commit is contained in:
Jinjing
2026-08-16 10:41:39 -07:00
committed by GitHub
parent 763b1febeb
commit b60df2e3d6
18 changed files with 26 additions and 1243 deletions
@@ -1,68 +0,0 @@
import { describe, expect, it } from 'vitest'
import type { ProjectHostSetup } from '../../../shared/project-types'
import type { Repo } from '../../../shared/repo-types'
import { mergeProjectHostSetupCompatibilityState } from './project-host-compatibility'
const PROJECT_ID = 'github:acme/orca'
function repo(overrides: Partial<Repo> & Pick<Repo, 'id'>): Repo {
return {
path: `/src/${overrides.id}`,
displayName: 'orca',
addedAt: 1,
upstream: { owner: 'acme', repo: 'orca' },
...overrides
} as Repo
}
function pendingSetup(overrides: Partial<ProjectHostSetup> = {}): ProjectHostSetup {
return {
id: `${PROJECT_ID}::ssh:devbox`,
projectId: PROJECT_ID,
hostId: 'ssh:devbox',
repoId: '',
path: '',
displayName: 'orca',
setupState: 'not-set-up',
setupMethod: 'pending',
createdAt: 1,
updatedAt: 1,
...overrides
} as ProjectHostSetup
}
describe('mergeProjectHostSetupCompatibilityState', () => {
it('keeps a placeholder for a host with no repo yet', () => {
const merged = mergeProjectHostSetupCompatibilityState(
{ projects: [], projectHostSetups: [pendingSetup()] },
[repo({ id: 'local-repo' })]
)
expect(merged.projectHostSetups.map((setup) => setup.hostId)).toEqual(['local', 'ssh:devbox'])
})
// Setting a location on a host that already had a placeholder projects a ready setup for
// the same project+host; the placeholder must not survive to shadow it.
it('drops a placeholder once a repo covers the same project and host', () => {
const merged = mergeProjectHostSetupCompatibilityState(
{ projects: [], projectHostSetups: [pendingSetup()] },
[repo({ id: 'local-repo' }), repo({ id: 'devbox-repo', executionHostId: 'ssh:devbox' })]
)
expect(merged.projectHostSetups).toHaveLength(2)
expect(merged.projectHostSetups.every((setup) => setup.setupState === 'ready')).toBe(true)
expect(merged.projectHostSetups.map((setup) => setup.id)).toEqual(['local-repo', 'devbox-repo'])
})
it('keeps the placeholder when the repo covers a different host', () => {
const merged = mergeProjectHostSetupCompatibilityState(
{ projects: [], projectHostSetups: [pendingSetup({ hostId: 'ssh:other' })] },
[repo({ id: 'devbox-repo', executionHostId: 'ssh:devbox' })]
)
expect(merged.projectHostSetups.map((setup) => setup.hostId)).toEqual([
'ssh:devbox',
'ssh:other'
])
})
})
@@ -23,10 +23,6 @@ export function isRepoBackedProjectHostSetup(
return repoId.length > 0 && (currentRepoIds.has(repoId) || setup.id === repoId)
}
function projectHostKey(setup: Pick<ProjectHostSetup, 'projectId' | 'hostId'>): string {
return `${setup.projectId}\u0000${setup.hostId}`
}
export function mergeProjectHostSetupCompatibilityState(
state: Pick<PersistedState, 'projects' | 'projectHostSetups'>,
repos: readonly Repo[]
@@ -39,7 +35,6 @@ export function mergeProjectHostSetupCompatibilityState(
const currentRepoIds = new Set(repos.map((repo) => repo.id))
const projectedProjectIds = new Set(projection.projects.map((project) => project.id))
const projectedSetupIds = new Set(projection.setups.map((setup) => setup.id))
const projectedHosts = new Set(projection.setups.map(projectHostKey))
// Why: legacy/repo-backed setup rows reuse the repo id; keep only independent rows so repo deletion leaves no ghosts.
const independentSetups = (state.projectHostSetups ?? [])
.filter((setup) => {
@@ -53,10 +48,6 @@ export function mergeProjectHostSetupCompatibilityState(
const remappedProjectId = succession.remappedProjectIds.get(setup.projectId)
return remappedProjectId ? { ...setup, projectId: remappedProjectId } : setup
})
// Why: a project resolves to one setup per host. Once a repo projection covers that
// pair, a leftover placeholder is a ghost that shadows the ready row — it sorts first
// and reads back as "not set up". Runs after the remap so renamed rows are caught too.
.filter((setup) => !projectedHosts.has(projectHostKey(setup)))
const independentProjectIds = new Set(independentSetups.map((setup) => setup.projectId))
const independentProjects = (state.projects ?? [])
.filter(