From ac3ce027e0319c8d36792864492d527abf565407 Mon Sep 17 00:00:00 2001 From: Incharajayaram Date: Sat, 17 Jan 2026 22:26:05 +0530 Subject: [PATCH] unifying pixi run and pixi task list --- crates/pixi_cli/src/run.rs | 64 +++++++++++-------- crates/pixi_cli/src/task.rs | 2 +- .../pixi-build-rust/Cargo.lock | 7 ++ 3 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.lock diff --git a/crates/pixi_cli/src/run.rs b/crates/pixi_cli/src/run.rs index e4b6a52d9f..afee81ee49 100644 --- a/crates/pixi_cli/src/run.rs +++ b/crates/pixi_cli/src/run.rs @@ -1,5 +1,5 @@ use std::{ - collections::{HashMap, HashSet, hash_map::Entry}, + collections::{HashMap, hash_map::Entry}, convert::identity, ffi::OsString, string::String, @@ -22,7 +22,7 @@ use pixi_core::{ lock_file::{ReinstallPackages, UpdateLockFileOptions, UpdateMode}, workspace::{Environment, errors::UnsupportedPlatformError}, }; -use pixi_manifest::{FeaturesExt, TaskName}; +use pixi_manifest::{FeaturesExt}; use pixi_progress::global_multi_progress; use pixi_task::{ AmbiguousTask, CanSkip, ExecutableTask, FailedToParseShellScript, InvalidWorkingDirectory, @@ -34,6 +34,7 @@ use tokio_util::sync::CancellationToken; use tracing::Level; use crate::cli_config::{LockAndInstallConfig, WorkspaceConfig}; +use crate::task::print_tasks; /// Runs task in the pixi environment. /// @@ -353,33 +354,44 @@ pub async fn execute(args: Args) -> miette::Result<()> { Ok(()) } -/// Called when a command was not found. -fn command_not_found<'p>(workspace: &'p Workspace, explicit_environment: Option>) { - let available_tasks: HashSet = - if let Some(explicit_environment) = explicit_environment { - explicit_environment.get_filtered_tasks() - } else { - workspace - .environments() - .into_iter() - .flat_map(|env| env.get_filtered_tasks()) - .collect() - }; +fn command_not_found<'p>( + workspace: &'p Workspace, + explicit_environment: Option>, +) { + use std::collections::HashMap; - if !available_tasks.is_empty() { - pixi_progress::println!( - "\nAvailable tasks:\n{}", - available_tasks - .into_iter() - .sorted() - .format_with("\n", |name, f| { - f(&format_args!("\t{}", name.fancy_display().bold())) - }) - ); + let environments = if let Some(env) = explicit_environment { + vec![env] + } else { + workspace.environments() + }; + + let mut task_map = HashMap::new(); + + for env in environments { + let allowed = env.get_filtered_tasks(); + + let mut tasks = HashMap::new(); + + for name in allowed { + if let Some(task) = env + .tasks(None) + .ok() + .and_then(|mut t| t.shift_remove(&name)) + { + tasks.insert(name, task.clone()); + } + } + + if !tasks.is_empty() { + task_map.insert(env.name().clone(), tasks); + } + } + + if !task_map.is_empty() { + let _ = print_tasks(task_map, false); } - // Help user when there is no task available because the platform is not - // supported if workspace .environments() .iter() diff --git a/crates/pixi_cli/src/task.rs b/crates/pixi_cli/src/task.rs index 2eb6516495..52d6ef6965 100644 --- a/crates/pixi_cli/src/task.rs +++ b/crates/pixi_cli/src/task.rs @@ -257,7 +257,7 @@ fn print_heading(value: &str) { /// Create a human-readable representation of a list of tasks. /// Using a tabwriter for described tasks. -fn print_tasks( +pub fn print_tasks( task_map: HashMap>, summary: bool, ) -> Result<(), std::io::Error> { diff --git a/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.lock b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.lock new file mode 100644 index 0000000000..ac4c8e4b2c --- /dev/null +++ b/tests/data/pixi-build/minimal-backend-workspaces/pixi-build-rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "simple-app" +version = "0.1.0"