use std::path::PathBuf; use project::TaskSourceKind;use task::{ResolvedTask, TaskContext, TaskTemplate};use ui::{ViewContext, WindowContext}; use crate::Workspace; pub fn task_cwd(workspace: &Workspace, cx: &mut WindowContext) -> anyhow::Result<Option<PathBuf>> { let project = workspace.project().read(cx); let available_worktrees = project .worktrees() .filter(|worktree| { let worktree = worktree.read(cx); worktree.is_visible() && worktree.is_local() && worktree.root_entry().map_or(false, |e| e.is_dir()) }) .collect::<Vec<_>>(); let cwd = match available_worktrees.len() { 0 => None, 1 => Some(available_worktrees[0].read(cx).abs_path()), _ => { let cwd_for_active_entry = project.active_entry().and_then(|entry_id| { available_worktrees.into_iter().find_map(|worktree| { let worktree = worktree.read(cx); if worktree.contains_entry(entry_id) { Some(worktree.abs_path()) } else { None } }) }); anyhow::ensure!( cwd_for_active_entry.is_some(), "Cannot determine task cwd for multiple worktrees" ); cwd_for_active_entry } }; Ok(cwd.map(|path| path.to_path_buf()))} pub fn schedule_task( workspace: &Workspace, task_source_kind: TaskSourceKind, task_to_resolve: &TaskTemplate, task_cx: &TaskContext, omit_history: bool, cx: &mut ViewContext<'_, Workspace>,) { if let Some(spawn_in_terminal) = task_to_resolve.resolve_task(&task_source_kind.to_id_base(), task_cx) { schedule_resolved_task( workspace, task_source_kind, spawn_in_terminal, omit_history, cx, ); }} pub fn schedule_resolved_task( workspace: &Workspace, task_source_kind: TaskSourceKind, mut resolved_task: ResolvedTask, omit_history: bool, cx: &mut ViewContext<'_, Workspace>,) { if let Some(spawn_in_terminal) = resolved_task.resolved.take() { if !omit_history { resolved_task.resolved = Some(spawn_in_terminal.clone()); workspace.project().update(cx, |project, cx| { project.task_inventory().update(cx, |inventory, _| { inventory.task_scheduled(task_source_kind, resolved_task); }) }); } cx.emit(crate::Event::SpawnTask(spawn_in_terminal)); }}
use std::path::PathBuf;
use project::TaskSourceKind;
use task::{ResolvedTask, TaskContext, TaskTemplate};
use ui::{ViewContext, WindowContext};
use crate::Workspace;
pub fn task_cwd(workspace: &Workspace, cx: &mut WindowContext) -> anyhow::Result<Option<PathBuf>> {
let project = workspace.project().read(cx);
let available_worktrees = project
.worktrees()
.filter(|worktree| {
let worktree = worktree.read(cx);
worktree.is_visible()
&& worktree.is_local()
&& worktree.root_entry().map_or(false, |e| e.is_dir())
})
.collect::<Vec<_>>();
let cwd = match available_worktrees.len() {
0 => None,
1 => Some(available_worktrees[0].read(cx).abs_path()),
_ => {
let cwd_for_active_entry = project.active_entry().and_then(|entry_id| {
available_worktrees.into_iter().find_map(|worktree| {
let worktree = worktree.read(cx);
if worktree.contains_entry(entry_id) {
Some(worktree.abs_path())
} else {
None
}
})
});
anyhow::ensure!(
cwd_for_active_entry.is_some(),
"Cannot determine task cwd for multiple worktrees"
);
cwd_for_active_entry
}
};
Ok(cwd.map(|path| path.to_path_buf()))
}
pub fn schedule_task(
workspace: &Workspace,
task_source_kind: TaskSourceKind,
task_to_resolve: &TaskTemplate,
task_cx: &TaskContext,
omit_history: bool,
cx: &mut ViewContext<'_, Workspace>,
) {
if let Some(spawn_in_terminal) =
task_to_resolve.resolve_task(&task_source_kind.to_id_base(), task_cx)
{
schedule_resolved_task(
workspace,
task_source_kind,
spawn_in_terminal,
omit_history,
cx,
);
}
}
pub fn schedule_resolved_task(
workspace: &Workspace,
task_source_kind: TaskSourceKind,
mut resolved_task: ResolvedTask,
omit_history: bool,
cx: &mut ViewContext<'_, Workspace>,
) {
if let Some(spawn_in_terminal) = resolved_task.resolved.take() {
if !omit_history {
resolved_task.resolved = Some(spawn_in_terminal.clone());
workspace.project().update(cx, |project, cx| {
project.task_inventory().update(cx, |inventory, _| {
inventory.task_scheduled(task_source_kind, resolved_task);
})
});
}
cx.emit(crate::Event::SpawnTask(spawn_in_terminal));
}
}