From 99bfa45564280cd265082b06b75c798bf34187f9 Mon Sep 17 00:00:00 2001 From: Dozie2001 Date: Sun, 2 Feb 2025 17:41:40 +0100 Subject: [PATCH 1/4] fix: add check error message to remove uv dependencies --- src/cli/remove.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/cli/remove.rs b/src/cli/remove.rs index 43b0d5316..a259956e5 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -1,5 +1,6 @@ use clap::Parser; use miette::Context; +use pixi_manifest::FeaturesExt; use crate::environment::get_update_lock_file_and_prefix; use crate::Project; @@ -40,8 +41,29 @@ pub async fn execute(args: Args) -> miette::Result<()> { .with_cli_config(prefix_update_config.config.clone()); let dependency_type = dependency_config.dependency_type(); + // Prevent removing Python if PyPI dependencies exist + if let DependencyType::CondaDependency(_) = dependency_type { + for name in dependency_config.specs()?.keys() { + if name.as_source() == "python" { + // Check if there are any PyPI dependencies by importing the PypiDependencies trait + let pypi_deps = project.default_environment().pypi_dependencies(None); + if !pypi_deps.is_empty() { + let deps_list = pypi_deps + .iter() + .map(|(name, _)| name.as_source()) + .collect::>() + .join(", "); + return Err(miette::miette!( + "Cannot remove Python while PyPI dependencies exist. Please remove these PyPI dependencies first: {}", + deps_list + )); + } + } + } + } match dependency_type { DependencyType::PypiDependency => { + let mut removed_deps = Vec::new(); for name in dependency_config.pypi_deps(&project)?.keys() { project .manifest @@ -54,7 +76,13 @@ pub async fn execute(args: Args) -> miette::Result<()> { "failed to remove PyPI dependency: '{}'", name.as_source() ))?; + removed_deps.push(name.as_source().to_string()); } + eprintln!( + "{}Removed PyPI dependencies: {}", + console::style(console::Emoji("✔ ", "")).green(), + removed_deps.join(", ") + ); } DependencyType::CondaDependency(spec_type) => { for name in dependency_config.specs()?.keys() { From 8e1fd7cb5ddd7db5c36fd2e14b5f144662cfee99 Mon Sep 17 00:00:00 2001 From: Dozie2001 Date: Mon, 3 Feb 2025 01:13:42 +0100 Subject: [PATCH 2/4] chore: removed second check print --- src/cli/remove.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/cli/remove.rs b/src/cli/remove.rs index a259956e5..f47270aeb 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -78,11 +78,6 @@ pub async fn execute(args: Args) -> miette::Result<()> { ))?; removed_deps.push(name.as_source().to_string()); } - eprintln!( - "{}Removed PyPI dependencies: {}", - console::style(console::Emoji("✔ ", "")).green(), - removed_deps.join(", ") - ); } DependencyType::CondaDependency(spec_type) => { for name in dependency_config.specs()?.keys() { From 7b8e6bf424c569df36f5ae297f1e037066c93b4a Mon Sep 17 00:00:00 2001 From: Dozie2001 Date: Mon, 3 Feb 2025 20:27:20 +0100 Subject: [PATCH 3/4] chore: removed unused vector --- src/cli/remove.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cli/remove.rs b/src/cli/remove.rs index f47270aeb..86bf45d7d 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -63,7 +63,6 @@ pub async fn execute(args: Args) -> miette::Result<()> { } match dependency_type { DependencyType::PypiDependency => { - let mut removed_deps = Vec::new(); for name in dependency_config.pypi_deps(&project)?.keys() { project .manifest @@ -76,7 +75,6 @@ pub async fn execute(args: Args) -> miette::Result<()> { "failed to remove PyPI dependency: '{}'", name.as_source() ))?; - removed_deps.push(name.as_source().to_string()); } } DependencyType::CondaDependency(spec_type) => { From 41b521f0d2f917a34c9b13956e08a07fef1b3e74 Mon Sep 17 00:00:00 2001 From: Tim de Jager Date: Tue, 4 Feb 2025 14:56:14 +0100 Subject: [PATCH 4/4] fix: fmt --- src/cli/remove.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli/remove.rs b/src/cli/remove.rs index 86bf45d7d..95e4ec900 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -41,8 +41,8 @@ pub async fn execute(args: Args) -> miette::Result<()> { .with_cli_config(prefix_update_config.config.clone()); let dependency_type = dependency_config.dependency_type(); - // Prevent removing Python if PyPI dependencies exist - if let DependencyType::CondaDependency(_) = dependency_type { + // Prevent removing Python if PyPI dependencies exist + if let DependencyType::CondaDependency(_) = dependency_type { for name in dependency_config.specs()?.keys() { if name.as_source() == "python" { // Check if there are any PyPI dependencies by importing the PypiDependencies trait