Skip to content

Commit 3774a65

Browse files
Use parsed URLs for conflicting URL error message (#14380)
## Summary There's a good example of the downside of using verbatim URLs here: #14197 (comment) (we show two relative paths that point to the same directory, but it's not clear from the error message). The diff: ``` 2 2 │ ----- stdout ----- 3 3 │ 4 4 │ ----- stderr ----- 5 5 │ error: Requirements contain conflicting URLs for package `library` in all marker environments: 6 │-- ../../library 7 │-- ./library 6 │+- file://[TEMP_DIR]/library 7 │+- file://[TEMP_DIR]/library (editable) ```
1 parent b1812d1 commit 3774a65

File tree

6 files changed

+23
-19
lines changed

6 files changed

+23
-19
lines changed

crates/uv-resolver/src/error.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ use uv_normalize::{ExtraName, InvalidNameError, PackageName};
1717
use uv_pep440::{LocalVersionSlice, LowerBound, Version, VersionSpecifier};
1818
use uv_pep508::{MarkerEnvironment, MarkerExpression, MarkerTree, MarkerValueVersion};
1919
use uv_platform_tags::Tags;
20+
use uv_pypi_types::ParsedUrl;
21+
use uv_redacted::DisplaySafeUrl;
2022
use uv_static::EnvVars;
2123

2224
use crate::candidate_selector::CandidateSelector;
@@ -56,11 +58,14 @@ pub enum ResolveError {
5658
} else {
5759
format!(" in {env}")
5860
},
59-
urls.join("\n- "),
61+
urls.iter()
62+
.map(|url| format!("{}{}", DisplaySafeUrl::from(url.clone()), if url.is_editable() { " (editable)" } else { "" }))
63+
.collect::<Vec<_>>()
64+
.join("\n- ")
6065
)]
6166
ConflictingUrls {
6267
package_name: PackageName,
63-
urls: Vec<String>,
68+
urls: Vec<ParsedUrl>,
6469
env: ResolverEnvironment,
6570
},
6671

@@ -71,11 +76,14 @@ pub enum ResolveError {
7176
} else {
7277
format!(" in {env}")
7378
},
74-
indexes.join("\n- "),
79+
indexes.iter()
80+
.map(std::string::ToString::to_string)
81+
.collect::<Vec<_>>()
82+
.join("\n- ")
7583
)]
7684
ConflictingIndexesForEnvironment {
7785
package_name: PackageName,
78-
indexes: Vec<String>,
86+
indexes: Vec<IndexUrl>,
7987
env: ResolverEnvironment,
8088
},
8189

crates/uv-resolver/src/fork_indexes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ impl ForkIndexes {
2424
) -> Result<(), ResolveError> {
2525
if let Some(previous) = self.0.insert(package_name.clone(), index.clone()) {
2626
if &previous != index {
27-
let mut conflicts = vec![previous.url.to_string(), index.url.to_string()];
27+
let mut conflicts = vec![previous.url, index.url.clone()];
2828
conflicts.sort();
2929
return Err(ResolveError::ConflictingIndexesForEnvironment {
3030
package_name: package_name.clone(),

crates/uv-resolver/src/fork_urls.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::collections::hash_map::Entry;
22

33
use rustc_hash::FxHashMap;
44

5-
use uv_distribution_types::Verbatim;
65
use uv_normalize::PackageName;
76
use uv_pypi_types::VerbatimParsedUrl;
87

@@ -34,10 +33,8 @@ impl ForkUrls {
3433
match self.0.entry(package_name.clone()) {
3534
Entry::Occupied(previous) => {
3635
if previous.get() != url {
37-
let mut conflicting_url = vec![
38-
previous.get().verbatim.verbatim().to_string(),
39-
url.verbatim.verbatim().to_string(),
40-
];
36+
let mut conflicting_url =
37+
vec![previous.get().parsed_url.clone(), url.parsed_url.clone()];
4138
conflicting_url.sort();
4239
return Err(ResolveError::ConflictingUrls {
4340
package_name: package_name.clone(),

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use same_file::is_same_file;
44
use tracing::debug;
55

66
use uv_cache_key::CanonicalUrl;
7-
use uv_distribution_types::Verbatim;
87
use uv_git::GitResolver;
98
use uv_normalize::PackageName;
109
use uv_pep508::{MarkerTree, VerbatimUrl};
@@ -170,8 +169,8 @@ impl Urls {
170169
let [allowed_url] = matching_urls.as_slice() else {
171170
let mut conflicting_urls: Vec<_> = matching_urls
172171
.into_iter()
173-
.map(|parsed_url| parsed_url.verbatim.verbatim().to_string())
174-
.chain(std::iter::once(verbatim_url.verbatim().to_string()))
172+
.map(|parsed_url| parsed_url.parsed_url.clone())
173+
.chain(std::iter::once(parsed_url.clone()))
175174
.collect();
176175
conflicting_urls.sort();
177176
return Err(ResolveError::ConflictingUrls {

crates/uv/tests/it/pip_compile.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,16 +2909,16 @@ fn incompatible_narrowed_url_dependency() -> Result<()> {
29092909
"})?;
29102910

29112911
uv_snapshot!(context.filters(), context.pip_compile()
2912-
.arg("requirements.in"), @r###"
2912+
.arg("requirements.in"), @r"
29132913
success: false
29142914
exit_code: 2
29152915
----- stdout -----
29162916

29172917
----- stderr -----
29182918
error: Requirements contain conflicting URLs for package `uv-public-pypackage`:
2919-
- git+https://github.com/astral-test/uv-public-pypackage@b270df1a2fb5d012294e9aaf05e7e0bab1e6a389
29202919
- git+https://github.com/astral-test/uv-public-pypackage@test-branch
2921-
"###
2920+
- git+https://github.com/astral-test/uv-public-pypackage@b270df1a2fb5d012294e9aaf05e7e0bab1e6a389
2921+
"
29222922
);
29232923

29242924
Ok(())

crates/uv/tests/it/pip_install.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,16 +1515,16 @@ fn install_editable_incompatible_constraint_url() -> Result<()> {
15151515
.arg("-e")
15161516
.arg(context.workspace_root.join("scripts/packages/black_editable"))
15171517
.arg("--constraint")
1518-
.arg("constraints.txt"), @r###"
1518+
.arg("constraints.txt"), @r"
15191519
success: false
15201520
exit_code: 2
15211521
----- stdout -----
15221522
15231523
----- stderr -----
15241524
error: Requirements contain conflicting URLs for package `black`:
1525-
- [WORKSPACE]/scripts/packages/black_editable
1525+
- file://[WORKSPACE]/scripts/packages/black_editable (editable)
15261526
- https://files.pythonhosted.org/packages/0f/89/294c9a6b6c75a08da55e9d05321d0707e9418735e3062b12ef0f54c33474/black-24.4.2-py3-none-any.whl
1527-
"###
1527+
"
15281528
);
15291529

15301530
Ok(())

0 commit comments

Comments
 (0)