diff --git a/cli/tools/task.rs b/cli/tools/task.rs index 49216312df..3f60c272f7 100644 --- a/cli/tools/task.rs +++ b/cli/tools/task.rs @@ -206,6 +206,7 @@ pub async fn execute_script( return task_runner .run_deno_task( &Url::from_directory_path(cli_options.initial_cwd()).unwrap(), + None, "", &TaskDefinition { command: Some(task_flags.task.as_ref().unwrap().to_string()), @@ -234,6 +235,7 @@ pub async fn execute_script( struct RunSingleOptions<'a> { task_name: &'a str, + package_name: Option<&'a str>, script: &'a str, cwd: PathBuf, custom_commands: HashMap>, @@ -354,10 +356,11 @@ impl<'a> TaskRunner<'a> { return Some( async move { match task.task_or_script { - TaskOrScript::Task(_, def) => { + TaskOrScript::Task { task: def, .. } => { runner .run_deno_task( - task.folder_url, + task.task_or_script.folder_url(), + task.task_or_script.package_name(), task.name, def, kill_signal, @@ -365,12 +368,13 @@ impl<'a> TaskRunner<'a> { ) .await } - TaskOrScript::Script(scripts, _) => { + TaskOrScript::Script { details, .. } => { runner .run_npm_script( - task.folder_url, + task.task_or_script.folder_url(), + task.task_or_script.package_name(), task.name, - scripts, + &details.tasks, kill_signal, args, ) @@ -426,17 +430,17 @@ impl<'a> TaskRunner<'a> { pub async fn run_deno_task( &self, dir_url: &Url, + package_name: Option<&str>, task_name: &str, definition: &TaskDefinition, kill_signal: KillSignal, argv: &'a [String], ) -> Result { let Some(command) = &definition.command else { - log::info!( - "{} {} {}", - colors::green("Task"), - colors::cyan(task_name), - colors::gray("(no command)") + self.output_task( + task_name, + package_name, + &colors::gray("(no command)").to_string(), ); return Ok(0); }; @@ -457,6 +461,7 @@ impl<'a> TaskRunner<'a> { self .run_single(RunSingleOptions { task_name, + package_name, script: command, cwd, custom_commands, @@ -469,6 +474,7 @@ impl<'a> TaskRunner<'a> { pub async fn run_npm_script( &self, dir_url: &Url, + package_name: Option<&str>, task_name: &str, scripts: &IndexMap, kill_signal: KillSignal, @@ -500,6 +506,7 @@ impl<'a> TaskRunner<'a> { let exit_code = self .run_single(RunSingleOptions { task_name, + package_name, script, cwd: cwd.clone(), custom_commands: custom_commands.clone(), @@ -522,6 +529,7 @@ impl<'a> TaskRunner<'a> { ) -> Result { let RunSingleOptions { task_name, + package_name, script, cwd, custom_commands, @@ -529,8 +537,9 @@ impl<'a> TaskRunner<'a> { argv, } = opts; - output_task( - opts.task_name, + self.output_task( + task_name, + package_name, &task_runner::get_script_with_args(script, argv), ); @@ -564,6 +573,26 @@ impl<'a> TaskRunner<'a> { } Ok(()) } + + fn output_task( + &self, + task_name: &str, + package_name: Option<&str>, + script: &str, + ) { + log::info!( + "{} {}{} {}", + colors::green("Task"), + colors::cyan(task_name), + package_name + .filter( + |_| self.task_flags.recursive || self.task_flags.filter.is_some() + ) + .map(|p| format!(" ({})", colors::gray(p))) + .unwrap_or_default(), + script, + ); + } } #[derive(Debug)] @@ -575,7 +604,6 @@ enum TaskError { struct ResolvedTask<'a> { id: usize, name: &'a str, - folder_url: &'a Url, task_or_script: TaskOrScript<'a>, dependencies: Vec, } @@ -585,26 +613,20 @@ fn sort_tasks_topo<'a>( task_name: &str, ) -> Result>, TaskError> { trait TasksConfig { - fn task( - &self, - name: &str, - ) -> Option<(&Url, TaskOrScript, &dyn TasksConfig)>; + fn task(&self, name: &str) -> Option<(TaskOrScript, &dyn TasksConfig)>; } impl TasksConfig for WorkspaceTasksConfig { - fn task( - &self, - name: &str, - ) -> Option<(&Url, TaskOrScript, &dyn TasksConfig)> { + fn task(&self, name: &str) -> Option<(TaskOrScript, &dyn TasksConfig)> { if let Some(member) = &self.member { - if let Some((dir_url, task_or_script)) = member.task(name) { - return Some((dir_url, task_or_script, self as &dyn TasksConfig)); + if let Some(task_or_script) = member.task(name) { + return Some((task_or_script, self as &dyn TasksConfig)); } } if let Some(root) = &self.root { - if let Some((dir_url, task_or_script)) = root.task(name) { + if let Some(task_or_script) = root.task(name) { // switch to only using the root tasks for the dependencies - return Some((dir_url, task_or_script, root as &dyn TasksConfig)); + return Some((task_or_script, root as &dyn TasksConfig)); } } None @@ -612,13 +634,10 @@ fn sort_tasks_topo<'a>( } impl TasksConfig for WorkspaceMemberTasksConfig { - fn task( - &self, - name: &str, - ) -> Option<(&Url, TaskOrScript, &dyn TasksConfig)> { - self.task(name).map(|(dir_url, task_or_script)| { - (dir_url, task_or_script, self as &dyn TasksConfig) - }) + fn task(&self, name: &str) -> Option<(TaskOrScript, &dyn TasksConfig)> { + self + .task(name) + .map(|task_or_script| (task_or_script, self as &dyn TasksConfig)) } } @@ -628,16 +647,14 @@ fn sort_tasks_topo<'a>( mut path: Vec<(&'a Url, &'a str)>, tasks_config: &'a dyn TasksConfig, ) -> Result { - let Some((folder_url, task_or_script, tasks_config)) = - tasks_config.task(name) - else { + let Some((task_or_script, tasks_config)) = tasks_config.task(name) else { return Err(TaskError::NotFound(name.to_string())); }; - if let Some(existing_task) = sorted - .iter() - .find(|task| task.name == name && task.folder_url == folder_url) - { + let folder_url = task_or_script.folder_url(); + if let Some(existing_task) = sorted.iter().find(|task| { + task.name == name && task.task_or_script.folder_url() == folder_url + }) { // already exists return Ok(existing_task.id); } @@ -650,7 +667,7 @@ fn sort_tasks_topo<'a>( } let mut dependencies: Vec = Vec::new(); - if let TaskOrScript::Task(_, task) = task_or_script { + if let TaskOrScript::Task { task, .. } = task_or_script { dependencies.reserve(task.dependencies.len()); for dep in &task.dependencies { let mut path = path.clone(); @@ -663,7 +680,6 @@ fn sort_tasks_topo<'a>( sorted.push(ResolvedTask { id, name, - folder_url, task_or_script, dependencies, }); @@ -710,15 +726,6 @@ fn matches_package( false } -fn output_task(task_name: &str, script: &str) { - log::info!( - "{} {} {}", - colors::green("Task"), - colors::cyan(task_name), - script, - ); -} - fn print_available_tasks_workspace( cli_options: &Arc, package_regex: &Regex, @@ -729,8 +736,7 @@ fn print_available_tasks_workspace( let workspace = cli_options.workspace(); let mut matched = false; - for (folder_url, folder) in workspace.config_folders_sorted_by_dependencies() - { + for (folder_url, folder) in workspace.config_folders() { if !recursive && !matches_package(folder, force_use_pkg_json, package_regex) { continue; @@ -927,7 +933,7 @@ fn visit_task_and_dependencies( visited.insert(name.to_string()); - if let Some((_, TaskOrScript::Task(_, task))) = &tasks_config.task(name) { + if let Some(TaskOrScript::Task { task, .. }) = &tasks_config.task(name) { for dep in &task.dependencies { visit_task_and_dependencies(tasks_config, visited, dep); } diff --git a/libs/config/workspace/mod.rs b/libs/config/workspace/mod.rs index d8465310a7..1511ff4795 100644 --- a/libs/config/workspace/mod.rs +++ b/libs/config/workspace/mod.rs @@ -1941,6 +1941,7 @@ impl WorkspaceDirectory { tasks.map(|tasks| WorkspaceMemberTasksConfigFile { folder_url: url_parent(&deno_json.specifier), tasks, + package_name: deno_json.json.name.clone(), }) }) .map_err(|error| ToTasksConfigError { @@ -1954,6 +1955,7 @@ impl WorkspaceDirectory { WorkspaceMemberTasksConfigFile { folder_url: url_parent(&pkg_json.specifier()), tasks: scripts, + package_name: pkg_json.name.clone(), } }), None => None, @@ -2110,13 +2112,36 @@ impl WorkspaceDirectory { pub enum TaskOrScript<'a> { /// A task from a deno.json. - Task(&'a IndexMap, &'a TaskDefinition), + Task { + details: &'a WorkspaceMemberTasksConfigFile, + task: &'a TaskDefinition, + }, /// A script from a package.json. - Script(&'a IndexMap, &'a str), + Script { + details: &'a WorkspaceMemberTasksConfigFile, + task: &'a str, + }, +} + +impl<'a> TaskOrScript<'a> { + pub fn package_name(&self) -> Option<&'a str> { + match self { + TaskOrScript::Task { details, .. } => details.package_name.as_deref(), + TaskOrScript::Script { details, .. } => details.package_name.as_deref(), + } + } + + pub fn folder_url(&self) -> &'a Url { + match self { + TaskOrScript::Task { details, .. } => &details.folder_url, + TaskOrScript::Script { details, .. } => &details.folder_url, + } + } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct WorkspaceMemberTasksConfigFile { + pub package_name: Option, pub folder_url: Url, pub tasks: IndexMap, } @@ -2180,23 +2205,21 @@ impl WorkspaceMemberTasksConfig { .unwrap_or(0) } - pub fn task(&self, name: &str) -> Option<(&Url, TaskOrScript)> { + pub fn task(&self, name: &str) -> Option { self .deno_json .as_ref() .and_then(|config| { - config - .tasks - .get(name) - .map(|t| (&config.folder_url, TaskOrScript::Task(&config.tasks, t))) + config.tasks.get(name).map(|task| TaskOrScript::Task { + details: config, + task, + }) }) .or_else(|| { self.package_json.as_ref().and_then(|config| { - config.tasks.get(name).map(|task| { - ( - &config.folder_url, - TaskOrScript::Script(&config.tasks, task), - ) + config.tasks.get(name).map(|script| TaskOrScript::Script { + details: config, + task: script, }) }) }) @@ -2239,7 +2262,7 @@ impl WorkspaceTasksConfig { ) } - pub fn task(&self, name: &str) -> Option<(&Url, TaskOrScript)> { + pub fn task(&self, name: &str) -> Option { self .member .as_ref() @@ -2699,6 +2722,7 @@ pub mod test { assert_eq!(workspace_dir.workspace.diagnostics(), vec![]); let root_deno_json = Some(WorkspaceMemberTasksConfigFile { folder_url: url_from_directory_path(&root_dir()).unwrap(), + package_name: None, tasks: IndexMap::from([ ("hi".to_string(), "echo hi".into()), ("overwrite".to_string(), "echo overwrite".into()), @@ -2738,6 +2762,7 @@ pub mod test { deno_json: Some(WorkspaceMemberTasksConfigFile { folder_url: url_from_directory_path(&root_dir().join("member")) .unwrap(), + package_name: None, tasks: IndexMap::from([ ("overwrite".to_string(), "echo overwritten".into()), ("bye".to_string(), "echo bye".into()), @@ -2768,6 +2793,7 @@ pub mod test { package_json: Some(WorkspaceMemberTasksConfigFile { folder_url: url_from_directory_path(&root_dir().join("pkg_json")) .unwrap(), + package_name: None, tasks: IndexMap::from([( "script".to_string(), "echo 1".to_string() diff --git a/tests/specs/task/filter/deno_all.out b/tests/specs/task/filter/deno_all.out index c3c3441559..f91df96c03 100644 --- a/tests/specs/task/filter/deno_all.out +++ b/tests/specs/task/filter/deno_all.out @@ -1,4 +1,4 @@ -Task dev echo '@deno/bar' +Task dev (@deno/bar) echo '@deno/bar' @deno/bar -Task dev echo '@deno/foo' +Task dev (@deno/foo) echo '@deno/foo' @deno/foo diff --git a/tests/specs/task/filter/deno_exact.out b/tests/specs/task/filter/deno_exact.out index 4bfebd6e92..d40b75d60a 100644 --- a/tests/specs/task/filter/deno_exact.out +++ b/tests/specs/task/filter/deno_exact.out @@ -1,2 +1,2 @@ -Task dev echo '@deno/foo' +Task dev (@deno/foo) echo '@deno/foo' @deno/foo diff --git a/tests/specs/task/filter/deno_filter_recursive.out b/tests/specs/task/filter/deno_filter_recursive.out index 4bfebd6e92..d40b75d60a 100644 --- a/tests/specs/task/filter/deno_filter_recursive.out +++ b/tests/specs/task/filter/deno_filter_recursive.out @@ -1,2 +1,2 @@ -Task dev echo '@deno/foo' +Task dev (@deno/foo) echo '@deno/foo' @deno/foo diff --git a/tests/specs/task/filter/deno_recursive.out b/tests/specs/task/filter/deno_recursive.out index c3c3441559..f91df96c03 100644 --- a/tests/specs/task/filter/deno_recursive.out +++ b/tests/specs/task/filter/deno_recursive.out @@ -1,4 +1,4 @@ -Task dev echo '@deno/bar' +Task dev (@deno/bar) echo '@deno/bar' @deno/bar -Task dev echo '@deno/foo' +Task dev (@deno/foo) echo '@deno/foo' @deno/foo diff --git a/tests/specs/task/filter/deno_scoped_exact.out b/tests/specs/task/filter/deno_scoped_exact.out index f7d61e8714..6b7b8deeec 100644 --- a/tests/specs/task/filter/deno_scoped_exact.out +++ b/tests/specs/task/filter/deno_scoped_exact.out @@ -1,2 +1,2 @@ -Task dev echo '@foo/bar' +Task dev (@foo/bar) echo '@foo/bar' @foo/bar diff --git a/tests/specs/task/filter/deno_scoped_multi.out b/tests/specs/task/filter/deno_scoped_multi.out index f4609e94b6..6b034e397b 100644 --- a/tests/specs/task/filter/deno_scoped_multi.out +++ b/tests/specs/task/filter/deno_scoped_multi.out @@ -1,4 +1,4 @@ -Task dev echo '@foo/bar' +Task dev (@foo/bar) echo '@foo/bar' @foo/bar -Task dev echo '@foo/baz' +Task dev (@foo/baz) echo '@foo/baz' @foo/baz diff --git a/tests/specs/task/filter/deno_workspace_order.out b/tests/specs/task/filter/deno_workspace_order.out index f4609e94b6..6b034e397b 100644 --- a/tests/specs/task/filter/deno_workspace_order.out +++ b/tests/specs/task/filter/deno_workspace_order.out @@ -1,4 +1,4 @@ -Task dev echo '@foo/bar' +Task dev (@foo/bar) echo '@foo/bar' @foo/bar -Task dev echo '@foo/baz' +Task dev (@foo/baz) echo '@foo/baz' @foo/baz diff --git a/tests/specs/task/filter/npm_all.out b/tests/specs/task/filter/npm_all.out index 592d4640cd..c94a03c65a 100644 --- a/tests/specs/task/filter/npm_all.out +++ b/tests/specs/task/filter/npm_all.out @@ -1,4 +1,4 @@ -Task dev echo 'bar' +Task dev (bar) echo 'bar' bar -Task dev echo 'foo' +Task dev (foo) echo 'foo' foo diff --git a/tests/specs/task/filter/npm_exact.out b/tests/specs/task/filter/npm_exact.out index f879b66df8..86944f30bb 100644 --- a/tests/specs/task/filter/npm_exact.out +++ b/tests/specs/task/filter/npm_exact.out @@ -1,2 +1,2 @@ -Task dev echo 'foo' +Task dev (foo) echo 'foo' foo diff --git a/tests/specs/task/filter/npm_filter_recursive.out b/tests/specs/task/filter/npm_filter_recursive.out index f879b66df8..86944f30bb 100644 --- a/tests/specs/task/filter/npm_filter_recursive.out +++ b/tests/specs/task/filter/npm_filter_recursive.out @@ -1,2 +1,2 @@ -Task dev echo 'foo' +Task dev (foo) echo 'foo' foo diff --git a/tests/specs/task/filter/npm_multi.out b/tests/specs/task/filter/npm_multi.out index 58898a5965..db5df3c97b 100644 --- a/tests/specs/task/filter/npm_multi.out +++ b/tests/specs/task/filter/npm_multi.out @@ -1,4 +1,4 @@ -Task dev echo 'multi-a' +Task dev (multi-a) echo 'multi-a' multi-a -Task dev echo 'multi-b' +Task dev (multi-b) echo 'multi-b' multi-b diff --git a/tests/specs/task/filter/npm_recursive.out b/tests/specs/task/filter/npm_recursive.out index 592d4640cd..c94a03c65a 100644 --- a/tests/specs/task/filter/npm_recursive.out +++ b/tests/specs/task/filter/npm_recursive.out @@ -1,4 +1,4 @@ -Task dev echo 'bar' +Task dev (bar) echo 'bar' bar -Task dev echo 'foo' +Task dev (foo) echo 'foo' foo diff --git a/tests/specs/task/filter/npm_scoped_exact.out b/tests/specs/task/filter/npm_scoped_exact.out index f7d61e8714..6b7b8deeec 100644 --- a/tests/specs/task/filter/npm_scoped_exact.out +++ b/tests/specs/task/filter/npm_scoped_exact.out @@ -1,2 +1,2 @@ -Task dev echo '@foo/bar' +Task dev (@foo/bar) echo '@foo/bar' @foo/bar diff --git a/tests/specs/task/filter/npm_scoped_multi.out b/tests/specs/task/filter/npm_scoped_multi.out index f4609e94b6..6b034e397b 100644 --- a/tests/specs/task/filter/npm_scoped_multi.out +++ b/tests/specs/task/filter/npm_scoped_multi.out @@ -1,4 +1,4 @@ -Task dev echo '@foo/bar' +Task dev (@foo/bar) echo '@foo/bar' @foo/bar -Task dev echo '@foo/baz' +Task dev (@foo/baz) echo '@foo/baz' @foo/baz diff --git a/tests/specs/task/filter/npm_workspace_order.out b/tests/specs/task/filter/npm_workspace_order.out index f4609e94b6..6b034e397b 100644 --- a/tests/specs/task/filter/npm_workspace_order.out +++ b/tests/specs/task/filter/npm_workspace_order.out @@ -1,4 +1,4 @@ -Task dev echo '@foo/bar' +Task dev (@foo/bar) echo '@foo/bar' @foo/bar -Task dev echo '@foo/baz' +Task dev (@foo/baz) echo '@foo/baz' @foo/baz diff --git a/tests/specs/task/recursive_order/task.out b/tests/specs/task/recursive_order/task.out index e1aa7100ec..7d53e0b193 100644 --- a/tests/specs/task/recursive_order/task.out +++ b/tests/specs/task/recursive_order/task.out @@ -1,4 +1,4 @@ -Task build echo b +Task build (b) echo b b -Task build echo a +Task build (a) echo a a