Skip to content

Commit ec09a91

Browse files
committed
Apply dependency exclusions to direct requirements
1 parent 60ee390 commit ec09a91

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,6 +1791,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
17911791
);
17921792

17931793
requirements
1794+
.filter(|requirement| !self.excludes.contains(&requirement.name))
17941795
.flat_map(move |requirement| {
17951796
PubGrubDependency::from_requirement(
17961797
&self.conflicts,

crates/uv/tests/it/pip_compile.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4306,6 +4306,34 @@ fn override_dependency_from_specific_uv_toml() -> Result<()> {
43064306
Ok(())
43074307
}
43084308

4309+
/// Check that `exclude-dependencies` in `uv.toml` applies to direct requirements.
4310+
#[test]
4311+
fn exclude_direct_dependency_from_uv_toml() -> Result<()> {
4312+
let context = uv_test::test_context!("3.12");
4313+
let requirements_in = context.temp_dir.child("requirements.in");
4314+
requirements_in.write_str("werkzeug")?;
4315+
4316+
let uv_toml = context.temp_dir.child("uv.toml");
4317+
uv_toml.write_str(
4318+
r#"
4319+
exclude-dependencies = ["werkzeug"]
4320+
"#,
4321+
)?;
4322+
4323+
uv_snapshot!(context.filters(), context.pip_compile()
4324+
.arg("requirements.in")
4325+
.arg("--no-header"), @"
4326+
success: true
4327+
exit_code: 0
4328+
----- stdout -----
4329+
4330+
----- stderr -----
4331+
Resolved in [TIME]
4332+
");
4333+
4334+
Ok(())
4335+
}
4336+
43094337
/// Black==23.10.1 depends on tomli>=1.1.0 for Python versions below 3.11. Demonstrate that we can
43104338
/// override it with a multi-line override.
43114339
#[test]

crates/uv/tests/it/pip_install.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8136,27 +8136,27 @@ fn install_with_overrides_from_stdin() -> Result<()> {
81368136
Ok(())
81378137
}
81388138

8139-
/// Install with excludes from stdin.
8139+
/// Install with a direct exclusion from stdin.
81408140
#[test]
81418141
#[expect(clippy::disallowed_types)]
81428142
fn install_with_excludes_from_stdin() -> Result<()> {
81438143
let context = uv_test::test_context!("3.12");
81448144

81458145
let excludes_txt = context.temp_dir.child("excludes.txt");
8146-
excludes_txt.write_str("anyio>4.0.0")?;
8146+
excludes_txt.write_str("anyio")?;
81478147

81488148
uv_snapshot!(context.pip_install()
81498149
.arg("anyio==4.0.1")
81508150
.arg("--exclude")
81518151
.arg("-")
81528152
.stdin(std::fs::File::open(excludes_txt)?), @"
8153-
success: false
8154-
exit_code: 1
8153+
success: true
8154+
exit_code: 0
81558155
----- stdout -----
81568156
81578157
----- stderr -----
8158-
× No solution found when resolving dependencies:
8159-
╰─▶ Because there is no version of anyio==4.0.1 and you require anyio==4.0.1, we can conclude that your requirements are unsatisfiable.
8158+
Resolved in [TIME]
8159+
Checked in [TIME]
81608160
"
81618161
);
81628162

0 commit comments

Comments
 (0)