debugger: Fix global debug tasks not being picked up (#33664)
Release Notes: - Fixed a bug which caused global debug scenarios (from global .zed/debug.json) to not be picked up.
This commit is contained in:
parent
3db452eec7
commit
42c59014a9
2 changed files with 81 additions and 0 deletions
|
@ -2975,6 +2975,20 @@ impl Project {
|
||||||
}),
|
}),
|
||||||
Err(_) => {}
|
Err(_) => {}
|
||||||
},
|
},
|
||||||
|
SettingsObserverEvent::LocalDebugScenariosUpdated(result) => match result {
|
||||||
|
Err(InvalidSettingsError::Debug { message, path }) => {
|
||||||
|
let message =
|
||||||
|
format!("Failed to set local debug scenarios in {path:?}:\n{message}");
|
||||||
|
cx.emit(Event::Toast {
|
||||||
|
notification_id: format!("local-debug-scenarios-{path:?}").into(),
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Ok(path) => cx.emit(Event::HideToast {
|
||||||
|
notification_id: format!("local-debug-scenarios-{path:?}").into(),
|
||||||
|
}),
|
||||||
|
Err(_) => {}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -554,6 +554,7 @@ pub enum SettingsObserverMode {
|
||||||
pub enum SettingsObserverEvent {
|
pub enum SettingsObserverEvent {
|
||||||
LocalSettingsUpdated(Result<PathBuf, InvalidSettingsError>),
|
LocalSettingsUpdated(Result<PathBuf, InvalidSettingsError>),
|
||||||
LocalTasksUpdated(Result<PathBuf, InvalidSettingsError>),
|
LocalTasksUpdated(Result<PathBuf, InvalidSettingsError>),
|
||||||
|
LocalDebugScenariosUpdated(Result<PathBuf, InvalidSettingsError>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventEmitter<SettingsObserverEvent> for SettingsObserver {}
|
impl EventEmitter<SettingsObserverEvent> for SettingsObserver {}
|
||||||
|
@ -565,6 +566,7 @@ pub struct SettingsObserver {
|
||||||
project_id: u64,
|
project_id: u64,
|
||||||
task_store: Entity<TaskStore>,
|
task_store: Entity<TaskStore>,
|
||||||
_global_task_config_watcher: Task<()>,
|
_global_task_config_watcher: Task<()>,
|
||||||
|
_global_debug_config_watcher: Task<()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// SettingsObserver observers changes to .zed/{settings, task}.json files in local worktrees
|
/// SettingsObserver observers changes to .zed/{settings, task}.json files in local worktrees
|
||||||
|
@ -597,6 +599,11 @@ impl SettingsObserver {
|
||||||
paths::tasks_file().clone(),
|
paths::tasks_file().clone(),
|
||||||
cx,
|
cx,
|
||||||
),
|
),
|
||||||
|
_global_debug_config_watcher: Self::subscribe_to_global_debug_scenarios_changes(
|
||||||
|
fs.clone(),
|
||||||
|
paths::debug_scenarios_file().clone(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,6 +624,11 @@ impl SettingsObserver {
|
||||||
paths::tasks_file().clone(),
|
paths::tasks_file().clone(),
|
||||||
cx,
|
cx,
|
||||||
),
|
),
|
||||||
|
_global_debug_config_watcher: Self::subscribe_to_global_debug_scenarios_changes(
|
||||||
|
fs.clone(),
|
||||||
|
paths::debug_scenarios_file().clone(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1047,6 +1059,61 @@ impl SettingsObserver {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
fn subscribe_to_global_debug_scenarios_changes(
|
||||||
|
fs: Arc<dyn Fs>,
|
||||||
|
file_path: PathBuf,
|
||||||
|
cx: &mut Context<Self>,
|
||||||
|
) -> Task<()> {
|
||||||
|
let mut user_tasks_file_rx =
|
||||||
|
watch_config_file(&cx.background_executor(), fs, file_path.clone());
|
||||||
|
let user_tasks_content = cx.background_executor().block(user_tasks_file_rx.next());
|
||||||
|
let weak_entry = cx.weak_entity();
|
||||||
|
cx.spawn(async move |settings_observer, cx| {
|
||||||
|
let Ok(task_store) = settings_observer.read_with(cx, |settings_observer, _| {
|
||||||
|
settings_observer.task_store.clone()
|
||||||
|
}) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
if let Some(user_tasks_content) = user_tasks_content {
|
||||||
|
let Ok(()) = task_store.update(cx, |task_store, cx| {
|
||||||
|
task_store
|
||||||
|
.update_user_debug_scenarios(
|
||||||
|
TaskSettingsLocation::Global(&file_path),
|
||||||
|
Some(&user_tasks_content),
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
.log_err();
|
||||||
|
}) else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
while let Some(user_tasks_content) = user_tasks_file_rx.next().await {
|
||||||
|
let Ok(result) = task_store.update(cx, |task_store, cx| {
|
||||||
|
task_store.update_user_debug_scenarios(
|
||||||
|
TaskSettingsLocation::Global(&file_path),
|
||||||
|
Some(&user_tasks_content),
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
}) else {
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
weak_entry
|
||||||
|
.update(cx, |_, cx| match result {
|
||||||
|
Ok(()) => cx.emit(SettingsObserverEvent::LocalDebugScenariosUpdated(Ok(
|
||||||
|
file_path.clone(),
|
||||||
|
))),
|
||||||
|
Err(err) => cx.emit(SettingsObserverEvent::LocalDebugScenariosUpdated(
|
||||||
|
Err(InvalidSettingsError::Tasks {
|
||||||
|
path: file_path.clone(),
|
||||||
|
message: err.to_string(),
|
||||||
|
}),
|
||||||
|
)),
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn local_settings_kind_from_proto(kind: proto::LocalSettingsKind) -> LocalSettingsKind {
|
pub fn local_settings_kind_from_proto(kind: proto::LocalSettingsKind) -> LocalSettingsKind {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue