diff --git a/cmuxTests/WorkspaceSplitStartupCommandTests.swift b/cmuxTests/WorkspaceSplitStartupCommandTests.swift index dbe7e8191fa0..1425cee669d9 100644 --- a/cmuxTests/WorkspaceSplitStartupCommandTests.swift +++ b/cmuxTests/WorkspaceSplitStartupCommandTests.swift @@ -153,7 +153,7 @@ final class WorkspaceSplitStartupCommandTests: XCTestCase { ) } - func testTabManagerSplitCarriesRequestedWorkingDirectoryAndStartupCommand() { + func testTabManagerSplitCarriesRequestedWorkingDirectoryAndStartupCommand() throws { let manager = TabManager() guard let workspace = manager.selectedWorkspace, let sourcePanelId = workspace.focusedPanelId else { @@ -162,6 +162,8 @@ final class WorkspaceSplitStartupCommandTests: XCTestCase { } let requestedDirectory = "/tmp/cmux-split-startup-\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: requestedDirectory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(atPath: requestedDirectory) } let startupCommand = "/tmp/cmux-tmux-command-\(UUID().uuidString).sh" let tmuxStartCommand = "node /opt/oh-my-codex/dist/omx.js hud --watch" let initialDividerPosition = 0.875 @@ -239,6 +241,8 @@ final class WorkspaceSplitStartupCommandTests: XCTestCase { let placeholderCommand = "/bin/sh -c 'printf placeholder; while :; do sleep 86400; done'" let attachCommand = "/bin/sh -c 'opencode attach http://127.0.0.1:4096 --session subagent --dir /tmp/omo'" let requestedDirectory = "/tmp/cmux-respawn-\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: requestedDirectory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(atPath: requestedDirectory) } let startupEnvironment = [ "CMUX_OMO_SUBAGENT": "1", "OMO_SUBAGENT_DESC": "test" diff --git a/cmuxTests/WorkspaceTerminalTabWorkingDirectoryTests.swift b/cmuxTests/WorkspaceTerminalTabWorkingDirectoryTests.swift index 9094a51e6ed3..885c56e83c54 100644 --- a/cmuxTests/WorkspaceTerminalTabWorkingDirectoryTests.swift +++ b/cmuxTests/WorkspaceTerminalTabWorkingDirectoryTests.swift @@ -15,6 +15,8 @@ struct WorkspaceTerminalTabWorkingDirectoryTests { @Test("Cmd+T after session restore uses workspace cwd when focused agent has no terminal cwd") func cmdTAfterSessionRestoreUsesWorkspaceCurrentDirectoryForAgentPane() throws { let workspaceDirectory = "/tmp/cmux-cmdt-restore-\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: workspaceDirectory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(atPath: workspaceDirectory) } let agentPanelId = UUID() let snapshot = SessionWorkspaceSnapshot( workspaceId: UUID(), @@ -396,6 +398,8 @@ struct WorkspaceTerminalTabWorkingDirectoryTests { func newTerminalToRightUsesAnchorTabWorkingDirectoryWhenAnchorIsNotSelected() throws { let selectedDirectory = "/tmp/cmux-selected-\(UUID().uuidString)" let anchorDirectory = "/tmp/cmux-anchor-\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: anchorDirectory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(atPath: anchorDirectory) } let workspace = Workspace(workingDirectory: "/tmp/cmux-workspace-\(UUID().uuidString)") let paneId = try #require(workspace.bonsplitController.focusedPaneId) let selectedPanel = try #require(workspace.focusedTerminalPanel) @@ -433,6 +437,8 @@ struct WorkspaceTerminalTabWorkingDirectoryTests { func surfaceCreateInheritsWorkspaceCurrentDirectoryForAgentPane() throws { let previousManager = TerminalController.shared.activeTabManagerForCallerNotification() let workspaceDirectory = "/tmp/cmux-surface-create-\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: workspaceDirectory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(atPath: workspaceDirectory) } let manager = TabManager() let workspace = try #require(manager.selectedWorkspace) workspace.currentDirectory = workspaceDirectory diff --git a/cmuxTests/WorkspaceTerminalWorkingDirectoryFallbackTests.swift b/cmuxTests/WorkspaceTerminalWorkingDirectoryFallbackTests.swift index 85e5c4c1cd3c..0e1db839646e 100644 --- a/cmuxTests/WorkspaceTerminalWorkingDirectoryFallbackTests.swift +++ b/cmuxTests/WorkspaceTerminalWorkingDirectoryFallbackTests.swift @@ -74,6 +74,8 @@ import Testing let staleCurrentDirectory = workspace.currentDirectory let requestedDirectory = "/tmp/cmux-requested-tab-cwd-\(UUID().uuidString)" + try FileManager.default.createDirectory(atPath: requestedDirectory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(atPath: requestedDirectory) } let sourcePanel = try #require( workspace.newTerminalSurface( inPane: sourcePaneId, diff --git a/cmuxTests/WorkspaceUnitTests.swift b/cmuxTests/WorkspaceUnitTests.swift index 31c30dc70ac8..1762588dc338 100644 --- a/cmuxTests/WorkspaceUnitTests.swift +++ b/cmuxTests/WorkspaceUnitTests.swift @@ -7494,12 +7494,20 @@ final class WorkspacePanelGitBranchTests: XCTestCase { XCTAssertEqual(branches.map(\.isDirty), [true, false, false]) } - func testSidebarBranchDirectoryEntriesStayStableAcrossFocusedSplitChanges() { + func testSidebarBranchDirectoryEntriesStayStableAcrossFocusedSplitChanges() throws { let workspace = Workspace() - let leftLiveDirectory = "/repo/left/live" - let rightFocusedDirectory = "/repo/right/focused" - let leftFocusedDirectory = "/repo/left/focused" - let rightRequestedDirectory = "/repo/right/requested" + // New splits resolve local cwds against the filesystem (#16248), so + // the inherited directories must exist. + let root = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-sidebar-dirs-\(UUID().uuidString)", isDirectory: true) + defer { try? FileManager.default.removeItem(at: root) } + let leftLiveDirectory = root.appendingPathComponent("left/live", isDirectory: true).path + let rightFocusedDirectory = root.appendingPathComponent("right/focused", isDirectory: true).path + let leftFocusedDirectory = root.appendingPathComponent("left/focused", isDirectory: true).path + let rightRequestedDirectory = root.appendingPathComponent("right/requested", isDirectory: true).path + for directory in [leftLiveDirectory, rightFocusedDirectory, leftFocusedDirectory, rightRequestedDirectory] { + try FileManager.default.createDirectory(atPath: directory, withIntermediateDirectories: true) + } guard let leftPanelId = workspace.focusedPanelId else { XCTFail("Expected initial focused panel")