Skip to content

Commit bf99e7d

Browse files
authored
Update Task to Use Relative Working Path (#1844)
CETask now saves the relative working path instead of the absolute path to accommodate variations between users’ environments. The working directory field will remain empty by default, eliminating the need for user input. This change simplifies task configuration via the JSON file, as only the task name and command are now required.
1 parent be21f9d commit bf99e7d

File tree

8 files changed

+27
-15
lines changed

8 files changed

+27
-15
lines changed

CodeEdit/Features/CEWorkSpaceSettings/CEWorkspaceSettings/Models/CETask.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ class CETask: ObservableObject, Identifiable, Hashable, Codable {
3030
self.environmentVariables = environmentVariables
3131
}
3232

33-
init(target: String, workingDirectory: String) {
33+
init(target: String) {
3434
self.target = target
35-
self.workingDirectory = workingDirectory
3635
}
3736

3837
var isInvalid: Bool {

CodeEdit/Features/CEWorkSpaceSettings/CEWorkspaceSettings/Views/AddCETaskView.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ struct AddCETaskView: View {
1414
@EnvironmentObject var workspaceSettingsManager: CEWorkspaceSettings
1515
@StateObject var newTask: CETask
1616

17-
init(workingDirectory: String) {
18-
self._newTask = StateObject(wrappedValue: CETask(target: "My Mac", workingDirectory: workingDirectory))
17+
init() {
18+
self._newTask = StateObject(wrappedValue: CETask(target: "My Mac"))
1919
}
2020
var body: some View {
2121
VStack(spacing: 0) {
@@ -47,5 +47,5 @@ struct AddCETaskView: View {
4747
}
4848

4949
#Preview {
50-
AddCETaskView(workingDirectory: "/User/")
50+
AddCETaskView()
5151
}

CodeEdit/Features/CEWorkSpaceSettings/CEWorkspaceSettings/Views/CEWorkspaceSettingsView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ struct CEWorkspaceSettingsView: View {
7676
selectedTaskIndex: selectedTaskIndex
7777
)
7878
} else {
79-
AddCETaskView(workingDirectory: workspace.fileURL?.relativePath ?? "")
79+
AddCETaskView()
8080
}
8181
}
8282
}

CodeEdit/Features/CEWorkSpaceSettings/CEWorkspaceSettings/Views/EditCETaskView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ struct EditCETaskView: View {
1212
var dismiss
1313

1414
@EnvironmentObject var workspaceSettingsManager: CEWorkspaceSettings
15-
@EnvironmentObject var taskManger: TaskManager
15+
@EnvironmentObject var taskManager: TaskManager
1616
@ObservedObject var task: CETask
1717

1818
let selectedTaskIndex: Int
@@ -27,7 +27,7 @@ struct EditCETaskView: View {
2727
$0.id == task.id
2828
})
2929
try? workspaceSettingsManager.savePreferences()
30-
taskManger.deleteTask(taskID: task.id)
30+
taskManager.deleteTask(taskID: task.id)
3131
self.dismiss()
3232
} label: {
3333
Text("Delete")

CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate {
133133
self.commandsPaletteState = .init()
134134
self.workspaceSettingsManager = CEWorkspaceSettings(workspaceURL: url)
135135
if let workspaceSettingsManager {
136-
self.taskManager = TaskManager(workspaceSettings: workspaceSettingsManager.settings)
136+
self.taskManager = TaskManager(
137+
workspaceSettings: workspaceSettingsManager.settings,
138+
workspaceURL: url
139+
)
137140
}
138141

139142
editorManager?.restoreFromState(self)

CodeEdit/Features/Tasks/Models/CEActiveTask.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,16 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable {
3434
}.store(in: &cancellables)
3535
}
3636

37-
func run() {
37+
func run(workspaceURL: URL? = nil) {
3838
Task {
39+
// Reconstruct the full command to ensure it executes in the correct directory.
40+
// Because: CETask only contains information about the relative path.
41+
let fullCommand: String
42+
if let workspaceURL = workspaceURL {
43+
fullCommand = "cd \(workspaceURL.relativePath) && \(task.fullCommand)"
44+
} else {
45+
fullCommand = task.fullCommand
46+
}
3947
guard let process, let outputPipe else { return }
4048

4149
await updateTaskStatus(to: .running)
@@ -61,7 +69,7 @@ class CEActiveTask: ObservableObject, Identifiable, Hashable {
6169
do {
6270
try Shell.executeCommandWithShell(
6371
process: process,
64-
command: self.task.fullCommand,
72+
command: fullCommand,
6573
environmentVariables: self.task.environmentVariablesDictionary,
6674
shell: Shell.zsh, // TODO: Let user decide which shell to use
6775
outputPipe: outputPipe

CodeEdit/Features/Tasks/TaskManager.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ class TaskManager: ObservableObject {
1616

1717
@ObservedObject var workspaceSettings: CEWorkspaceSettingsData
1818

19+
private var workspaceURL: URL?
1920
private var settingsListener: AnyCancellable?
2021

21-
init(workspaceSettings: CEWorkspaceSettingsData) {
22+
init(workspaceSettings: CEWorkspaceSettingsData, workspaceURL: URL? = nil) {
23+
self.workspaceURL = workspaceURL
2224
self.workspaceSettings = workspaceSettings
2325

2426
settingsListener = workspaceSettings.$tasks
@@ -75,10 +77,10 @@ class TaskManager: ObservableObject {
7577
while activeTask.status == .running {
7678
await Task.yield()
7779
}
78-
activeTask.run()
80+
activeTask.run(workspaceURL: workspaceURL)
7981
} else {
8082
let runningTask = CEActiveTask(task: task)
81-
runningTask.run()
83+
runningTask.run(workspaceURL: workspaceURL)
8284
await MainActor.run {
8385
activeTasks[task.id] = runningTask
8486
}

CodeEditTests/Features/Documents/DocumentsUnitTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ final class DocumentsUnitTests: XCTestCase {
2222
super.setUp()
2323
hapticFeedbackPerformerMock = NSHapticFeedbackPerformerMock()
2424
navigatorViewModel = .init()
25-
workspace.taskManager = TaskManager(workspaceSettings: .init())
25+
workspace.taskManager = TaskManager(workspaceSettings: CEWorkspaceSettingsData())
2626
window = NSWindow()
2727
splitViewController = .init(
2828
workspace: workspace,

0 commit comments

Comments
 (0)