Skip to content

Commit dc766f7

Browse files
committed
Use rich diagnostic formatting for early build failures
1 parent 5187f33 commit dc766f7

File tree

11 files changed

+232
-125
lines changed

11 files changed

+232
-125
lines changed

crates/uv/src/commands/pip/compile.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,17 @@ pub(crate) async fn pip_compile(
418418
diagnostics::build(dist, err);
419419
return Ok(ExitStatus::Failure);
420420
}
421+
Err(operations::Error::Requirements(uv_requirements::Error::DownloadAndBuild(
422+
dist,
423+
err,
424+
))) => {
425+
diagnostics::fetch_and_build(dist, err);
426+
return Ok(ExitStatus::Failure);
427+
}
428+
Err(operations::Error::Requirements(uv_requirements::Error::Build(dist, err))) => {
429+
diagnostics::build(dist, err);
430+
return Ok(ExitStatus::Failure);
431+
}
421432
Err(err) => return Err(err.into()),
422433
};
423434

crates/uv/src/commands/pip/install.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,17 @@ pub(crate) async fn pip_install(
424424
diagnostics::build(dist, err);
425425
return Ok(ExitStatus::Failure);
426426
}
427+
Err(operations::Error::Requirements(uv_requirements::Error::DownloadAndBuild(
428+
dist,
429+
err,
430+
))) => {
431+
diagnostics::fetch_and_build(dist, err);
432+
return Ok(ExitStatus::Failure);
433+
}
434+
Err(operations::Error::Requirements(uv_requirements::Error::Build(dist, err))) => {
435+
diagnostics::build(dist, err);
436+
return Ok(ExitStatus::Failure);
437+
}
427438
Err(err) => return Err(err.into()),
428439
};
429440

crates/uv/src/commands/pip/sync.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,17 @@ pub(crate) async fn pip_sync(
368368
diagnostics::build(dist, err);
369369
return Ok(ExitStatus::Failure);
370370
}
371+
Err(operations::Error::Requirements(uv_requirements::Error::DownloadAndBuild(
372+
dist,
373+
err,
374+
))) => {
375+
diagnostics::fetch_and_build(dist, err);
376+
return Ok(ExitStatus::Failure);
377+
}
378+
Err(operations::Error::Requirements(uv_requirements::Error::Build(dist, err))) => {
379+
diagnostics::build(dist, err);
380+
return Ok(ExitStatus::Failure);
381+
}
371382
Err(err) => return Err(err.into()),
372383
};
373384

crates/uv/src/commands/project/add.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,18 @@ pub(crate) async fn add(
691691
diagnostics::build(dist, err);
692692
Ok(ExitStatus::Failure)
693693
}
694+
ProjectError::Operation(pip::operations::Error::Requirements(
695+
uv_requirements::Error::DownloadAndBuild(dist, err),
696+
)) => {
697+
diagnostics::fetch_and_build(dist, err);
698+
Ok(ExitStatus::Failure)
699+
}
700+
ProjectError::Operation(pip::operations::Error::Requirements(
701+
uv_requirements::Error::Build(dist, err),
702+
)) => {
703+
diagnostics::build(dist, err);
704+
Ok(ExitStatus::Failure)
705+
}
694706
err => {
695707
// Revert the changes to the `pyproject.toml`, if necessary.
696708
if modified {

crates/uv/src/commands/project/export.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,18 @@ pub(crate) async fn export(
160160
diagnostics::build(dist, err);
161161
return Ok(ExitStatus::Failure);
162162
}
163+
Err(ProjectError::Operation(pip::operations::Error::Requirements(
164+
uv_requirements::Error::DownloadAndBuild(dist, err),
165+
))) => {
166+
diagnostics::fetch_and_build(dist, err);
167+
return Ok(ExitStatus::Failure);
168+
}
169+
Err(ProjectError::Operation(pip::operations::Error::Requirements(
170+
uv_requirements::Error::Build(dist, err),
171+
))) => {
172+
diagnostics::build(dist, err);
173+
return Ok(ExitStatus::Failure);
174+
}
163175
Err(err) => return Err(err.into()),
164176
};
165177

crates/uv/src/commands/project/lock.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,18 @@ pub(crate) async fn lock(
181181
diagnostics::build(dist, err);
182182
Ok(ExitStatus::Failure)
183183
}
184-
184+
Err(ProjectError::Operation(pip::operations::Error::Requirements(
185+
uv_requirements::Error::DownloadAndBuild(dist, err),
186+
))) => {
187+
diagnostics::fetch_and_build(dist, err);
188+
Ok(ExitStatus::Failure)
189+
}
190+
Err(ProjectError::Operation(pip::operations::Error::Requirements(
191+
uv_requirements::Error::Build(dist, err),
192+
))) => {
193+
diagnostics::build(dist, err);
194+
Ok(ExitStatus::Failure)
195+
}
185196
Err(err) => Err(err.into()),
186197
}
187198
}

