From 8878f0e1b663e94134e77e5681101d2f18b4d3d0 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sat, 30 Nov 2024 09:05:29 -0500 Subject: [PATCH] Pass extra when evaluating lockfile markers --- crates/uv-resolver/src/lock/target.rs | 7 +- crates/uv/tests/it/run.rs | 92 +++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/crates/uv-resolver/src/lock/target.rs b/crates/uv-resolver/src/lock/target.rs index aba2b77becc1..07aab42bc400 100644 --- a/crates/uv-resolver/src/lock/target.rs +++ b/crates/uv-resolver/src/lock/target.rs @@ -3,7 +3,7 @@ use petgraph::Graph; use rustc_hash::{FxBuildHasher, FxHashMap, FxHashSet}; use std::collections::hash_map::Entry; use std::collections::{BTreeMap, VecDeque}; - +use std::slice; use uv_configuration::{BuildOptions, DevGroupsManifest, ExtrasSpecification, InstallOptions}; use uv_distribution_types::{Edge, Node, Resolution, ResolvedDist}; use uv_normalize::{ExtraName, GroupName, PackageName, DEV_DEPENDENCIES}; @@ -359,7 +359,10 @@ impl<'env> InstallTarget<'env> { Either::Right(package.dependencies.iter()) }; for dep in deps { - if !dep.complexified_marker.evaluate(marker_env, &[]) { + if !dep + .complexified_marker + .evaluate(marker_env, extra.map(slice::from_ref).unwrap_or_default()) + { continue; } diff --git a/crates/uv/tests/it/run.rs b/crates/uv/tests/it/run.rs index 4daef48aceec..5e4001347b88 100644 --- a/crates/uv/tests/it/run.rs +++ b/crates/uv/tests/it/run.rs @@ -3201,3 +3201,95 @@ fn run_with_not_existing_env_file() -> Result<()> { Ok(()) } + +#[test] +fn run_with_extra_conflict() -> Result<()> { + let context = TestContext::new("3.12"); + + let pyproject_toml = context.temp_dir.child("pyproject.toml"); + pyproject_toml.write_str(indoc! { r#" + [project] + name = "project" + version = "0.1.0" + requires-python = ">=3.12.0" + dependencies = [] + + [project.optional-dependencies] + foo = ["iniconfig==2.0.0"] + bar = ["iniconfig==1.1.1"] + + [tool.uv] + conflicts = [ + [ + { extra = "foo" }, + { extra = "bar" }, + ], + ] + "# + })?; + + uv_snapshot!(context.filters(), context.run() + .arg("--extra") + .arg("foo") + .arg("python") + .arg("-c") + .arg("import iniconfig"), @r###" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Resolved 3 packages in [TIME] + Prepared 1 package in [TIME] + Installed 1 package in [TIME] + + iniconfig==2.0.0 + "###); + + Ok(()) +} + +#[test] +fn run_with_group_conflict() -> Result<()> { + let context = TestContext::new("3.12"); + + let pyproject_toml = context.temp_dir.child("pyproject.toml"); + pyproject_toml.write_str(indoc! { r#" + [project] + name = "project" + version = "0.1.0" + requires-python = ">=3.12.0" + dependencies = [] + + [dependency-groups] + foo = ["iniconfig==2.0.0"] + bar = ["iniconfig==1.1.1"] + + [tool.uv] + conflicts = [ + [ + { group = "foo" }, + { group = "bar" }, + ], + ] + "# + })?; + + uv_snapshot!(context.filters(), context.run() + .arg("--group") + .arg("foo") + .arg("python") + .arg("-c") + .arg("import iniconfig"), @r###" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Resolved 3 packages in [TIME] + Prepared 1 package in [TIME] + Installed 1 package in [TIME] + + iniconfig==2.0.0 + "###); + + Ok(()) +}