diff --git a/crates/pixi/src/main.rs b/crates/pixi/src/main.rs index c7ba02da8d..79a2044653 100644 --- a/crates/pixi/src/main.rs +++ b/crates/pixi/src/main.rs @@ -37,7 +37,7 @@ pub fn main() -> miette::Result<()> { .expect("Failed building the Runtime"); // Box the large main future to avoid stack overflows. - runtime.block_on(Box::pin(pixi_cli::cli::execute())) + runtime.block_on(Box::pin(pixi_cli::execute())) }; std::thread::Builder::new() diff --git a/crates/pixi_cli/src/cli/add.rs b/crates/pixi_cli/src/add.rs similarity index 99% rename from crates/pixi_cli/src/cli/add.rs rename to crates/pixi_cli/src/add.rs index c163697f5d..60de855f7c 100644 --- a/crates/pixi_cli/src/cli/add.rs +++ b/crates/pixi_cli/src/add.rs @@ -7,7 +7,7 @@ use pixi_manifest::{FeatureName, KnownPreviewFeature, SpecType}; use pixi_spec::{GitSpec, SourceLocationSpec, SourceSpec}; use rattler_conda_types::{MatchSpec, PackageName}; -use crate::cli::{ +use crate::{ cli_config::{DependencyConfig, LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}, has_specs::HasSpecs, }; diff --git a/crates/pixi_cli/src/cli/build.rs b/crates/pixi_cli/src/build.rs similarity index 99% rename from crates/pixi_cli/src/cli/build.rs rename to crates/pixi_cli/src/build.rs index 060476a1be..bafb7d6267 100644 --- a/crates/pixi_cli/src/cli/build.rs +++ b/crates/pixi_cli/src/build.rs @@ -14,7 +14,7 @@ use pixi_record::{PinnedPathSpec, PinnedSourceSpec}; use pixi_reporters::TopLevelProgress; use rattler_conda_types::{GenericVirtualPackage, Platform}; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; #[derive(Parser, Debug)] #[clap(verbatim_doc_comment)] diff --git a/crates/pixi_cli/src/cli/clean.rs b/crates/pixi_cli/src/clean.rs similarity index 99% rename from crates/pixi_cli/src/cli/clean.rs rename to crates/pixi_cli/src/clean.rs index f7bb679712..edaabfd8aa 100644 --- a/crates/pixi_cli/src/cli/clean.rs +++ b/crates/pixi_cli/src/clean.rs @@ -5,7 +5,7 @@ use pixi_manifest::EnvironmentName; use std::path::PathBuf; use std::time::Duration; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; use clap::Parser; use fancy_display::FancyDisplay; use fs_err::tokio as tokio_fs; diff --git a/crates/pixi_cli/src/cli/mod.rs b/crates/pixi_cli/src/cli/mod.rs deleted file mode 100644 index 2d6cc9c623..0000000000 --- a/crates/pixi_cli/src/cli/mod.rs +++ /dev/null @@ -1,616 +0,0 @@ -use clap::builder::styling::{AnsiColor, Color, Style}; -use clap::{CommandFactory, Parser}; -use indicatif::ProgressDrawTarget; -use miette::{Diagnostic, IntoDiagnostic}; -use pixi_consts::consts; -use pixi_progress::global_multi_progress; - -use std::{env, io::IsTerminal}; -use thiserror::Error; -use tracing::level_filters::LevelFilter; - -pub mod add; -mod build; -pub mod clean; -pub mod cli_config; -pub mod command_info; -pub mod completion; -pub mod config; -pub mod exec; -pub mod global; -pub mod has_specs; -pub mod import; -pub mod info; -pub mod init; -pub mod install; -pub mod list; -pub mod lock; -pub mod reinstall; -pub mod remove; -pub mod run; -pub mod search; -pub mod self_update; -pub mod shell; -pub mod shell_hook; -pub mod task; -pub mod tree; -pub mod update; -pub mod upgrade; -pub mod upload; -pub mod workspace; - -#[derive(Parser, Debug)] -#[command( - name = "pixi", - version(consts::PIXI_VERSION), - about = format!(" -Pixi [version {}] - Developer Workflow and Environment Management for Multi-Platform, Language-Agnostic Workspaces. - -Pixi is a versatile developer workflow tool designed to streamline the management of your workspace's dependencies, tasks, and environments. -Built on top of the Conda ecosystem, Pixi offers seamless integration with the PyPI ecosystem. - -Basic Usage: - Initialize pixi for a workspace: - $ pixi init - $ pixi add python numpy pytest - - Run a task: - $ pixi task add test 'pytest -s' - $ pixi run test - -Found a Bug or Have a Feature Request? -Open an issue at: https://github.com/prefix-dev/pixi/issues - -Need Help? -Ask a question on the Prefix Discord server: https://discord.gg/kKV8ZxyzY4 - -For more information, see the documentation at: https://pixi.sh -", consts::PIXI_VERSION), -)] -#[clap(arg_required_else_help = true, styles=get_styles(), disable_help_flag = true, allow_external_subcommands = true)] -pub struct Args { - #[command(subcommand)] - command: Option, - - #[clap(flatten)] - global_options: GlobalOptions, - - /// List all installed commands (built-in and extensions) - #[clap(long = "list", help_heading = consts::CLAP_GLOBAL_OPTIONS)] - list: bool, -} - -#[derive(Debug, Parser)] -pub struct GlobalOptions { - /// Display help information - #[clap( - long, - short, - global = true, - action = clap::ArgAction::Help, - help_heading = consts::CLAP_GLOBAL_OPTIONS - )] - help: Option, - - /// Increase logging verbosity (-v for warnings, -vv for info, -vvv for debug, -vvvv for trace) - #[clap(short, long, action = clap::ArgAction::Count, global = true, help_heading = consts::CLAP_GLOBAL_OPTIONS)] - verbose: u8, - - /// Decrease logging verbosity (quiet mode) - #[clap(short, long, action = clap::ArgAction::Count, global = true, help_heading = consts::CLAP_GLOBAL_OPTIONS)] - quiet: u8, - - /// Whether the log needs to be colored. - #[clap(long, default_value = "auto", global = true, env = "PIXI_COLOR", help_heading = consts::CLAP_GLOBAL_OPTIONS)] - color: ColorOutput, - - /// Hide all progress bars, always turned on if stderr is not a terminal. - #[clap(long, default_value = "false", global = true, env = "PIXI_NO_PROGRESS", help_heading = consts::CLAP_GLOBAL_OPTIONS)] - no_progress: bool, -} - -impl Args { - /// Whether to show progress bars or not, based on the terminal and the user's preference. - fn no_progress(&self) -> bool { - if !std::io::stderr().is_terminal() { - true - } else { - self.global_options.no_progress - } - } - - /// Determine the log level filter based on verbose and quiet counts. - #[allow(unused)] - fn log_level_filter(&self) -> LevelFilter { - match (self.global_options.quiet, self.global_options.verbose) { - // Quiet mode overrides verbose - (q, _) if q > 0 => LevelFilter::OFF, - // Custom verbosity levels - (_, 0) => LevelFilter::ERROR, // Default - (_, 1) => LevelFilter::WARN, // -v - (_, 2) => LevelFilter::INFO, // -vv - (_, 3) => LevelFilter::DEBUG, // -vvv - (_, _) => LevelFilter::TRACE, // -vvvv+ - } - } -} - -#[derive(Parser, Debug)] -pub enum Command { - // Commands in alphabetical order - #[clap(visible_alias = "a")] - Add(add::Args), - Auth(rattler::cli::auth::Args), - Build(build::Args), - Clean(clean::Args), - Completion(completion::Args), - Config(config::Args), - #[clap(visible_alias = "x")] - Exec(exec::Args), - #[clap(visible_alias = "g")] - Global(global::Args), - Info(info::Args), - Init(init::Args), - Import(import::Args), - #[clap(visible_alias = "i")] - Install(install::Args), - #[clap(visible_alias = "ls")] - List(list::Args), - Lock(lock::Args), - Reinstall(reinstall::Args), - #[clap(visible_alias = "rm")] - Remove(remove::Args), - #[clap(visible_alias = "r")] - Run(run::Args), - Search(search::Args), - #[cfg_attr(not(feature = "self_update"), clap(hide = true))] - #[cfg_attr(feature = "self_update", clap(hide = false))] - SelfUpdate(self_update::Args), - #[clap(visible_alias = "s")] - Shell(shell::Args), - ShellHook(shell_hook::Args), - Task(task::Args), - #[clap(visible_alias = "t")] - Tree(tree::Args), - Update(update::Args), - Upgrade(upgrade::Args), - Upload(upload::Args), - #[clap(alias = "project")] - Workspace(workspace::Args), - #[command(external_subcommand)] - External(Vec), -} - -#[derive(Debug, Error, Diagnostic)] -pub enum LockFileUsageError { - #[error("the argument '--locked' cannot be used together with '--frozen'")] - FrozenAndLocked, -} - -#[derive(Debug, Default, Copy, Clone)] -/// Lock file usage from the CLI with automatic validation -pub struct LockFileUsageArgs { - inner: LockFileUsageArgsRaw, -} - -#[derive(Parser, Debug, Default, Copy, Clone)] -#[group(multiple = false)] -/// Raw lock file usage arguments (use LockFileUsageArgs instead) -struct LockFileUsageArgsRaw { - /// Install the environment as defined in the lockfile, doesn't update - /// lockfile if it isn't up-to-date with the manifest file. - #[clap(long, env = "PIXI_FROZEN", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "locked")] - frozen: bool, - /// Check if lockfile is up-to-date before installing the environment, - /// aborts when lockfile isn't up-to-date with the manifest file. - #[clap(long, env = "PIXI_LOCKED", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "frozen")] - locked: bool, -} - -impl LockFileUsageArgs { - pub fn frozen(&self) -> bool { - self.inner.frozen - } - - pub fn locked(&self) -> bool { - self.inner.locked - } -} - -// Automatic conversion from raw args (conflicts handled by clap) -impl From for LockFileUsageArgs { - fn from(raw: LockFileUsageArgsRaw) -> Self { - LockFileUsageArgs { inner: raw } - } -} - -// For clap flattening - this provides automatic validation -impl clap::FromArgMatches for LockFileUsageArgs { - fn from_arg_matches(matches: &clap::ArgMatches) -> Result { - let raw = LockFileUsageArgsRaw::from_arg_matches(matches)?; - Ok(raw.into()) - } - - fn update_from_arg_matches(&mut self, matches: &clap::ArgMatches) -> Result<(), clap::Error> { - *self = Self::from_arg_matches(matches)?; - Ok(()) - } -} - -impl clap::Args for LockFileUsageArgs { - fn augment_args(cmd: clap::Command) -> clap::Command { - LockFileUsageArgsRaw::augment_args(cmd) - } - - fn augment_args_for_update(cmd: clap::Command) -> clap::Command { - LockFileUsageArgsRaw::augment_args_for_update(cmd) - } -} - -impl From for pixi_core::environment::LockFileUsage { - fn from(value: LockFileUsageArgs) -> Self { - if value.frozen() { - Self::Frozen - } else if value.locked() { - Self::Locked - } else { - Self::Update - } - } -} - -impl From for pixi_core::environment::LockFileUsage { - fn from(value: LockFileUsageConfig) -> Self { - if value.frozen { - Self::Frozen - } else if value.locked { - Self::Locked - } else { - Self::Update - } - } -} - -/// Configuration for lock file usage, used by LockFileUpdateConfig -#[derive(Parser, Debug, Default, Clone)] -pub struct LockFileUsageConfig { - /// Install the environment as defined in the lockfile, doesn't update - /// lockfile if it isn't up-to-date with the manifest file. - #[clap(long, env = "PIXI_FROZEN", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "locked")] - pub frozen: bool, - /// Check if lockfile is up-to-date before installing the environment, - /// aborts when lockfile isn't up-to-date with the manifest file. - #[clap(long, env = "PIXI_LOCKED", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "frozen")] - pub locked: bool, -} - -pub async fn execute() -> miette::Result<()> { - let args = Args::parse(); - - // Extract values we need before moving args - let no_progress = args.no_progress(); - - set_console_colors(&args); - - let use_colors = console::colors_enabled_stderr(); - let in_ci = matches!(env::var("CI").as_deref(), Ok("1" | "true")); - let no_wrap = matches!(env::var("PIXI_NO_WRAP").as_deref(), Ok("1" | "true")); - // Set up the default miette handler based on whether we want colors or not. - miette::set_hook(Box::new(move |_| { - Box::new( - miette::MietteHandlerOpts::default() - .color(use_colors) - // Don't wrap lines in CI environments or when explicitly specified to avoid - // breaking logs and tests. - .wrap_lines(!in_ci && !no_wrap) - .build(), - ) - }))?; - - // Hide all progress bars if the user requested it. - if no_progress { - global_multi_progress().set_draw_target(ProgressDrawTarget::hidden()); - } - - // Handle `--list`: print installed commands and exit 0 - if args.list { - print_installed_commands(); - return Ok(()); - } - - // Setup logging for the application. - setup_logging(&args, use_colors)?; - - let (Some(command), global_options) = (args.command, args.global_options) else { - // match CI expectations - std::process::exit(2); - }; - - // Execute the command - execute_command(command, &global_options).await -} - -#[cfg(feature = "console-subscriber")] -fn setup_logging(_args: &Args, _use_colors: bool) -> miette::Result<()> { - console_subscriber::init(); - Ok(()) -} - -#[cfg(not(feature = "console-subscriber"))] -fn setup_logging(args: &Args, use_colors: bool) -> miette::Result<()> { - use pixi_utils::indicatif::IndicatifWriter; - use tracing_subscriber::{ - EnvFilter, filter::LevelFilter, prelude::__tracing_subscriber_SubscriberExt, - util::SubscriberInitExt, - }; - - let (low_level_filter, level_filter, pixi_level) = match args.log_level_filter() { - LevelFilter::OFF => (LevelFilter::OFF, LevelFilter::OFF, LevelFilter::OFF), - LevelFilter::ERROR => (LevelFilter::ERROR, LevelFilter::ERROR, LevelFilter::WARN), - LevelFilter::WARN => (LevelFilter::WARN, LevelFilter::WARN, LevelFilter::INFO), - LevelFilter::INFO => (LevelFilter::WARN, LevelFilter::INFO, LevelFilter::DEBUG), - LevelFilter::DEBUG => (LevelFilter::INFO, LevelFilter::DEBUG, LevelFilter::TRACE), - LevelFilter::TRACE => (LevelFilter::TRACE, LevelFilter::TRACE, LevelFilter::TRACE), - }; - - let env_filter = EnvFilter::builder() - .with_default_directive(level_filter.into()) - .from_env() - .into_diagnostic()? - // filter logs from apple codesign because they are very noisy - .add_directive("apple_codesign=off".parse().into_diagnostic()?) - .add_directive(format!("pixi={}", pixi_level).parse().into_diagnostic()?) - .add_directive( - format!("pixi_command_dispatcher={}", pixi_level) - .parse() - .into_diagnostic()?, - ) - .add_directive( - format!("resolvo={}", low_level_filter) - .parse() - .into_diagnostic()?, - ); - - // Set up the tracing subscriber - let fmt_layer = tracing_subscriber::fmt::layer() - .with_ansi(use_colors) - .with_target(pixi_level >= LevelFilter::INFO) - .with_writer(IndicatifWriter::new(pixi_progress::global_multi_progress())) - .without_time(); - - tracing_subscriber::registry() - .with(env_filter) - .with(fmt_layer) - .init(); - Ok(()) -} - -/// Execute the actual command -pub async fn execute_command( - command: Command, - global_options: &GlobalOptions, -) -> miette::Result<()> { - match command { - Command::Completion(cmd) => completion::execute(cmd), - Command::Config(cmd) => config::execute(cmd).await, - Command::Init(cmd) => init::execute(cmd).await, - Command::Add(cmd) => add::execute(cmd).await, - Command::Clean(cmd) => clean::execute(cmd).await, - Command::Run(cmd) => run::execute(cmd).await, - Command::Global(cmd) => global::execute(cmd).await, - Command::Auth(cmd) => rattler::cli::auth::execute(cmd).await.into_diagnostic(), - Command::Install(cmd) => install::execute(cmd).await, - Command::Reinstall(cmd) => reinstall::execute(cmd).await, - Command::Shell(cmd) => shell::execute(cmd).await, - Command::ShellHook(cmd) => shell_hook::execute(cmd).await, - Command::Task(cmd) => task::execute(cmd).await, - Command::Info(cmd) => info::execute(cmd).await, - Command::Import(cmd) => import::execute(cmd).await, - Command::Upload(cmd) => upload::execute(cmd).await, - Command::Search(cmd) => search::execute(cmd).await, - Command::Workspace(cmd) => workspace::execute(cmd).await, - Command::Remove(cmd) => remove::execute(cmd).await, - #[cfg(feature = "self_update")] - Command::SelfUpdate(cmd) => self_update::execute(cmd, global_options).await, - #[cfg(not(feature = "self_update"))] - Command::SelfUpdate(cmd) => self_update::execute_stub(cmd, global_options).await, - Command::List(cmd) => list::execute(cmd).await, - Command::Tree(cmd) => tree::execute(cmd).await, - Command::Update(cmd) => update::execute(cmd).await, - Command::Upgrade(cmd) => upgrade::execute(cmd).await, - Command::Lock(cmd) => lock::execute(cmd).await, - Command::Exec(args) => exec::execute(args).await, - Command::Build(args) => build::execute(args).await, - Command::External(args) => command_info::execute_external_command(args), - } -} - -/// Whether to use colored log format. -/// Option `Auto` enables color output only if the logging is done to a terminal -/// and `NO_COLOR` environment variable is not set. -#[derive(clap::ValueEnum, Debug, Clone, Default)] -pub enum ColorOutput { - Always, - Never, - - #[default] - Auto, -} - -fn set_console_colors(args: &Args) { - // Honor FORCE_COLOR and NO_COLOR environment variables. - // Those take precedence over the CLI flag and PIXI_COLOR - let color = match env::var("FORCE_COLOR") { - Ok(_) => &ColorOutput::Always, - Err(_) => match env::var("NO_COLOR") { - Ok(_) => &ColorOutput::Never, - Err(_) => &args.global_options.color, - }, - }; - - match color { - ColorOutput::Always => { - console::set_colors_enabled(true); - console::set_colors_enabled_stderr(true); - } - ColorOutput::Never => { - console::set_colors_enabled(false); - console::set_colors_enabled_stderr(false); - } - ColorOutput::Auto => {} // Let `console` detect if colors should be enabled - }; -} - -pub fn get_styles() -> clap::builder::Styles { - clap::builder::Styles::styled() - .usage( - Style::new() - .bold() - .underline() - .fg_color(Some(Color::Ansi(AnsiColor::BrightGreen))), - ) - .header( - Style::new() - .bold() - .underline() - .fg_color(Some(Color::Ansi(AnsiColor::BrightGreen))), - ) - .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::BrightCyan)))) - .invalid( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Red))), - ) - .error( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Red))), - ) - .valid( - Style::new() - .bold() - .underline() - .fg_color(Some(Color::Ansi(AnsiColor::Green))), - ) - .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::BrightCyan)))) -} - -/// Print all installed commands (built-in and external extensions) -fn print_installed_commands() { - use std::collections::BTreeMap; - - let use_colors = console::colors_enabled_stderr(); - - // Header - if use_colors { - println!( - "{}", - console::style("Installed Commands:") - .bold() - .underlined() - .bright() - .green() - ); - } else { - println!("Installed Commands:"); - } - - // Built-in commands - let mut builtins: BTreeMap> = BTreeMap::new(); - for sc in Args::command().get_subcommands() { - builtins.insert( - sc.get_name().to_string(), - sc.get_about().map(|s| s.to_string()), - ); - } - - for (name, about) in builtins { - let summary = about - .as_deref() - .and_then(|s| s.lines().next()) - .unwrap_or(""); - if use_colors { - println!( - " {} {}", - console::style(format!("{:<20}", name)).bright().cyan(), - summary - ); - } else { - println!(" {:<20} {}", name, summary); - } - } - - // External commands (pixi-*) - let mut external_names: Vec = - command_info::find_external_commands().into_keys().collect(); - external_names.sort(); - - for name in external_names { - let via = format!("(via pixi-{})", name); - if use_colors { - println!( - " {} {}", - console::style(format!("{:<20}", name)).bright().cyan(), - via - ); - } else { - println!(" {:<20} {}", name, via); - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use temp_env; - - #[test] - fn test_clap_boolean_env_var_behavior() { - // Test PIXI_FROZEN=true - temp_env::with_var("PIXI_FROZEN", Some("true"), || { - let result = LockFileUsageConfig::try_parse_from(["test"]); - assert!(result.is_ok()); - let parsed = result.unwrap(); - assert!( - parsed.frozen, - "Expected PIXI_FROZEN=true to set frozen=true" - ); - }); - - // Test PIXI_FROZEN=false - temp_env::with_var("PIXI_FROZEN", Some("false"), || { - let result = LockFileUsageConfig::try_parse_from(["test"]); - assert!(result.is_ok()); - let parsed = result.unwrap(); - assert!( - !parsed.frozen, - "Expected PIXI_FROZEN=false to set frozen=false" - ); - }); - - // Test unset - temp_env::with_var_unset("PIXI_FROZEN", || { - let result = LockFileUsageConfig::try_parse_from(["test"]); - assert!(result.is_ok()); - let parsed = result.unwrap(); - assert!( - !parsed.frozen, - "Expected unset PIXI_FROZEN to set frozen=false" - ); - }); - } - - #[test] - fn test_cli_args_override_env_vars() { - // Test that CLI arguments take precedence over environment variables - temp_env::with_var("PIXI_FROZEN", Some("false"), || { - let result = LockFileUsageConfig::try_parse_from(["test", "--frozen"]); - assert!(result.is_ok()); - let parsed = result.unwrap(); - assert!( - parsed.frozen, - "Expected CLI argument --frozen to override PIXI_FROZEN=false" - ); - }); - } -} diff --git a/crates/pixi_cli/src/cli/cli_config.rs b/crates/pixi_cli/src/cli_config.rs similarity index 99% rename from crates/pixi_cli/src/cli/cli_config.rs rename to crates/pixi_cli/src/cli_config.rs index 29bd276b27..21fbe8b6a4 100644 --- a/crates/pixi_cli/src/cli/cli_config.rs +++ b/crates/pixi_cli/src/cli_config.rs @@ -1,4 +1,4 @@ -use crate::cli::has_specs::HasSpecs; +use crate::has_specs::HasSpecs; use clap::Parser; use indexmap::IndexMap; use indexmap::IndexSet; @@ -448,7 +448,7 @@ fn build_vcs_requirement( mod tests { use url::Url; - use crate::cli::cli_config::{ + use crate::cli_config::{ GitRev, LockAndInstallConfig, LockFileUpdateConfig, NoInstallConfig, build_vcs_requirement, }; use pixi_core::environment::LockFileUsage; diff --git a/crates/pixi_cli/src/cli/command_info.rs b/crates/pixi_cli/src/command_info.rs similarity index 100% rename from crates/pixi_cli/src/cli/command_info.rs rename to crates/pixi_cli/src/command_info.rs diff --git a/crates/pixi_cli/src/cli/completion.rs b/crates/pixi_cli/src/completion.rs similarity index 99% rename from crates/pixi_cli/src/cli/completion.rs rename to crates/pixi_cli/src/completion.rs index 665628cba4..8f0b0de105 100644 --- a/crates/pixi_cli/src/cli/completion.rs +++ b/crates/pixi_cli/src/completion.rs @@ -1,4 +1,4 @@ -use crate::cli::Args as CommandArgs; +use crate::Args as CommandArgs; use clap::{CommandFactory, Parser, ValueEnum}; use clap_complete::{Generator, shells}; use clap_complete_nushell::Nushell; diff --git a/crates/pixi_cli/src/cli/config.rs b/crates/pixi_cli/src/config.rs similarity index 99% rename from crates/pixi_cli/src/cli/config.rs rename to crates/pixi_cli/src/config.rs index c47d5440f5..e4f68e826e 100644 --- a/crates/pixi_cli/src/cli/config.rs +++ b/crates/pixi_cli/src/config.rs @@ -1,4 +1,4 @@ -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; use clap::Parser; use miette::{IntoDiagnostic, WrapErr}; use pixi_config; diff --git a/crates/pixi_cli/src/cli/exec.rs b/crates/pixi_cli/src/exec.rs similarity index 99% rename from crates/pixi_cli/src/cli/exec.rs rename to crates/pixi_cli/src/exec.rs index d016642797..0f21363fb7 100644 --- a/crates/pixi_cli/src/cli/exec.rs +++ b/crates/pixi_cli/src/exec.rs @@ -18,7 +18,7 @@ use rattler_virtual_packages::{VirtualPackageOverrides, VirtualPackages}; use reqwest_middleware::ClientWithMiddleware; use uv_configuration::RAYON_INITIALIZE; -use crate::cli::cli_config::ChannelsConfig; +use crate::cli_config::ChannelsConfig; /// Run a command and install it in a temporary environment. /// diff --git a/crates/pixi_cli/src/cli/global/add.rs b/crates/pixi_cli/src/global/add.rs similarity index 97% rename from crates/pixi_cli/src/cli/global/add.rs rename to crates/pixi_cli/src/global/add.rs index 4ffca55f52..57017258f2 100644 --- a/crates/pixi_cli/src/cli/global/add.rs +++ b/crates/pixi_cli/src/global/add.rs @@ -1,5 +1,5 @@ -use crate::cli::global::global_specs::GlobalSpecs; -use crate::cli::global::revert_environment_after_error; +use crate::global::global_specs::GlobalSpecs; +use crate::global::revert_environment_after_error; use clap::Parser; use pixi_config::{Config, ConfigCli}; diff --git a/crates/pixi_cli/src/cli/global/edit.rs b/crates/pixi_cli/src/global/edit.rs similarity index 100% rename from crates/pixi_cli/src/cli/global/edit.rs rename to crates/pixi_cli/src/global/edit.rs diff --git a/crates/pixi_cli/src/cli/global/expose.rs b/crates/pixi_cli/src/global/expose.rs similarity index 99% rename from crates/pixi_cli/src/cli/global/expose.rs rename to crates/pixi_cli/src/global/expose.rs index 42f5fc7ae2..93c642e2bb 100644 --- a/crates/pixi_cli/src/cli/global/expose.rs +++ b/crates/pixi_cli/src/global/expose.rs @@ -3,7 +3,7 @@ use itertools::Itertools; use miette::Context; use pixi_config::{Config, ConfigCli}; -use crate::cli::global::revert_environment_after_error; +use crate::global::revert_environment_after_error; use pixi_core::global::{self, EnvironmentName, ExposedName, Mapping, StateChanges}; /// Add exposed binaries from an environment to your global environment diff --git a/crates/pixi_cli/src/cli/global/global_specs.rs b/crates/pixi_cli/src/global/global_specs.rs similarity index 98% rename from crates/pixi_cli/src/cli/global/global_specs.rs rename to crates/pixi_cli/src/global/global_specs.rs index 607b119c12..9402c4443d 100644 --- a/crates/pixi_cli/src/cli/global/global_specs.rs +++ b/crates/pixi_cli/src/global/global_specs.rs @@ -9,7 +9,7 @@ use rattler_conda_types::{ChannelConfig, MatchSpec, ParseMatchSpecError, ParseSt use typed_path::Utf8NativePathBuf; use url::Url; -use crate::cli::has_specs::HasSpecs; +use crate::has_specs::HasSpecs; #[derive(Parser, Debug, Default, Clone)] pub struct GlobalSpecs { @@ -23,7 +23,7 @@ pub struct GlobalSpecs { /// The git revisions #[clap(flatten)] - pub rev: Option, + pub rev: Option, /// The subdirectory within the git repository #[clap(long, requires = "git", help_heading = consts::CLAP_GIT_OPTIONS)] diff --git a/crates/pixi_cli/src/cli/global/install.rs b/crates/pixi_cli/src/global/install.rs similarity index 99% rename from crates/pixi_cli/src/cli/global/install.rs rename to crates/pixi_cli/src/global/install.rs index bbbc296d5a..fab55bf764 100644 --- a/crates/pixi_cli/src/cli/global/install.rs +++ b/crates/pixi_cli/src/global/install.rs @@ -8,7 +8,7 @@ use itertools::Itertools; use miette::{Context, IntoDiagnostic}; use rattler_conda_types::{MatchSpec, NamedChannelOrUrl, Platform}; -use crate::cli::global::{global_specs::GlobalSpecs, revert_environment_after_error}; +use crate::global::{global_specs::GlobalSpecs, revert_environment_after_error}; use pixi_config::{self, Config, ConfigCli}; use pixi_core::global::{ self, EnvChanges, EnvState, EnvironmentName, Mapping, Project, StateChange, StateChanges, diff --git a/crates/pixi_cli/src/cli/global/list.rs b/crates/pixi_cli/src/global/list.rs similarity index 100% rename from crates/pixi_cli/src/cli/global/list.rs rename to crates/pixi_cli/src/global/list.rs diff --git a/crates/pixi_cli/src/cli/global/mod.rs b/crates/pixi_cli/src/global/mod.rs similarity index 100% rename from crates/pixi_cli/src/cli/global/mod.rs rename to crates/pixi_cli/src/global/mod.rs diff --git a/crates/pixi_cli/src/cli/global/remove.rs b/crates/pixi_cli/src/global/remove.rs similarity index 97% rename from crates/pixi_cli/src/cli/global/remove.rs rename to crates/pixi_cli/src/global/remove.rs index ffda8518a3..0d1498bb86 100644 --- a/crates/pixi_cli/src/cli/global/remove.rs +++ b/crates/pixi_cli/src/global/remove.rs @@ -6,8 +6,8 @@ use pixi_core::global::{EnvironmentName, ExposedName, Project, StateChanges}; use rattler_conda_types::MatchSpec; use std::str::FromStr; -use crate::cli::global::revert_environment_after_error; -use crate::cli::has_specs::HasSpecs; +use crate::global::revert_environment_after_error; +use crate::has_specs::HasSpecs; /// Removes dependencies from an environment /// diff --git a/crates/pixi_cli/src/cli/global/shortcut.rs b/crates/pixi_cli/src/global/shortcut.rs similarity index 99% rename from crates/pixi_cli/src/cli/global/shortcut.rs rename to crates/pixi_cli/src/global/shortcut.rs index 10ae869e6d..623d0643e2 100644 --- a/crates/pixi_cli/src/cli/global/shortcut.rs +++ b/crates/pixi_cli/src/global/shortcut.rs @@ -1,4 +1,4 @@ -use crate::cli::global::revert_environment_after_error; +use crate::global::revert_environment_after_error; use clap::Parser; use fancy_display::FancyDisplay; use miette::Context; diff --git a/crates/pixi_cli/src/cli/global/sync.rs b/crates/pixi_cli/src/global/sync.rs similarity index 100% rename from crates/pixi_cli/src/cli/global/sync.rs rename to crates/pixi_cli/src/global/sync.rs diff --git a/crates/pixi_cli/src/cli/global/uninstall.rs b/crates/pixi_cli/src/global/uninstall.rs similarity index 97% rename from crates/pixi_cli/src/cli/global/uninstall.rs rename to crates/pixi_cli/src/global/uninstall.rs index e0b9d8b2e9..ac5646c136 100644 --- a/crates/pixi_cli/src/cli/global/uninstall.rs +++ b/crates/pixi_cli/src/global/uninstall.rs @@ -1,4 +1,4 @@ -use crate::cli::global::revert_environment_after_error; +use crate::global::revert_environment_after_error; use clap::Parser; use fancy_display::FancyDisplay; use miette::Context; diff --git a/crates/pixi_cli/src/cli/global/update.rs b/crates/pixi_cli/src/global/update.rs similarity index 98% rename from crates/pixi_cli/src/cli/global/update.rs rename to crates/pixi_cli/src/global/update.rs index 715beb16c7..ccfd30c6e8 100644 --- a/crates/pixi_cli/src/cli/global/update.rs +++ b/crates/pixi_cli/src/global/update.rs @@ -1,4 +1,4 @@ -use crate::cli::global::revert_environment_after_error; +use crate::global::revert_environment_after_error; use clap::Parser; use fancy_display::FancyDisplay; use pixi_config::{Config, ConfigCli}; diff --git a/crates/pixi_cli/src/cli/global/upgrade.rs b/crates/pixi_cli/src/global/upgrade.rs similarity index 92% rename from crates/pixi_cli/src/cli/global/upgrade.rs rename to crates/pixi_cli/src/global/upgrade.rs index a4e3ad8cc9..1b33fc5e2b 100644 --- a/crates/pixi_cli/src/cli/global/upgrade.rs +++ b/crates/pixi_cli/src/global/upgrade.rs @@ -1,7 +1,7 @@ use clap::Parser; use rattler_conda_types::Platform; -use crate::cli::{cli_config::ChannelsConfig, has_specs::HasSpecs}; +use crate::{cli_config::ChannelsConfig, has_specs::HasSpecs}; /// Upgrade specific package which is installed globally. /// This command has been removed, please use `pixi global update` instead diff --git a/crates/pixi_cli/src/cli/global/upgrade_all.rs b/crates/pixi_cli/src/global/upgrade_all.rs similarity index 94% rename from crates/pixi_cli/src/cli/global/upgrade_all.rs rename to crates/pixi_cli/src/global/upgrade_all.rs index 14dae59276..f6518595e9 100644 --- a/crates/pixi_cli/src/cli/global/upgrade_all.rs +++ b/crates/pixi_cli/src/global/upgrade_all.rs @@ -2,7 +2,7 @@ use clap::Parser; use pixi_config::ConfigCli; use rattler_conda_types::Platform; -use crate::cli::cli_config::ChannelsConfig; +use crate::cli_config::ChannelsConfig; /// Upgrade all globally installed packages /// This command has been removed, please use `pixi global update` instead diff --git a/crates/pixi_cli/src/cli/has_specs.rs b/crates/pixi_cli/src/has_specs.rs similarity index 100% rename from crates/pixi_cli/src/cli/has_specs.rs rename to crates/pixi_cli/src/has_specs.rs diff --git a/crates/pixi_cli/src/cli/import.rs b/crates/pixi_cli/src/import.rs similarity index 99% rename from crates/pixi_cli/src/cli/import.rs rename to crates/pixi_cli/src/import.rs index 509845ba5a..faea402fa9 100644 --- a/crates/pixi_cli/src/cli/import.rs +++ b/crates/pixi_cli/src/import.rs @@ -16,7 +16,7 @@ use uv_requirements_txt::RequirementsTxt; use miette::{Diagnostic, IntoDiagnostic, Result}; use thiserror::Error; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; #[derive(Parser, Debug, Clone, PartialEq, ValueEnum)] pub enum ImportFileFormat { diff --git a/crates/pixi_cli/src/cli/info.rs b/crates/pixi_cli/src/info.rs similarity index 99% rename from crates/pixi_cli/src/cli/info.rs rename to crates/pixi_cli/src/info.rs index b572805ef3..cf80351fbd 100644 --- a/crates/pixi_cli/src/cli/info.rs +++ b/crates/pixi_cli/src/info.rs @@ -23,7 +23,7 @@ use serde_with::{DisplayFromStr, serde_as}; use tokio::task::spawn_blocking; use toml_edit::ser::to_string; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; static WIDTH: usize = 19; diff --git a/crates/pixi_cli/src/cli/init.rs b/crates/pixi_cli/src/init.rs similarity index 100% rename from crates/pixi_cli/src/cli/init.rs rename to crates/pixi_cli/src/init.rs diff --git a/crates/pixi_cli/src/cli/install.rs b/crates/pixi_cli/src/install.rs similarity index 97% rename from crates/pixi_cli/src/cli/install.rs rename to crates/pixi_cli/src/install.rs index acd0ba4031..e1226bbb01 100644 --- a/crates/pixi_cli/src/cli/install.rs +++ b/crates/pixi_cli/src/install.rs @@ -9,7 +9,7 @@ use pixi_core::{ }; use std::fmt::Write; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Install an environment, both updating the lockfile and installing the /// environment. @@ -36,7 +36,7 @@ pub struct Args { pub project_config: WorkspaceConfig, #[clap(flatten)] - pub lock_file_usage: crate::cli::LockFileUsageConfig, + pub lock_file_usage: crate::LockFileUsageConfig, /// The environment to install #[arg(long, short)] diff --git a/crates/pixi_cli/src/lib.rs b/crates/pixi_cli/src/lib.rs index 662e7d48a0..c69e693d16 100644 --- a/crates/pixi_cli/src/lib.rs +++ b/crates/pixi_cli/src/lib.rs @@ -1,3 +1,617 @@ #![deny(clippy::dbg_macro, clippy::unwrap_used)] -pub mod cli; +use clap::builder::styling::{AnsiColor, Color, Style}; +use clap::{CommandFactory, Parser}; +use indicatif::ProgressDrawTarget; +use miette::{Diagnostic, IntoDiagnostic}; +use pixi_consts::consts; +use pixi_progress::global_multi_progress; + +use std::{env, io::IsTerminal}; +use thiserror::Error; +use tracing::level_filters::LevelFilter; + +pub mod add; +mod build; +pub mod clean; +pub mod cli_config; +pub mod command_info; +pub mod completion; +pub mod config; +pub mod exec; +pub mod global; +pub mod has_specs; +pub mod import; +pub mod info; +pub mod init; +pub mod install; +pub mod list; +pub mod lock; +pub mod reinstall; +pub mod remove; +pub mod run; +pub mod search; +pub mod self_update; +pub mod shell; +pub mod shell_hook; +pub mod task; +pub mod tree; +pub mod update; +pub mod upgrade; +pub mod upload; +pub mod workspace; + +#[derive(Parser, Debug)] +#[command( + name = "pixi", + version(consts::PIXI_VERSION), + about = format!(" +Pixi [version {}] - Developer Workflow and Environment Management for Multi-Platform, Language-Agnostic Workspaces. + +Pixi is a versatile developer workflow tool designed to streamline the management of your workspace's dependencies, tasks, and environments. +Built on top of the Conda ecosystem, Pixi offers seamless integration with the PyPI ecosystem. + +Basic Usage: + Initialize pixi for a workspace: + $ pixi init + $ pixi add python numpy pytest + + Run a task: + $ pixi task add test 'pytest -s' + $ pixi run test + +Found a Bug or Have a Feature Request? +Open an issue at: https://github.com/prefix-dev/pixi/issues + +Need Help? +Ask a question on the Prefix Discord server: https://discord.gg/kKV8ZxyzY4 + +For more information, see the documentation at: https://pixi.sh +", consts::PIXI_VERSION), +)] +#[clap(arg_required_else_help = true, styles=get_styles(), disable_help_flag = true, allow_external_subcommands = true)] +pub struct Args { + #[command(subcommand)] + command: Option, + + #[clap(flatten)] + global_options: GlobalOptions, + + /// List all installed commands (built-in and extensions) + #[clap(long = "list", help_heading = consts::CLAP_GLOBAL_OPTIONS)] + list: bool, +} + +#[derive(Debug, Parser)] +pub struct GlobalOptions { + /// Display help information + #[clap( + long, + short, + global = true, + action = clap::ArgAction::Help, + help_heading = consts::CLAP_GLOBAL_OPTIONS + )] + help: Option, + + /// Increase logging verbosity (-v for warnings, -vv for info, -vvv for debug, -vvvv for trace) + #[clap(short, long, action = clap::ArgAction::Count, global = true, help_heading = consts::CLAP_GLOBAL_OPTIONS)] + verbose: u8, + + /// Decrease logging verbosity (quiet mode) + #[clap(short, long, action = clap::ArgAction::Count, global = true, help_heading = consts::CLAP_GLOBAL_OPTIONS)] + quiet: u8, + + /// Whether the log needs to be colored. + #[clap(long, default_value = "auto", global = true, env = "PIXI_COLOR", help_heading = consts::CLAP_GLOBAL_OPTIONS)] + color: ColorOutput, + + /// Hide all progress bars, always turned on if stderr is not a terminal. + #[clap(long, default_value = "false", global = true, env = "PIXI_NO_PROGRESS", help_heading = consts::CLAP_GLOBAL_OPTIONS)] + no_progress: bool, +} + +impl Args { + /// Whether to show progress bars or not, based on the terminal and the user's preference. + fn no_progress(&self) -> bool { + if !std::io::stderr().is_terminal() { + true + } else { + self.global_options.no_progress + } + } + + /// Determine the log level filter based on verbose and quiet counts. + #[allow(unused)] + fn log_level_filter(&self) -> LevelFilter { + match (self.global_options.quiet, self.global_options.verbose) { + // Quiet mode overrides verbose + (q, _) if q > 0 => LevelFilter::OFF, + // Custom verbosity levels + (_, 0) => LevelFilter::ERROR, // Default + (_, 1) => LevelFilter::WARN, // -v + (_, 2) => LevelFilter::INFO, // -vv + (_, 3) => LevelFilter::DEBUG, // -vvv + (_, _) => LevelFilter::TRACE, // -vvvv+ + } + } +} + +#[derive(Parser, Debug)] +pub enum Command { + // Commands in alphabetical order + #[clap(visible_alias = "a")] + Add(add::Args), + Auth(rattler::cli::auth::Args), + Build(build::Args), + Clean(clean::Args), + Completion(completion::Args), + Config(config::Args), + #[clap(visible_alias = "x")] + Exec(exec::Args), + #[clap(visible_alias = "g")] + Global(global::Args), + Info(info::Args), + Init(init::Args), + Import(import::Args), + #[clap(visible_alias = "i")] + Install(install::Args), + #[clap(visible_alias = "ls")] + List(list::Args), + Lock(lock::Args), + Reinstall(reinstall::Args), + #[clap(visible_alias = "rm")] + Remove(remove::Args), + #[clap(visible_alias = "r")] + Run(run::Args), + Search(search::Args), + #[cfg_attr(not(feature = "self_update"), clap(hide = true))] + #[cfg_attr(feature = "self_update", clap(hide = false))] + SelfUpdate(self_update::Args), + #[clap(visible_alias = "s")] + Shell(shell::Args), + ShellHook(shell_hook::Args), + Task(task::Args), + #[clap(visible_alias = "t")] + Tree(tree::Args), + Update(update::Args), + Upgrade(upgrade::Args), + Upload(upload::Args), + #[clap(alias = "project")] + Workspace(workspace::Args), + #[command(external_subcommand)] + External(Vec), +} + +#[derive(Debug, Error, Diagnostic)] +pub enum LockFileUsageError { + #[error("the argument '--locked' cannot be used together with '--frozen'")] + FrozenAndLocked, +} + +#[derive(Debug, Default, Copy, Clone)] +/// Lock file usage from the CLI with automatic validation +pub struct LockFileUsageArgs { + inner: LockFileUsageArgsRaw, +} + +#[derive(Parser, Debug, Default, Copy, Clone)] +#[group(multiple = false)] +/// Raw lock file usage arguments (use LockFileUsageArgs instead) +struct LockFileUsageArgsRaw { + /// Install the environment as defined in the lockfile, doesn't update + /// lockfile if it isn't up-to-date with the manifest file. + #[clap(long, env = "PIXI_FROZEN", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "locked")] + frozen: bool, + /// Check if lockfile is up-to-date before installing the environment, + /// aborts when lockfile isn't up-to-date with the manifest file. + #[clap(long, env = "PIXI_LOCKED", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "frozen")] + locked: bool, +} + +impl LockFileUsageArgs { + pub fn frozen(&self) -> bool { + self.inner.frozen + } + + pub fn locked(&self) -> bool { + self.inner.locked + } +} + +// Automatic conversion from raw args (conflicts handled by clap) +impl From for LockFileUsageArgs { + fn from(raw: LockFileUsageArgsRaw) -> Self { + LockFileUsageArgs { inner: raw } + } +} + +// For clap flattening - this provides automatic validation +impl clap::FromArgMatches for LockFileUsageArgs { + fn from_arg_matches(matches: &clap::ArgMatches) -> Result { + let raw = LockFileUsageArgsRaw::from_arg_matches(matches)?; + Ok(raw.into()) + } + + fn update_from_arg_matches(&mut self, matches: &clap::ArgMatches) -> Result<(), clap::Error> { + *self = Self::from_arg_matches(matches)?; + Ok(()) + } +} + +impl clap::Args for LockFileUsageArgs { + fn augment_args(cmd: clap::Command) -> clap::Command { + LockFileUsageArgsRaw::augment_args(cmd) + } + + fn augment_args_for_update(cmd: clap::Command) -> clap::Command { + LockFileUsageArgsRaw::augment_args_for_update(cmd) + } +} + +impl From for pixi_core::environment::LockFileUsage { + fn from(value: LockFileUsageArgs) -> Self { + if value.frozen() { + Self::Frozen + } else if value.locked() { + Self::Locked + } else { + Self::Update + } + } +} + +impl From for pixi_core::environment::LockFileUsage { + fn from(value: LockFileUsageConfig) -> Self { + if value.frozen { + Self::Frozen + } else if value.locked { + Self::Locked + } else { + Self::Update + } + } +} + +/// Configuration for lock file usage, used by LockFileUpdateConfig +#[derive(Parser, Debug, Default, Clone)] +pub struct LockFileUsageConfig { + /// Install the environment as defined in the lockfile, doesn't update + /// lockfile if it isn't up-to-date with the manifest file. + #[clap(long, env = "PIXI_FROZEN", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "locked")] + pub frozen: bool, + /// Check if lockfile is up-to-date before installing the environment, + /// aborts when lockfile isn't up-to-date with the manifest file. + #[clap(long, env = "PIXI_LOCKED", help_heading = consts::CLAP_UPDATE_OPTIONS, conflicts_with = "frozen")] + pub locked: bool, +} + +pub async fn execute() -> miette::Result<()> { + let args = Args::parse(); + + // Extract values we need before moving args + let no_progress = args.no_progress(); + + set_console_colors(&args); + + let use_colors = console::colors_enabled_stderr(); + let in_ci = matches!(env::var("CI").as_deref(), Ok("1" | "true")); + let no_wrap = matches!(env::var("PIXI_NO_WRAP").as_deref(), Ok("1" | "true")); + // Set up the default miette handler based on whether we want colors or not. + miette::set_hook(Box::new(move |_| { + Box::new( + miette::MietteHandlerOpts::default() + .color(use_colors) + // Don't wrap lines in CI environments or when explicitly specified to avoid + // breaking logs and tests. + .wrap_lines(!in_ci && !no_wrap) + .build(), + ) + }))?; + + // Hide all progress bars if the user requested it. + if no_progress { + global_multi_progress().set_draw_target(ProgressDrawTarget::hidden()); + } + + // Handle `--list`: print installed commands and exit 0 + if args.list { + print_installed_commands(); + return Ok(()); + } + + // Setup logging for the application. + setup_logging(&args, use_colors)?; + + let (Some(command), global_options) = (args.command, args.global_options) else { + // match CI expectations + std::process::exit(2); + }; + + // Execute the command + execute_command(command, &global_options).await +} + +#[cfg(feature = "console-subscriber")] +fn setup_logging(_args: &Args, _use_colors: bool) -> miette::Result<()> { + console_subscriber::init(); + Ok(()) +} + +#[cfg(not(feature = "console-subscriber"))] +fn setup_logging(args: &Args, use_colors: bool) -> miette::Result<()> { + use pixi_utils::indicatif::IndicatifWriter; + use tracing_subscriber::{ + EnvFilter, filter::LevelFilter, prelude::__tracing_subscriber_SubscriberExt, + util::SubscriberInitExt, + }; + + let (low_level_filter, level_filter, pixi_level) = match args.log_level_filter() { + LevelFilter::OFF => (LevelFilter::OFF, LevelFilter::OFF, LevelFilter::OFF), + LevelFilter::ERROR => (LevelFilter::ERROR, LevelFilter::ERROR, LevelFilter::WARN), + LevelFilter::WARN => (LevelFilter::WARN, LevelFilter::WARN, LevelFilter::INFO), + LevelFilter::INFO => (LevelFilter::WARN, LevelFilter::INFO, LevelFilter::DEBUG), + LevelFilter::DEBUG => (LevelFilter::INFO, LevelFilter::DEBUG, LevelFilter::TRACE), + LevelFilter::TRACE => (LevelFilter::TRACE, LevelFilter::TRACE, LevelFilter::TRACE), + }; + + let env_filter = EnvFilter::builder() + .with_default_directive(level_filter.into()) + .from_env() + .into_diagnostic()? + // filter logs from apple codesign because they are very noisy + .add_directive("apple_codesign=off".parse().into_diagnostic()?) + .add_directive(format!("pixi={}", pixi_level).parse().into_diagnostic()?) + .add_directive( + format!("pixi_command_dispatcher={}", pixi_level) + .parse() + .into_diagnostic()?, + ) + .add_directive( + format!("resolvo={}", low_level_filter) + .parse() + .into_diagnostic()?, + ); + + // Set up the tracing subscriber + let fmt_layer = tracing_subscriber::fmt::layer() + .with_ansi(use_colors) + .with_target(pixi_level >= LevelFilter::INFO) + .with_writer(IndicatifWriter::new(pixi_progress::global_multi_progress())) + .without_time(); + + tracing_subscriber::registry() + .with(env_filter) + .with(fmt_layer) + .init(); + Ok(()) +} + +/// Execute the actual command +pub async fn execute_command( + command: Command, + global_options: &GlobalOptions, +) -> miette::Result<()> { + match command { + Command::Completion(cmd) => completion::execute(cmd), + Command::Config(cmd) => config::execute(cmd).await, + Command::Init(cmd) => init::execute(cmd).await, + Command::Add(cmd) => add::execute(cmd).await, + Command::Clean(cmd) => clean::execute(cmd).await, + Command::Run(cmd) => run::execute(cmd).await, + Command::Global(cmd) => global::execute(cmd).await, + Command::Auth(cmd) => rattler::cli::auth::execute(cmd).await.into_diagnostic(), + Command::Install(cmd) => install::execute(cmd).await, + Command::Reinstall(cmd) => reinstall::execute(cmd).await, + Command::Shell(cmd) => shell::execute(cmd).await, + Command::ShellHook(cmd) => shell_hook::execute(cmd).await, + Command::Task(cmd) => task::execute(cmd).await, + Command::Info(cmd) => info::execute(cmd).await, + Command::Import(cmd) => import::execute(cmd).await, + Command::Upload(cmd) => upload::execute(cmd).await, + Command::Search(cmd) => search::execute(cmd).await, + Command::Workspace(cmd) => workspace::execute(cmd).await, + Command::Remove(cmd) => remove::execute(cmd).await, + #[cfg(feature = "self_update")] + Command::SelfUpdate(cmd) => self_update::execute(cmd, global_options).await, + #[cfg(not(feature = "self_update"))] + Command::SelfUpdate(cmd) => self_update::execute_stub(cmd, global_options).await, + Command::List(cmd) => list::execute(cmd).await, + Command::Tree(cmd) => tree::execute(cmd).await, + Command::Update(cmd) => update::execute(cmd).await, + Command::Upgrade(cmd) => upgrade::execute(cmd).await, + Command::Lock(cmd) => lock::execute(cmd).await, + Command::Exec(args) => exec::execute(args).await, + Command::Build(args) => build::execute(args).await, + Command::External(args) => command_info::execute_external_command(args), + } +} + +/// Whether to use colored log format. +/// Option `Auto` enables color output only if the logging is done to a terminal +/// and `NO_COLOR` environment variable is not set. +#[derive(clap::ValueEnum, Debug, Clone, Default)] +pub enum ColorOutput { + Always, + Never, + + #[default] + Auto, +} + +fn set_console_colors(args: &Args) { + // Honor FORCE_COLOR and NO_COLOR environment variables. + // Those take precedence over the CLI flag and PIXI_COLOR + let color = match env::var("FORCE_COLOR") { + Ok(_) => &ColorOutput::Always, + Err(_) => match env::var("NO_COLOR") { + Ok(_) => &ColorOutput::Never, + Err(_) => &args.global_options.color, + }, + }; + + match color { + ColorOutput::Always => { + console::set_colors_enabled(true); + console::set_colors_enabled_stderr(true); + } + ColorOutput::Never => { + console::set_colors_enabled(false); + console::set_colors_enabled_stderr(false); + } + ColorOutput::Auto => {} // Let `console` detect if colors should be enabled + }; +} + +pub fn get_styles() -> clap::builder::Styles { + clap::builder::Styles::styled() + .usage( + Style::new() + .bold() + .underline() + .fg_color(Some(Color::Ansi(AnsiColor::BrightGreen))), + ) + .header( + Style::new() + .bold() + .underline() + .fg_color(Some(Color::Ansi(AnsiColor::BrightGreen))), + ) + .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::BrightCyan)))) + .invalid( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Red))), + ) + .error( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Red))), + ) + .valid( + Style::new() + .bold() + .underline() + .fg_color(Some(Color::Ansi(AnsiColor::Green))), + ) + .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::BrightCyan)))) +} + +/// Print all installed commands (built-in and external extensions) +fn print_installed_commands() { + use std::collections::BTreeMap; + + let use_colors = console::colors_enabled_stderr(); + + // Header + if use_colors { + println!( + "{}", + console::style("Installed Commands:") + .bold() + .underlined() + .bright() + .green() + ); + } else { + println!("Installed Commands:"); + } + + // Built-in commands + let mut builtins: BTreeMap> = BTreeMap::new(); + for sc in Args::command().get_subcommands() { + builtins.insert( + sc.get_name().to_string(), + sc.get_about().map(|s| s.to_string()), + ); + } + + for (name, about) in builtins { + let summary = about + .as_deref() + .and_then(|s| s.lines().next()) + .unwrap_or(""); + if use_colors { + println!( + " {} {}", + console::style(format!("{:<20}", name)).bright().cyan(), + summary + ); + } else { + println!(" {:<20} {}", name, summary); + } + } + + // External commands (pixi-*) + let mut external_names: Vec = + command_info::find_external_commands().into_keys().collect(); + external_names.sort(); + + for name in external_names { + let via = format!("(via pixi-{})", name); + if use_colors { + println!( + " {} {}", + console::style(format!("{:<20}", name)).bright().cyan(), + via + ); + } else { + println!(" {:<20} {}", name, via); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_clap_boolean_env_var_behavior() { + // Test PIXI_FROZEN=true + temp_env::with_var("PIXI_FROZEN", Some("true"), || { + let result = LockFileUsageConfig::try_parse_from(["test"]); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert!( + parsed.frozen, + "Expected PIXI_FROZEN=true to set frozen=true" + ); + }); + + // Test PIXI_FROZEN=false + temp_env::with_var("PIXI_FROZEN", Some("false"), || { + let result = LockFileUsageConfig::try_parse_from(["test"]); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert!( + !parsed.frozen, + "Expected PIXI_FROZEN=false to set frozen=false" + ); + }); + + // Test unset + temp_env::with_var_unset("PIXI_FROZEN", || { + let result = LockFileUsageConfig::try_parse_from(["test"]); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert!( + !parsed.frozen, + "Expected unset PIXI_FROZEN to set frozen=false" + ); + }); + } + + #[test] + fn test_cli_args_override_env_vars() { + // Test that CLI arguments take precedence over environment variables + temp_env::with_var("PIXI_FROZEN", Some("false"), || { + let result = LockFileUsageConfig::try_parse_from(["test", "--frozen"]); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert!( + parsed.frozen, + "Expected CLI argument --frozen to override PIXI_FROZEN=false" + ); + }); + } +} diff --git a/crates/pixi_cli/src/cli/list.rs b/crates/pixi_cli/src/list.rs similarity index 99% rename from crates/pixi_cli/src/cli/list.rs rename to crates/pixi_cli/src/list.rs index 3c58b6c80e..0d0df28702 100644 --- a/crates/pixi_cli/src/cli/list.rs +++ b/crates/pixi_cli/src/list.rs @@ -26,7 +26,7 @@ use serde::Serialize; use uv_configuration::ConfigSettings; use uv_distribution::RegistryWheelIndex; -use crate::cli::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; // an enum to sort by size or name #[derive(clap::ValueEnum, Clone, Debug, Serialize)] diff --git a/crates/pixi_cli/src/cli/lock.rs b/crates/pixi_cli/src/lock.rs similarity index 96% rename from crates/pixi_cli/src/cli/lock.rs rename to crates/pixi_cli/src/lock.rs index 924eb864c0..4c1ba444f4 100644 --- a/crates/pixi_cli/src/cli/lock.rs +++ b/crates/pixi_cli/src/lock.rs @@ -7,9 +7,9 @@ use pixi_core::{ lock_file::{LockFileDerivedData, UpdateLockFileOptions}, }; -use crate::cli::cli_config::NoInstallConfig; +use crate::cli_config::NoInstallConfig; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Solve environment and update the lock file without installing the /// environments. diff --git a/crates/pixi_cli/src/cli/reinstall.rs b/crates/pixi_cli/src/reinstall.rs similarity index 97% rename from crates/pixi_cli/src/cli/reinstall.rs rename to crates/pixi_cli/src/reinstall.rs index 73be5bea89..b42eec74bb 100644 --- a/crates/pixi_cli/src/cli/reinstall.rs +++ b/crates/pixi_cli/src/reinstall.rs @@ -6,7 +6,7 @@ use pixi_core::environment::get_update_lock_file_and_prefix; use pixi_core::lock_file::{ReinstallPackages, UpdateMode}; use pixi_core::{UpdateLockFileOptions, WorkspaceLocator}; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Re-install an environment, both updating the lockfile and re-installing the environment. /// @@ -30,7 +30,7 @@ pub struct Args { pub project_config: WorkspaceConfig, #[clap(flatten)] - pub lock_file_usage: crate::cli::LockFileUsageConfig, + pub lock_file_usage: crate::LockFileUsageConfig, /// The environment to install. #[arg(long, short)] diff --git a/crates/pixi_cli/src/cli/remove.rs b/crates/pixi_cli/src/remove.rs similarity index 96% rename from crates/pixi_cli/src/cli/remove.rs rename to crates/pixi_cli/src/remove.rs index f5c9a69c2f..08e8e2d1d4 100644 --- a/crates/pixi_cli/src/cli/remove.rs +++ b/crates/pixi_cli/src/remove.rs @@ -8,8 +8,8 @@ use pixi_core::{ }; use pixi_manifest::FeaturesExt; -use crate::cli::cli_config::{DependencyConfig, NoInstallConfig, WorkspaceConfig}; -use crate::cli::{cli_config::LockFileUpdateConfig, has_specs::HasSpecs}; +use crate::cli_config::{DependencyConfig, NoInstallConfig, WorkspaceConfig}; +use crate::{cli_config::LockFileUpdateConfig, has_specs::HasSpecs}; /// Removes dependencies from the workspace. /// diff --git a/crates/pixi_cli/src/cli/run.rs b/crates/pixi_cli/src/run.rs similarity index 99% rename from crates/pixi_cli/src/cli/run.rs rename to crates/pixi_cli/src/run.rs index 985a9f1fe3..0e73a562ad 100644 --- a/crates/pixi_cli/src/cli/run.rs +++ b/crates/pixi_cli/src/run.rs @@ -29,7 +29,7 @@ use pixi_core::{ workspace::{Environment, errors::UnsupportedPlatformError}, }; -use crate::cli::cli_config::{LockAndInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockAndInstallConfig, WorkspaceConfig}; /// Runs task in the pixi environment. /// diff --git a/crates/pixi_cli/src/cli/search.rs b/crates/pixi_cli/src/search.rs similarity index 99% rename from crates/pixi_cli/src/cli/search.rs rename to crates/pixi_cli/src/search.rs index 0da463624a..06773bcdf5 100644 --- a/crates/pixi_cli/src/cli/search.rs +++ b/crates/pixi_cli/src/search.rs @@ -22,8 +22,8 @@ use strsim::jaro; use tracing::{debug, error}; use url::Url; -use crate::cli::cli_config::ChannelsConfig; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::ChannelsConfig; +use crate::cli_config::WorkspaceConfig; /// Search a conda package /// diff --git a/crates/pixi_cli/src/cli/self_update.rs b/crates/pixi_cli/src/self_update.rs similarity index 99% rename from crates/pixi_cli/src/cli/self_update.rs rename to crates/pixi_cli/src/self_update.rs index c7db1c19c0..8ee2318eb2 100644 --- a/crates/pixi_cli/src/cli/self_update.rs +++ b/crates/pixi_cli/src/self_update.rs @@ -14,7 +14,7 @@ use url::Url; use rattler_conda_types::Version; use std::str::FromStr; -use crate::cli::GlobalOptions; +use crate::GlobalOptions; use pixi_reporters::format_release_notes; /// Update pixi to the latest version or a specific version. diff --git a/crates/pixi_cli/src/cli/shell.rs b/crates/pixi_cli/src/shell.rs similarity index 99% rename from crates/pixi_cli/src/cli/shell.rs rename to crates/pixi_cli/src/shell.rs index 4a870b5a2e..6213898379 100644 --- a/crates/pixi_cli/src/cli/shell.rs +++ b/crates/pixi_cli/src/shell.rs @@ -18,7 +18,7 @@ use pixi_core::{ workspace::get_activated_environment_variables, }; -use crate::cli::cli_config::{LockAndInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockAndInstallConfig, WorkspaceConfig}; #[cfg(target_family = "unix")] use pixi_pty::unix::PtySession; diff --git a/crates/pixi_cli/src/cli/shell_hook.rs b/crates/pixi_cli/src/shell_hook.rs similarity index 99% rename from crates/pixi_cli/src/cli/shell_hook.rs rename to crates/pixi_cli/src/shell_hook.rs index d05117b65c..dd565ea999 100644 --- a/crates/pixi_cli/src/cli/shell_hook.rs +++ b/crates/pixi_cli/src/shell_hook.rs @@ -20,7 +20,7 @@ use pixi_core::{ workspace::{Environment, HasWorkspaceRef, get_activated_environment_variables}, }; -use crate::cli::cli_config::{LockAndInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockAndInstallConfig, WorkspaceConfig}; /// Print the pixi environment activation script. /// diff --git a/crates/pixi_cli/src/cli/snapshots/pixi_cli__cli__completion__tests__bash_completion.snap b/crates/pixi_cli/src/snapshots/pixi_cli__completion__tests__bash_completion.snap similarity index 100% rename from crates/pixi_cli/src/cli/snapshots/pixi_cli__cli__completion__tests__bash_completion.snap rename to crates/pixi_cli/src/snapshots/pixi_cli__completion__tests__bash_completion.snap diff --git a/crates/pixi_cli/src/cli/snapshots/pixi_cli__cli__completion__tests__nushell_completion.snap b/crates/pixi_cli/src/snapshots/pixi_cli__completion__tests__nushell_completion.snap similarity index 100% rename from crates/pixi_cli/src/cli/snapshots/pixi_cli__cli__completion__tests__nushell_completion.snap rename to crates/pixi_cli/src/snapshots/pixi_cli__completion__tests__nushell_completion.snap diff --git a/crates/pixi_cli/src/cli/snapshots/pixi_cli__cli__completion__tests__zsh_completion.snap b/crates/pixi_cli/src/snapshots/pixi_cli__completion__tests__zsh_completion.snap similarity index 100% rename from crates/pixi_cli/src/cli/snapshots/pixi_cli__cli__completion__tests__zsh_completion.snap rename to crates/pixi_cli/src/snapshots/pixi_cli__completion__tests__zsh_completion.snap diff --git a/crates/pixi_cli/src/cli/task.rs b/crates/pixi_cli/src/task.rs similarity index 99% rename from crates/pixi_cli/src/cli/task.rs rename to crates/pixi_cli/src/task.rs index db3ea53b67..bed1ebadbd 100644 --- a/crates/pixi_cli/src/cli/task.rs +++ b/crates/pixi_cli/src/task.rs @@ -25,7 +25,7 @@ use pixi_core::{ workspace::{Environment, WorkspaceMut}, }; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; #[derive(Parser, Debug)] pub enum Operation { diff --git a/crates/pixi_cli/src/cli/tree.rs b/crates/pixi_cli/src/tree.rs similarity index 99% rename from crates/pixi_cli/src/cli/tree.rs rename to crates/pixi_cli/src/tree.rs index 0f0da3a31b..6620a2c933 100644 --- a/crates/pixi_cli/src/cli/tree.rs +++ b/crates/pixi_cli/src/tree.rs @@ -15,7 +15,7 @@ use rattler_conda_types::Platform; use rattler_lock::LockedPackageRef; use regex::Regex; -use crate::cli::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; /// Show a tree of workspace dependencies #[derive(Debug, Parser)] diff --git a/crates/pixi_cli/src/cli/update.rs b/crates/pixi_cli/src/update.rs similarity index 99% rename from crates/pixi_cli/src/cli/update.rs rename to crates/pixi_cli/src/update.rs index f049540003..2170d9616e 100644 --- a/crates/pixi_cli/src/cli/update.rs +++ b/crates/pixi_cli/src/update.rs @@ -18,7 +18,7 @@ use pixi_manifest::EnvironmentName; use rattler_conda_types::Platform; use rattler_lock::{LockFile, LockedPackageRef}; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// The `update` command checks if there are newer versions of the dependencies and updates the `pixi.lock` file and environments accordingly. /// diff --git a/crates/pixi_cli/src/cli/upgrade.rs b/crates/pixi_cli/src/upgrade.rs similarity index 99% rename from crates/pixi_cli/src/cli/upgrade.rs rename to crates/pixi_cli/src/upgrade.rs index 8b40dbff3a..3947d574e2 100644 --- a/crates/pixi_cli/src/cli/upgrade.rs +++ b/crates/pixi_cli/src/upgrade.rs @@ -17,7 +17,7 @@ use pixi_pypi_spec::PixiPypiSpec; use pixi_spec::PixiSpec; use rattler_conda_types::{MatchSpec, StringMatcher}; -use crate::cli::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; /// Checks if there are newer versions of the dependencies and upgrades them in the lockfile and manifest file. /// diff --git a/crates/pixi_cli/src/cli/upload.rs b/crates/pixi_cli/src/upload.rs similarity index 100% rename from crates/pixi_cli/src/cli/upload.rs rename to crates/pixi_cli/src/upload.rs diff --git a/crates/pixi_cli/src/cli/workspace/channel/add.rs b/crates/pixi_cli/src/workspace/channel/add.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/channel/add.rs rename to crates/pixi_cli/src/workspace/channel/add.rs diff --git a/crates/pixi_cli/src/cli/workspace/channel/list.rs b/crates/pixi_cli/src/workspace/channel/list.rs similarity index 97% rename from crates/pixi_cli/src/cli/workspace/channel/list.rs rename to crates/pixi_cli/src/workspace/channel/list.rs index 8cea797494..cc8896f4a5 100644 --- a/crates/pixi_cli/src/cli/workspace/channel/list.rs +++ b/crates/pixi_cli/src/workspace/channel/list.rs @@ -5,7 +5,7 @@ use fancy_display::FancyDisplay; use pixi_core::WorkspaceLocator; use pixi_manifest::FeaturesExt; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; #[derive(Parser, Debug, Default, Clone)] pub struct Args { diff --git a/crates/pixi_cli/src/cli/workspace/channel/mod.rs b/crates/pixi_cli/src/workspace/channel/mod.rs similarity index 97% rename from crates/pixi_cli/src/cli/workspace/channel/mod.rs rename to crates/pixi_cli/src/workspace/channel/mod.rs index 87117cbda3..ffcccf431f 100644 --- a/crates/pixi_cli/src/cli/workspace/channel/mod.rs +++ b/crates/pixi_cli/src/workspace/channel/mod.rs @@ -8,7 +8,7 @@ use pixi_config::ConfigCli; use pixi_manifest::{FeatureName, PrioritizedChannel}; use rattler_conda_types::{ChannelConfig, NamedChannelOrUrl}; -use crate::cli::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; /// Commands to manage workspace channels. #[derive(Parser, Debug, Clone)] diff --git a/crates/pixi_cli/src/cli/workspace/channel/remove.rs b/crates/pixi_cli/src/workspace/channel/remove.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/channel/remove.rs rename to crates/pixi_cli/src/workspace/channel/remove.rs diff --git a/crates/pixi_cli/src/cli/workspace/description/get.rs b/crates/pixi_cli/src/workspace/description/get.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/description/get.rs rename to crates/pixi_cli/src/workspace/description/get.rs diff --git a/crates/pixi_cli/src/cli/workspace/description/mod.rs b/crates/pixi_cli/src/workspace/description/mod.rs similarity index 95% rename from crates/pixi_cli/src/cli/workspace/description/mod.rs rename to crates/pixi_cli/src/workspace/description/mod.rs index f48cfe8b1c..ca6e917d16 100644 --- a/crates/pixi_cli/src/cli/workspace/description/mod.rs +++ b/crates/pixi_cli/src/workspace/description/mod.rs @@ -4,7 +4,7 @@ pub mod set; use clap::Parser; use pixi_core::WorkspaceLocator; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Commands to manage workspace description. #[derive(Parser, Debug)] diff --git a/crates/pixi_cli/src/cli/workspace/description/set.rs b/crates/pixi_cli/src/workspace/description/set.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/description/set.rs rename to crates/pixi_cli/src/workspace/description/set.rs diff --git a/crates/pixi_cli/src/cli/workspace/environment/add.rs b/crates/pixi_cli/src/workspace/environment/add.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/environment/add.rs rename to crates/pixi_cli/src/workspace/environment/add.rs diff --git a/crates/pixi_cli/src/cli/workspace/environment/list.rs b/crates/pixi_cli/src/workspace/environment/list.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/environment/list.rs rename to crates/pixi_cli/src/workspace/environment/list.rs diff --git a/crates/pixi_cli/src/cli/workspace/environment/mod.rs b/crates/pixi_cli/src/workspace/environment/mod.rs similarity index 96% rename from crates/pixi_cli/src/cli/workspace/environment/mod.rs rename to crates/pixi_cli/src/workspace/environment/mod.rs index 1576904da1..15aa35d278 100644 --- a/crates/pixi_cli/src/cli/workspace/environment/mod.rs +++ b/crates/pixi_cli/src/workspace/environment/mod.rs @@ -5,7 +5,7 @@ pub mod remove; use clap::Parser; use pixi_core::WorkspaceLocator; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Commands to manage project environments. #[derive(Parser, Debug)] diff --git a/crates/pixi_cli/src/cli/workspace/environment/remove.rs b/crates/pixi_cli/src/workspace/environment/remove.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/environment/remove.rs rename to crates/pixi_cli/src/workspace/environment/remove.rs diff --git a/crates/pixi_cli/src/cli/workspace/export/conda_environment.rs b/crates/pixi_cli/src/workspace/export/conda_environment.rs similarity index 99% rename from crates/pixi_cli/src/cli/workspace/export/conda_environment.rs rename to crates/pixi_cli/src/workspace/export/conda_environment.rs index 1de7f2c63a..f97be264ef 100644 --- a/crates/pixi_cli/src/cli/workspace/export/conda_environment.rs +++ b/crates/pixi_cli/src/workspace/export/conda_environment.rs @@ -12,7 +12,7 @@ use rattler_conda_types::{ ParseStrictness, Platform, }; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; #[derive(Debug, Parser)] pub struct Args { @@ -363,7 +363,8 @@ mod tests { #[test] fn test_export_conda_env_yaml_with_pip_find_links() { - let path = Path::new(env!("CARGO_WORKSPACE_DIR")).join("examples/pypi-find-links/pixi.toml"); + let path = + Path::new(env!("CARGO_WORKSPACE_DIR")).join("examples/pypi-find-links/pixi.toml"); let workspace = Workspace::from_path(&path).unwrap(); let args = Args { output_path: None, diff --git a/crates/pixi_cli/src/cli/workspace/export/conda_explicit_spec.rs b/crates/pixi_cli/src/workspace/export/conda_explicit_spec.rs similarity index 99% rename from crates/pixi_cli/src/cli/workspace/export/conda_explicit_spec.rs rename to crates/pixi_cli/src/workspace/export/conda_explicit_spec.rs index f41c261872..b5fd558434 100644 --- a/crates/pixi_cli/src/cli/workspace/export/conda_explicit_spec.rs +++ b/crates/pixi_cli/src/workspace/export/conda_explicit_spec.rs @@ -12,7 +12,7 @@ use rattler_conda_types::{ }; use rattler_lock::{CondaPackageData, Environment, LockedPackageRef}; -use crate::cli::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; +use crate::cli_config::{LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig}; #[derive(Debug, Parser)] #[clap(arg_required_else_help = false)] diff --git a/crates/pixi_cli/src/cli/workspace/export/mod.rs b/crates/pixi_cli/src/workspace/export/mod.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/mod.rs rename to crates/pixi_cli/src/workspace/export/mod.rs diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_pyproject_panic.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_pyproject_panic.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_pyproject_panic.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_pyproject_panic.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_defaults.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_defaults.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_defaults.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_defaults.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_custom_registry.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_custom_registry.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_custom_registry.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_custom_registry.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_extras.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_extras.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_extras.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_extras.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_find_links.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_find_links.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_find_links.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_pip_find_links.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_linux-64.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_linux-64.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_linux-64.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_linux-64.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-64.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-64.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-64.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-64.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-arm64.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-arm64.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-arm64.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_default_osx-arm64.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_linux-64.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_linux-64.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_linux-64.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_linux-64.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-64.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-64.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-64.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-64.snap diff --git a/crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-arm64.snap b/crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-arm64.snap similarity index 100% rename from crates/pixi_cli/src/cli/workspace/export/snapshots/pixi_cli__cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-arm64.snap rename to crates/pixi_cli/src/workspace/export/snapshots/pixi_cli__workspace__export__conda_explicit_spec__tests__test_render_conda_explicit_spec_test_osx-arm64.snap diff --git a/crates/pixi_cli/src/cli/workspace/mod.rs b/crates/pixi_cli/src/workspace/mod.rs similarity index 97% rename from crates/pixi_cli/src/cli/workspace/mod.rs rename to crates/pixi_cli/src/workspace/mod.rs index 0e35709fa4..77d4657f4e 100644 --- a/crates/pixi_cli/src/cli/workspace/mod.rs +++ b/crates/pixi_cli/src/workspace/mod.rs @@ -1,6 +1,6 @@ use clap::Parser; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; pub mod channel; pub mod description; diff --git a/crates/pixi_cli/src/cli/workspace/name/get.rs b/crates/pixi_cli/src/workspace/name/get.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/name/get.rs rename to crates/pixi_cli/src/workspace/name/get.rs diff --git a/crates/pixi_cli/src/cli/workspace/name/mod.rs b/crates/pixi_cli/src/workspace/name/mod.rs similarity index 95% rename from crates/pixi_cli/src/cli/workspace/name/mod.rs rename to crates/pixi_cli/src/workspace/name/mod.rs index 86b876b4f2..a1657cc642 100644 --- a/crates/pixi_cli/src/cli/workspace/name/mod.rs +++ b/crates/pixi_cli/src/workspace/name/mod.rs @@ -4,7 +4,7 @@ pub mod set; use clap::Parser; use pixi_core::WorkspaceLocator; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Commands to manage workspace name. #[derive(Parser, Debug)] diff --git a/crates/pixi_cli/src/cli/workspace/name/set.rs b/crates/pixi_cli/src/workspace/name/set.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/name/set.rs rename to crates/pixi_cli/src/workspace/name/set.rs diff --git a/crates/pixi_cli/src/cli/workspace/platform/add.rs b/crates/pixi_cli/src/workspace/platform/add.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/platform/add.rs rename to crates/pixi_cli/src/workspace/platform/add.rs diff --git a/crates/pixi_cli/src/cli/workspace/platform/list.rs b/crates/pixi_cli/src/workspace/platform/list.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/platform/list.rs rename to crates/pixi_cli/src/workspace/platform/list.rs diff --git a/crates/pixi_cli/src/cli/workspace/platform/mod.rs b/crates/pixi_cli/src/workspace/platform/mod.rs similarity index 96% rename from crates/pixi_cli/src/cli/workspace/platform/mod.rs rename to crates/pixi_cli/src/workspace/platform/mod.rs index f2d6b22ebd..52cb53516a 100644 --- a/crates/pixi_cli/src/cli/workspace/platform/mod.rs +++ b/crates/pixi_cli/src/workspace/platform/mod.rs @@ -5,7 +5,7 @@ pub mod remove; use clap::Parser; use pixi_core::WorkspaceLocator; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Commands to manage workspace platforms. #[derive(Parser, Debug)] diff --git a/crates/pixi_cli/src/cli/workspace/platform/remove.rs b/crates/pixi_cli/src/workspace/platform/remove.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/platform/remove.rs rename to crates/pixi_cli/src/workspace/platform/remove.rs diff --git a/crates/pixi_cli/src/cli/workspace/requires_pixi/get.rs b/crates/pixi_cli/src/workspace/requires_pixi/get.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/requires_pixi/get.rs rename to crates/pixi_cli/src/workspace/requires_pixi/get.rs diff --git a/crates/pixi_cli/src/cli/workspace/requires_pixi/mod.rs b/crates/pixi_cli/src/workspace/requires_pixi/mod.rs similarity index 96% rename from crates/pixi_cli/src/cli/workspace/requires_pixi/mod.rs rename to crates/pixi_cli/src/workspace/requires_pixi/mod.rs index 630bbe4e75..96aa00e83f 100644 --- a/crates/pixi_cli/src/cli/workspace/requires_pixi/mod.rs +++ b/crates/pixi_cli/src/workspace/requires_pixi/mod.rs @@ -6,7 +6,7 @@ pub mod verify; use clap::Parser; use pixi_core::WorkspaceLocator; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Commands to manage the pixi minimum version requirement. #[derive(Parser, Debug)] diff --git a/crates/pixi_cli/src/cli/workspace/requires_pixi/set.rs b/crates/pixi_cli/src/workspace/requires_pixi/set.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/requires_pixi/set.rs rename to crates/pixi_cli/src/workspace/requires_pixi/set.rs diff --git a/crates/pixi_cli/src/cli/workspace/requires_pixi/unset.rs b/crates/pixi_cli/src/workspace/requires_pixi/unset.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/requires_pixi/unset.rs rename to crates/pixi_cli/src/workspace/requires_pixi/unset.rs diff --git a/crates/pixi_cli/src/cli/workspace/requires_pixi/verify.rs b/crates/pixi_cli/src/workspace/requires_pixi/verify.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/requires_pixi/verify.rs rename to crates/pixi_cli/src/workspace/requires_pixi/verify.rs diff --git a/crates/pixi_cli/src/cli/workspace/system_requirements/add.rs b/crates/pixi_cli/src/workspace/system_requirements/add.rs similarity index 97% rename from crates/pixi_cli/src/cli/workspace/system_requirements/add.rs rename to crates/pixi_cli/src/workspace/system_requirements/add.rs index 7df56eebe4..8b7835e1e5 100644 --- a/crates/pixi_cli/src/cli/workspace/system_requirements/add.rs +++ b/crates/pixi_cli/src/workspace/system_requirements/add.rs @@ -1,4 +1,4 @@ -use crate::cli::workspace::system_requirements::SystemRequirementEnum; +use crate::workspace::system_requirements::SystemRequirementEnum; use clap::Parser; use miette::IntoDiagnostic; use pixi_core::Workspace; diff --git a/crates/pixi_cli/src/cli/workspace/system_requirements/list.rs b/crates/pixi_cli/src/workspace/system_requirements/list.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/system_requirements/list.rs rename to crates/pixi_cli/src/workspace/system_requirements/list.rs diff --git a/crates/pixi_cli/src/cli/workspace/system_requirements/mod.rs b/crates/pixi_cli/src/workspace/system_requirements/mod.rs similarity index 97% rename from crates/pixi_cli/src/cli/workspace/system_requirements/mod.rs rename to crates/pixi_cli/src/workspace/system_requirements/mod.rs index 3058a67e3c..16f8aaedd3 100644 --- a/crates/pixi_cli/src/cli/workspace/system_requirements/mod.rs +++ b/crates/pixi_cli/src/workspace/system_requirements/mod.rs @@ -4,7 +4,7 @@ pub mod list; use clap::{Parser, ValueEnum}; use pixi_core::WorkspaceLocator; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Enum for valid system requirement names. #[derive(Debug, Clone, Copy, ValueEnum)] diff --git a/crates/pixi_cli/src/cli/workspace/version/bump.rs b/crates/pixi_cli/src/workspace/version/bump.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/version/bump.rs rename to crates/pixi_cli/src/workspace/version/bump.rs diff --git a/crates/pixi_cli/src/cli/workspace/version/get.rs b/crates/pixi_cli/src/workspace/version/get.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/version/get.rs rename to crates/pixi_cli/src/workspace/version/get.rs diff --git a/crates/pixi_cli/src/cli/workspace/version/mod.rs b/crates/pixi_cli/src/workspace/version/mod.rs similarity index 96% rename from crates/pixi_cli/src/cli/workspace/version/mod.rs rename to crates/pixi_cli/src/workspace/version/mod.rs index b4d0e54a58..970d16866c 100644 --- a/crates/pixi_cli/src/cli/workspace/version/mod.rs +++ b/crates/pixi_cli/src/workspace/version/mod.rs @@ -6,7 +6,7 @@ use clap::Parser; use pixi_core::WorkspaceLocator; use rattler_conda_types::VersionBumpType; -use crate::cli::cli_config::WorkspaceConfig; +use crate::cli_config::WorkspaceConfig; /// Commands to manage workspace version. #[derive(Parser, Debug)] diff --git a/crates/pixi_cli/src/cli/workspace/version/set.rs b/crates/pixi_cli/src/workspace/version/set.rs similarity index 100% rename from crates/pixi_cli/src/cli/workspace/version/set.rs rename to crates/pixi_cli/src/workspace/version/set.rs diff --git a/crates/pixi_docs/src/main.rs b/crates/pixi_docs/src/main.rs index 9ecbd8b54f..bad1408dc7 100644 --- a/crates/pixi_docs/src/main.rs +++ b/crates/pixi_docs/src/main.rs @@ -377,5 +377,5 @@ fn arguments(options: &[&clap::Arg], parents: &[String]) -> String { /// Loads the CLI command structure from pixi fn get_command() -> Command { - pixi_cli::cli::Args::command() + pixi_cli::Args::command() } diff --git a/tests/integration_rust/add_tests.rs b/tests/integration_rust/add_tests.rs index 051e82e375..c91aa624df 100644 --- a/tests/integration_rust/add_tests.rs +++ b/tests/integration_rust/add_tests.rs @@ -1,6 +1,6 @@ use std::str::FromStr; -use pixi_cli::cli::cli_config::GitRev; +use pixi_cli::cli_config::GitRev; use pixi_consts::consts; use pixi_core::{DependencyType, Workspace}; use pixi_manifest::{FeaturesExt, SpecType}; diff --git a/tests/integration_rust/common/builders.rs b/tests/integration_rust/common/builders.rs index 6b0667f66c..926945fff9 100644 --- a/tests/integration_rust/common/builders.rs +++ b/tests/integration_rust/common/builders.rs @@ -23,7 +23,7 @@ //! } //! ``` -use pixi_cli::cli::{ +use pixi_cli::{ add, cli_config::{ DependencyConfig, GitRev, LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig, diff --git a/tests/integration_rust/common/mod.rs b/tests/integration_rust/common/mod.rs index 3344dbfc96..41432c5ac7 100644 --- a/tests/integration_rust/common/mod.rs +++ b/tests/integration_rust/common/mod.rs @@ -15,11 +15,11 @@ use std::{ use builders::{LockBuilder, SearchBuilder}; use indicatif::ProgressDrawTarget; use miette::{Context, Diagnostic, IntoDiagnostic}; -use pixi_cli::cli::LockFileUsageConfig; -use pixi_cli::cli::cli_config::{ +use pixi_cli::LockFileUsageConfig; +use pixi_cli::cli_config::{ ChannelsConfig, LockFileUpdateConfig, NoInstallConfig, WorkspaceConfig, }; -use pixi_cli::cli::{ +use pixi_cli::{ add, init::{self, GitAttributes}, install::Args, diff --git a/tests/integration_rust/init_tests.rs b/tests/integration_rust/init_tests.rs index 570276c888..85195a4697 100644 --- a/tests/integration_rust/init_tests.rs +++ b/tests/integration_rust/init_tests.rs @@ -1,6 +1,5 @@ use std::str::FromStr; -use pixi_cli::cli; use pixi_manifest::FeaturesExt; use rattler_conda_types::{NamedChannelOrUrl, Platform, Version}; @@ -81,7 +80,7 @@ async fn init_from_existing_pyproject_toml() { // Init a new project pixi.init() - .with_format(cli::init::ManifestFormat::Pyproject) + .with_format(pixi_cli::init::ManifestFormat::Pyproject) .await .unwrap(); diff --git a/tests/integration_rust/install_tests.rs b/tests/integration_rust/install_tests.rs index b722e6715d..479a31be39 100644 --- a/tests/integration_rust/install_tests.rs +++ b/tests/integration_rust/install_tests.rs @@ -7,8 +7,8 @@ use std::{ }; use fs_err::tokio as tokio_fs; -use pixi_cli::cli::run::{self, Args}; -use pixi_cli::cli::{ +use pixi_cli::run::{self, Args}; +use pixi_cli::{ LockFileUsageConfig, cli_config::{LockAndInstallConfig, LockFileUpdateConfig, WorkspaceConfig}, }; diff --git a/tests/integration_rust/project_tests.rs b/tests/integration_rust/project_tests.rs index 3f0aafa3a6..d8f79c9012 100644 --- a/tests/integration_rust/project_tests.rs +++ b/tests/integration_rust/project_tests.rs @@ -116,7 +116,7 @@ async fn parse_valid_schema_projects() { let path = entry.path(); if path.extension().map(|ext| ext == "toml").unwrap_or(false) { let pixi_toml = fs_err::read_to_string(&path).unwrap(); - // Fake manifest path to be CARGO_WORKSPACE_DIR/pixi.toml + // Fake manifest path to be CARGO_WORKSPACE_DIR/pixi.toml // so the test is able to find a valid LICENSE file. let manifest_path = PathBuf::from(env!("CARGO_WORKSPACE_DIR")).join("pixi.toml"); if let Err(e) = Workspace::from_str(&manifest_path, &pixi_toml) { @@ -131,13 +131,14 @@ fn parse_valid_docs_manifests() { setup_tracing(); // Test all files in the docs/source_files/pixi_tomls directory - let schema_dir = PathBuf::from(env!("CARGO_WORKSPACE_DIR")).join("docs/source_files/pixi_tomls"); + let schema_dir = + PathBuf::from(env!("CARGO_WORKSPACE_DIR")).join("docs/source_files/pixi_tomls"); for entry in fs_err::read_dir(schema_dir).unwrap() { let entry = entry.unwrap(); let path = entry.path(); if path.extension().map(|ext| ext == "toml").unwrap_or(false) { let pixi_toml = fs_err::read_to_string(&path).unwrap(); - // Fake manifest path to be CARGO_WORKSPACE_DIR/pixi.toml + // Fake manifest path to be CARGO_WORKSPACE_DIR/pixi.toml // so the test is able to find a valid LICENSE file. let manifest_path = PathBuf::from(env!("CARGO_WORKSPACE_DIR")).join("pixi.toml"); if let Err(e) = Workspace::from_str(&manifest_path, &pixi_toml) { diff --git a/tests/integration_rust/search_tests.rs b/tests/integration_rust/search_tests.rs index 9b5d19c575..9cb908ba20 100644 --- a/tests/integration_rust/search_tests.rs +++ b/tests/integration_rust/search_tests.rs @@ -1,5 +1,5 @@ use insta::assert_snapshot; -use pixi_cli::cli::search; +use pixi_cli::search; use rattler_conda_types::Platform; use tempfile::TempDir; use url::Url; diff --git a/tests/integration_rust/solve_group_tests.rs b/tests/integration_rust/solve_group_tests.rs index 2e59cdfe2d..c1c027f75c 100644 --- a/tests/integration_rust/solve_group_tests.rs +++ b/tests/integration_rust/solve_group_tests.rs @@ -369,7 +369,8 @@ async fn test_dont_record_not_present_package_as_purl() { fn absolute_custom_mapping_path() -> String { dunce::simplified( - &Path::new(env!("CARGO_WORKSPACE_DIR")).join("tests/data/mapping_files/custom_mapping.json"), + &Path::new(env!("CARGO_WORKSPACE_DIR")) + .join("tests/data/mapping_files/custom_mapping.json"), ) .display() .to_string() diff --git a/tests/integration_rust/task_tests.rs b/tests/integration_rust/task_tests.rs index c41a549869..185fb0670e 100644 --- a/tests/integration_rust/task_tests.rs +++ b/tests/integration_rust/task_tests.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; -use pixi_cli::cli::cli_config::WorkspaceConfig; -use pixi_cli::cli::run::Args; +use pixi_cli::cli_config::WorkspaceConfig; +use pixi_cli::run::Args; use pixi_core::task::TaskName; use pixi_manifest::{ FeatureName, Task, diff --git a/tests/integration_rust/upgrade_tests.rs b/tests/integration_rust/upgrade_tests.rs index 477bed0225..69147d1947 100644 --- a/tests/integration_rust/upgrade_tests.rs +++ b/tests/integration_rust/upgrade_tests.rs @@ -1,6 +1,6 @@ use indexmap::IndexMap; use insta::assert_snapshot; -use pixi_cli::cli::upgrade::{Args, parse_specs}; +use pixi_cli::upgrade::{Args, parse_specs}; use pixi_core::Workspace; use rattler_conda_types::Platform;