crates/uv/src/commands/project/run.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,18 @@ pub(crate) async fn run(
317317
diagnostics::build(dist, err);
318318
return Ok(ExitStatus::Failure);
319319
}
320+
Err(ProjectError::Operation(operations::Error::Requirements(
321+
uv_requirements::Error::DownloadAndBuild(dist, err),
322+
))) => {
323+
diagnostics::fetch_and_build(dist, err);
324+
return Ok(ExitStatus::Failure);
325+
}
326+
Err(ProjectError::Operation(operations::Error::Requirements(
327+
uv_requirements::Error::Build(dist, err),
328+
))) => {
329+
diagnostics::build(dist, err);
330+
return Ok(ExitStatus::Failure);
331+
}
320332
Err(err) => return Err(err.into()),
321333
};
322334

@@ -646,6 +658,18 @@ pub(crate) async fn run(
646658
diagnostics::build(dist, err);
647659
return Ok(ExitStatus::Failure);
648660
}
661+
Err(ProjectError::Operation(operations::Error::Requirements(
662+
uv_requirements::Error::DownloadAndBuild(dist, err),
663+
))) => {
664+
diagnostics::fetch_and_build(dist, err);
665+
return Ok(ExitStatus::Failure);
666+
}
667+
Err(ProjectError::Operation(operations::Error::Requirements(
668+
uv_requirements::Error::Build(dist, err),
669+
))) => {
670+
diagnostics::build(dist, err);
671+
return Ok(ExitStatus::Failure);
672+
}
649673
Err(err) => return Err(err.into()),
650674
};
651675

@@ -849,6 +873,18 @@ pub(crate) async fn run(
849873
diagnostics::build(dist, err);
850874
return Ok(ExitStatus::Failure);
851875
}
876+
Err(ProjectError::Operation(operations::Error::Requirements(
877+
uv_requirements::Error::DownloadAndBuild(dist, err),
878+
))) => {
879+
diagnostics::fetch_and_build(dist, err);
880+
return Ok(ExitStatus::Failure);
881+
}
882+
Err(ProjectError::Operation(operations::Error::Requirements(
883+
uv_requirements::Error::Build(dist, err),
884+
))) => {
885+
diagnostics::build(dist, err);
886+
return Ok(ExitStatus::Failure);
887+
}
852888
Err(ProjectError::Operation(operations::Error::Requirements(err))) => {
853889
let err = miette::Report::msg(format!("{err}"))
854890
.context("Invalid `--with` requirement");

crates/uv/src/commands/project/sync.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ pub(crate) async fn sync(
172172
diagnostics::build(dist, err);
173173
return Ok(ExitStatus::Failure);
174174
}
175+
Err(ProjectError::Operation(operations::Error::Requirements(
176+
uv_requirements::Error::DownloadAndBuild(dist, err),
177+
))) => {
178+
diagnostics::fetch_and_build(dist, err);
179+
return Ok(ExitStatus::Failure);
180+
}
181+
Err(ProjectError::Operation(operations::Error::Requirements(
182+
uv_requirements::Error::Build(dist, err),
183+
))) => {
184+
diagnostics::build(dist, err);
185+
return Ok(ExitStatus::Failure);
186+
}
175187
Err(err) => return Err(err.into()),
176188
};
177189

