Skip to content

Commit 1652844

Browse files
Don't expect pinned packages for editables with non-existent extras (#1847)
Closes #1787.
1 parent d80eee1 commit 1652844

File tree

2 files changed

+47
-14
lines changed

2 files changed

+47
-14
lines changed

crates/uv-resolver/src/resolution.rs

+6-14
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,10 @@ impl ResolutionGraph {
130130
// Validate that the `extra` exists.
131131
let dist = PubGrubDistribution::from_registry(package_name, version);
132132

133-
if let Some((_, metadata)) = editables.get(package_name) {
133+
if let Some((editable, metadata)) = editables.get(package_name) {
134134
if !metadata.provides_extras.contains(extra) {
135-
let pinned_package = pins
136-
.get(package_name, version)
137-
.unwrap_or_else(|| {
138-
panic!("Every package should be pinned: {package_name:?}")
139-
})
140-
.clone();
135+
let pinned_package =
136+
Dist::from_editable(package_name.clone(), editable.clone())?;
141137

142138
diagnostics.push(Diagnostic::MissingExtra {
143139
dist: pinned_package,
@@ -171,14 +167,10 @@ impl ResolutionGraph {
171167
// Validate that the `extra` exists.
172168
let dist = PubGrubDistribution::from_url(package_name, url);
173169

174-
if let Some((_, metadata)) = editables.get(package_name) {
170+
if let Some((editable, metadata)) = editables.get(package_name) {
175171
if !metadata.provides_extras.contains(extra) {
176-
let pinned_package = pins
177-
.get(package_name, version)
178-
.unwrap_or_else(|| {
179-
panic!("Every package should be pinned: {package_name:?}")
180-
})
181-
.clone();
172+
let pinned_package =
173+
Dist::from_editable(package_name.clone(), editable.clone())?;
182174

183175
diagnostics.push(Diagnostic::MissingExtra {
184176
dist: pinned_package,

crates/uv/tests/pip_compile.rs

+41
Original file line numberDiff line numberDiff line change
@@ -3969,6 +3969,47 @@ fn no_deps_invalid_extra() -> Result<()> {
39693969
Ok(())
39703970
}
39713971

3972+
/// Resolve an editable package with an invalid extra.
3973+
#[test]
3974+
fn editable_invalid_extra() -> Result<()> {
3975+
let context = TestContext::new("3.12");
3976+
let requirements_in = context.temp_dir.child("requirements.in");
3977+
requirements_in.write_str("-e ../../scripts/editable-installs/black_editable[empty]")?;
3978+
3979+
let requirements_path = regex::escape(&requirements_in.normalized_display().to_string());
3980+
let filters: Vec<_> = [
3981+
(r" file://.*/", " file://[TEMP_DIR]/"),
3982+
(requirements_path.as_str(), "requirements.in"),
3983+
]
3984+
.into_iter()
3985+
.chain(INSTA_FILTERS.to_vec())
3986+
.collect();
3987+
3988+
uv_snapshot!(filters, Command::new(get_bin())
3989+
.arg("pip")
3990+
.arg("compile")
3991+
.arg(requirements_in.path())
3992+
.arg("--cache-dir")
3993+
.arg(context.cache_dir.path())
3994+
.arg("--exclude-newer")
3995+
.arg(EXCLUDE_NEWER)
3996+
.env("VIRTUAL_ENV", context.venv.as_os_str()), @r###"
3997+
success: true
3998+
exit_code: 0
3999+
----- stdout -----
4000+
# This file was autogenerated by uv via the following command:
4001+
# uv pip compile requirements.in --cache-dir [CACHE_DIR] --exclude-newer 2023-11-18T12:00:00Z
4002+
-e ../../scripts/editable-installs/black_editable
4003+
4004+
----- stderr -----
4005+
Built 1 editable in [TIME]
4006+
Resolved 1 package in [TIME]
4007+
warning: The package `black @ file://[TEMP_DIR]/black_editable` does not have an extra named `empty`.
4008+
"###);
4009+
4010+
Ok(())
4011+
}
4012+
39724013
/// Resolve a package from a `requirements.in` file, with a `constraints.txt` file pinning one of
39734014
/// its transitive dependencies to a specific version.
39744015
#[test]

0 commit comments

Comments
 (0)