diff --git a/crates/uv-resolver/src/candidate_selector.rs b/crates/uv-resolver/src/candidate_selector.rs index 4f443becbd6c..b674ac81b3af 100644 --- a/crates/uv-resolver/src/candidate_selector.rs +++ b/crates/uv-resolver/src/candidate_selector.rs @@ -188,10 +188,9 @@ impl CandidateSelector { .filter(|(marker, _index, _version)| !env.included_by_marker(marker.pep508())); let preferences = preferences_match.chain(preferences_mismatch).filter_map( |(marker, source, version)| { - // If the package is mapped to an explicit index, only consider preferences that - // match the index. + // Ignore preferences that are associated with conflicting indexes. index - .map_or(true, |index| source == Some(index)) + .is_none_or(|index| source.is_none_or(|source| source == index)) .then_some((marker, version)) }, ); diff --git a/crates/uv/tests/it/pip_compile.rs b/crates/uv/tests/it/pip_compile.rs index f554c29c840d..fe459358ead5 100644 --- a/crates/uv/tests/it/pip_compile.rs +++ b/crates/uv/tests/it/pip_compile.rs @@ -14345,3 +14345,51 @@ fn max_python_requirement() -> Result<()> { Ok(()) } + +/// See: +#[test] +fn respect_index_preference() -> Result<()> { + let context = TestContext::new("3.12"); + let pyproject_toml = context.temp_dir.child("pyproject.toml"); + pyproject_toml.write_str(indoc::indoc! {r#" + [project] + name = "project" + version = "0.1.0" + dependencies = ["iniconfig>=1", "typing-extensions>=4"] + + [[tool.uv.index]] + name = "pypi" + url = "https://pypi.org/simple" + explicit = true + + [tool.uv.sources] + iniconfig = { index = "pypi" } + "#})?; + + let requirements_txt = context.temp_dir.child("requirements.txt"); + requirements_txt.write_str(indoc::indoc! {r" + iniconfig==1.1.1 + typing-extensions==4.6.0 + "})?; + + uv_snapshot!(context + .pip_compile() + .arg("pyproject.toml") + .arg("-o") + .arg("requirements.txt"), @r###" + success: true + exit_code: 0 + ----- stdout ----- + # This file was autogenerated by uv via the following command: + # uv pip compile --cache-dir [CACHE_DIR] pyproject.toml -o requirements.txt + iniconfig==1.1.1 + # via project (pyproject.toml) + typing-extensions==4.6.0 + # via project (pyproject.toml) + + ----- stderr ----- + Resolved 2 packages in [TIME] + "###); + + Ok(()) +}