Skip to content

Commit

Permalink
Use rich diagnostic formatting for early build failures (#9041)
Browse files Browse the repository at this point in the history
## Summary

This addresses cases like URL distributions, which are built before we
get to the resolver.
  • Loading branch information
charliermarsh authored Nov 12, 2024
1 parent 052b4e7 commit a147ed0
Show file tree
Hide file tree
Showing 11 changed files with 232 additions and 125 deletions.
11 changes: 11 additions & 0 deletions crates/uv/src/commands/pip/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,17 @@ pub(crate) async fn pip_compile(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Requirements(uv_requirements::Error::DownloadAndBuild(
dist,
err,
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Requirements(uv_requirements::Error::Build(dist, err))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down
11 changes: 11 additions & 0 deletions crates/uv/src/commands/pip/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,17 @@ pub(crate) async fn pip_install(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Requirements(uv_requirements::Error::DownloadAndBuild(
dist,
err,
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Requirements(uv_requirements::Error::Build(dist, err))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down
11 changes: 11 additions & 0 deletions crates/uv/src/commands/pip/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,17 @@ pub(crate) async fn pip_sync(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Requirements(uv_requirements::Error::DownloadAndBuild(
dist,
err,
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Requirements(uv_requirements::Error::Build(dist, err))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down
12 changes: 12 additions & 0 deletions crates/uv/src/commands/project/add.rs
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,18 @@ pub(crate) async fn add(
diagnostics::build(dist, err);
Ok(ExitStatus::Failure)
}
ProjectError::Operation(pip::operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
)) => {
diagnostics::fetch_and_build(dist, err);
Ok(ExitStatus::Failure)
}
ProjectError::Operation(pip::operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
)) => {
diagnostics::build(dist, err);
Ok(ExitStatus::Failure)
}
err => {
// Revert the changes to the `pyproject.toml`, if necessary.
if modified {
Expand Down
12 changes: 12 additions & 0 deletions crates/uv/src/commands/project/export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,18 @@ pub(crate) async fn export(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(pip::operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(pip::operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down
13 changes: 12 additions & 1 deletion crates/uv/src/commands/project/lock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,18 @@ pub(crate) async fn lock(
diagnostics::build(dist, err);
Ok(ExitStatus::Failure)
}

Err(ProjectError::Operation(pip::operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::fetch_and_build(dist, err);
Ok(ExitStatus::Failure)
}
Err(ProjectError::Operation(pip::operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
))) => {
diagnostics::build(dist, err);
Ok(ExitStatus::Failure)
}
Err(err) => Err(err.into()),
}
}
Expand Down
36 changes: 36 additions & 0 deletions crates/uv/src/commands/project/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,18 @@ pub(crate) async fn run(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down Expand Up @@ -646,6 +658,18 @@ pub(crate) async fn run(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down Expand Up @@ -849,6 +873,18 @@ pub(crate) async fn run(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(err))) => {
let err = miette::Report::msg(format!("{err}"))
.context("Invalid `--with` requirement");
Expand Down
12 changes: 12 additions & 0 deletions crates/uv/src/commands/project/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,18 @@ pub(crate) async fn sync(
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::fetch_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
};

Expand Down
19 changes: 9 additions & 10 deletions crates/uv/tests/it/lock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15666,20 +15666,19 @@ fn lock_invalid_project_table() -> Result<()> {

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

----- stderr -----
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
error: Failed to build `b @ file://[TEMP_DIR]/b`
Caused by: Failed to extract static metadata from `pyproject.toml`
Caused by: `pyproject.toml` is using the `[project]` table, but the required `project.name` field is not set.
Caused by: TOML parse error at line 2, column 10
|
2 | [project.urls]
| ^^^^^^^
missing field `name`

× Failed to build `b @ file://[TEMP_DIR]/b`
├─▶ Failed to extract static metadata from `pyproject.toml`
├─▶ `pyproject.toml` is using the `[project]` table, but the required `project.name` field is not set.
╰─▶ TOML parse error at line 2, column 10
|
2 | [project.urls]
| ^^^^^^^
missing field `name`
"###);

Ok(())
Expand Down
23 changes: 11 additions & 12 deletions crates/uv/tests/it/pip_compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1871,12 +1871,12 @@ fn compile_git_mismatched_name() -> Result<()> {
uv_snapshot!(context.filters(), context.pip_compile()
.arg("requirements.in"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
error: Failed to download and build `dask @ git+https://github.com/pallets/[email protected]`
Caused by: Package metadata name `flask` does not match given name `dask`
× Failed to download and build `dask @ git+https://github.com/pallets/[email protected]`
╰─▶ Package metadata name `flask` does not match given name `dask`
"###
);

Expand Down Expand Up @@ -12017,18 +12017,17 @@ fn git_source_missing_tag() -> Result<()> {
uv_snapshot!(filters, context.pip_compile()
.arg("pyproject.toml"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
error: Failed to download and build `uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@missing`
Caused by: Git operation failed
Caused by: failed to clone into: [CACHE_DIR]/git-v0/db/8dab139913c4b566
Caused by: failed to fetch tag `missing`
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)
--- stderr
fatal: couldn't find remote ref refs/tags/missing
× Failed to download and build `uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@missing`
├─▶ Git operation failed
├─▶ failed to clone into: [CACHE_DIR]/git-v0/db/8dab139913c4b566
├─▶ failed to fetch tag `missing`
╰─▶ 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)
--- stderr
fatal: couldn't find remote ref refs/tags/missing
"###);

Ok(())
Expand Down
Loading

0 comments on commit a147ed0

Please sign in to comment.