crates/uv/tests/it/lock.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15666,20 +15666,19 @@ fn lock_invalid_project_table() -> Result<()> {
1566615666

1566715667
uv_snapshot!(context.filters(), context.lock().current_dir(context.temp_dir.join("a")), @r###"
1566815668
success: false
15669-
exit_code: 2
15669+
exit_code: 1
1567015670
----- stdout -----
1567115671

1567215672
----- stderr -----
1567315673
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
15674-
error: Failed to build `b @ file://[TEMP_DIR]/b`
15675-
Caused by: Failed to extract static metadata from `pyproject.toml`
15676-
Caused by: `pyproject.toml` is using the `[project]` table, but the required `project.name` field is not set.
15677-
Caused by: TOML parse error at line 2, column 10
15678-
|
15679-
2 | [project.urls]
15680-
| ^^^^^^^
15681-
missing field `name`
15682-
15674+
× Failed to build `b @ file://[TEMP_DIR]/b`
15675+
├─▶ Failed to extract static metadata from `pyproject.toml`
15676+
├─▶ `pyproject.toml` is using the `[project]` table, but the required `project.name` field is not set.
15677+
╰─▶ TOML parse error at line 2, column 10
15678+
|
15679+
2 | [project.urls]
15680+
| ^^^^^^^
15681+
missing field `name`
1568315682
"###);
1568415683

1568515684
Ok(())

crates/uv/tests/it/pip_compile.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,12 +1871,12 @@ fn compile_git_mismatched_name() -> Result<()> {
18711871
uv_snapshot!(context.filters(), context.pip_compile()
18721872
.arg("requirements.in"), @r###"
18731873
success: false
1874-
exit_code: 2
1874+
exit_code: 1
18751875
----- stdout -----
18761876
18771877
----- stderr -----
1878-
error: Failed to download and build `dask @ git+https://github.com/pallets/[email protected]`
1879-
Caused by: Package metadata name `flask` does not match given name `dask`
1878+
× Failed to download and build `dask @ git+https://github.com/pallets/[email protected]`
1879+
╰─▶ Package metadata name `flask` does not match given name `dask`
18801880
"###
18811881
);
18821882

@@ -12017,18 +12017,17 @@ fn git_source_missing_tag() -> Result<()> {
1201712017
uv_snapshot!(filters, context.pip_compile()
1201812018
.arg("pyproject.toml"), @r###"
1201912019
success: false
12020-
exit_code: 2
12020+
exit_code: 1
1202112021
----- stdout -----
1202212022
1202312023
----- stderr -----
12024-
error: Failed to download and build `uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@missing`
12025-
Caused by: Git operation failed
12026-
Caused by: failed to clone into: [CACHE_DIR]/git-v0/db/8dab139913c4b566
12027-
Caused by: failed to fetch tag `missing`
12028-
Caused by: process didn't exit successfully: `git fetch --force --update-head-ok 'https://github.com/astral-test/uv-public-pypackage' '+refs/tags/missing:refs/remotes/origin/tags/missing'` (exit status: 128)
12029-
--- stderr
12030-
fatal: couldn't find remote ref refs/tags/missing
12031-
12024+
× Failed to download and build `uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@missing`
12025+
├─▶ Git operation failed
12026+
├─▶ failed to clone into: [CACHE_DIR]/git-v0/db/8dab139913c4b566
12027+
├─▶ failed to fetch tag `missing`
12028+
╰─▶ process didn't exit successfully: `git fetch --force --update-head-ok 'https://github.com/astral-test/uv-public-pypackage' '+refs/tags/missing:refs/remotes/origin/tags/missing'` (exit status: 128)
12029+
--- stderr
12030+
fatal: couldn't find remote ref refs/tags/missing
1203212031
"###);
1203312032

1203412033
Ok(())

0 commit comments

Comments
 (0)