Skip to content

Commit ae96101

Browse files
Avoid dropping pip sync requirements with markers (#4051)
## Summary Thankfully this is pretty rare since `pip sync` is usually run on `pip compile` output, and `pip compile` never outputs markers. Closes #4044
1 parent b0d1fc8 commit ae96101

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

crates/uv-resolver/src/resolver/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,20 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
954954
} => {
955955
// If we're excluding transitive dependencies, short-circuit.
956956
if self.dependency_mode.is_direct() {
957+
// If a package has a marker, add a dependency from it to the
958+
// same package without markers.
959+
if marker.is_some() {
960+
return Ok(Dependencies::Available(vec![(
961+
PubGrubPackage::from(PubGrubPackageInner::Package {
962+
name: name.clone(),
963+
extra: extra.clone(),
964+
marker: None,
965+
url: url.clone(),
966+
}),
967+
Range::singleton(version.clone()),
968+
)]));
969+
}
970+
957971
// If an extra is provided, wait for the metadata to be available, since it's
958972
// still required for generating the lock file.
959973
let dist = match url {

crates/uv/tests/pip_sync.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5164,3 +5164,28 @@ fn target_no_build_isolation() -> Result<()> {
51645164

51655165
Ok(())
51665166
}
5167+
5168+
/// Ensure that we install packages with markers on them.
5169+
#[test]
5170+
fn preserve_markers() -> Result<()> {
5171+
let context = TestContext::new("3.12");
5172+
5173+
let requirements_txt = context.temp_dir.child("requirements.txt");
5174+
requirements_txt.write_str("anyio ; python_version > '3.7'")?;
5175+
5176+
uv_snapshot!(sync_without_exclude_newer(&context)
5177+
.arg("requirements.txt"), @r###"
5178+
success: true
5179+
exit_code: 0
5180+
----- stdout -----
5181+
5182+
----- stderr -----
5183+
Resolved 1 package in [TIME]
5184+
Downloaded 1 package in [TIME]
5185+
Installed 1 package in [TIME]
5186+
+ anyio==4.4.0
5187+
"###
5188+
);
5189+
5190+
Ok(())
5191+
}

0 commit comments

Comments
 (0)