Use rich diagnostic formatting for install failures (#9043)

## Summary

Shows similar diagnostics for failures that happen at install time,
rather than resolve time. This will ultimately feed into
https://github.com/astral-sh/uv/issues/8962 since we'll now have
consolidated handling for these kinds of failures.
This commit is contained in:
Charlie Marsh 2024-11-11 22:54:30 -05:00 committed by GitHub
parent 00bf69be28
commit c5caf92edf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 447 additions and 302 deletions

View File

@ -275,10 +275,7 @@ impl<'a> BuildContext for BuildDispatch<'a> {
remote.iter().map(ToString::to_string).join(", ")
);
preparer
.prepare(remote, self.in_flight)
.await
.context("Failed to prepare distributions")?
preparer.prepare(remote, self.in_flight).await?
};
// Remove any unnecessary packages.

View File

@ -1,7 +1,7 @@
pub use compile::{compile_tree, CompileError};
pub use installer::{Installer, Reporter as InstallReporter};
pub use plan::{Plan, Planner};
pub use preparer::{Preparer, Reporter as PrepareReporter};
pub use preparer::{Error as PrepareError, Preparer, Reporter as PrepareReporter};
pub use site_packages::{SatisfiesResult, SitePackages, SitePackagesDiagnostic};
pub use uninstall::{uninstall, UninstallError};

View File

@ -23,11 +23,11 @@ pub enum Error {
#[error("Using pre-built wheels is disabled, but attempted to use `{0}`")]
NoBinary(PackageName),
#[error("Failed to download `{0}`")]
Download(Box<BuiltDist>, #[source] Box<uv_distribution::Error>),
Download(Box<BuiltDist>, #[source] uv_distribution::Error),
#[error("Failed to download and build `{0}`")]
DownloadAndBuild(Box<SourceDist>, #[source] Box<uv_distribution::Error>),
DownloadAndBuild(Box<SourceDist>, #[source] uv_distribution::Error),
#[error("Failed to build `{0}`")]
Build(Box<SourceDist>, #[source] Box<uv_distribution::Error>),
Build(Box<SourceDist>, #[source] uv_distribution::Error),
#[error("Unzip failed in another thread: {0}")]
Thread(String),
}
@ -146,12 +146,12 @@ impl<'a, Context: BuildContext> Preparer<'a, Context> {
.get_or_build_wheel(&dist, self.tags, policy)
.boxed_local()
.map_err(|err| match dist.clone() {
Dist::Built(dist) => Error::Download(Box::new(dist), Box::new(err)),
Dist::Built(dist) => Error::Download(Box::new(dist), err),
Dist::Source(dist) => {
if dist.is_local() {
Error::Build(Box::new(dist), Box::new(err))
Error::Build(Box::new(dist), err)
} else {
Error::DownloadAndBuild(Box::new(dist), Box::new(err))
Error::DownloadAndBuild(Box::new(dist), err)
}
}
})
@ -166,12 +166,12 @@ impl<'a, Context: BuildContext> Preparer<'a, Context> {
wheel.hashes(),
);
Err(match dist {
Dist::Built(dist) => Error::Download(Box::new(dist), Box::new(err)),
Dist::Built(dist) => Error::Download(Box::new(dist), err),
Dist::Source(dist) => {
if dist.is_local() {
Error::Build(Box::new(dist), Box::new(err))
Error::Build(Box::new(dist), err)
} else {
Error::DownloadAndBuild(Box::new(dist), Box::new(err))
Error::DownloadAndBuild(Box::new(dist), err)
}
}
})

View File

@ -2,7 +2,7 @@ use owo_colors::OwoColorize;
use rustc_hash::FxHashMap;
use std::str::FromStr;
use std::sync::LazyLock;
use uv_distribution_types::{Name, SourceDist};
use uv_distribution_types::{BuiltDist, Name, SourceDist};
use uv_normalize::PackageName;
/// Static map of common package name typos or misconfigurations to their correct package names.
@ -48,6 +48,34 @@ pub(crate) fn download_and_build(sdist: Box<SourceDist>, cause: uv_distribution:
anstream::eprint!("{report:?}");
}
/// Render a remote binary distribution download failure with a help message.
pub(crate) fn download(sdist: Box<BuiltDist>, cause: uv_distribution::Error) {
#[derive(Debug, miette::Diagnostic, thiserror::Error)]
#[error("Failed to download `{sdist}`")]
#[diagnostic()]
struct Error {
sdist: Box<BuiltDist>,
#[source]
cause: uv_distribution::Error,
#[help]
help: Option<String>,
}
let report = miette::Report::new(Error {
help: SUGGESTIONS.get(sdist.name()).map(|suggestion| {
format!(
"`{}` is often confused for `{}` Did you mean to install `{}` instead?",
sdist.name().cyan(),
suggestion.cyan(),
suggestion.cyan(),
)
}),
sdist,
cause,
});
anstream::eprint!("{report:?}");
}
/// Render a local source distribution build failure with a help message.
pub(crate) fn build(sdist: Box<SourceDist>, cause: uv_distribution::Error) {
#[derive(Debug, miette::Diagnostic, thiserror::Error)]

View File

@ -439,7 +439,7 @@ pub(crate) async fn pip_install(
};
// Sync the environment.
operations::install(
match operations::install(
&resolution,
site_packages,
modifications,
@ -461,7 +461,26 @@ pub(crate) async fn pip_install(
dry_run,
printer,
)
.await?;
.await
{
Ok(_) => {}
Err(operations::Error::Prepare(uv_installer::PrepareError::Build(dist, err))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Prepare(uv_installer::PrepareError::DownloadAndBuild(
dist,
err,
))) => {
diagnostics::download_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Prepare(uv_installer::PrepareError::Download(dist, err))) => {
diagnostics::download(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
}
// Notify the user of any resolution diagnostics.
operations::diagnose_resolution(resolution.diagnostics(), printer)?;

View File

@ -457,10 +457,7 @@ pub(crate) async fn install(
)
.with_reporter(PrepareReporter::from(printer).with_length(remote.len() as u64));
let wheels = preparer
.prepare(remote.clone(), in_flight)
.await
.context("Failed to prepare distributions")?;
let wheels = preparer.prepare(remote.clone(), in_flight).await?;
logger.on_prepare(wheels.len(), start, printer)?;
@ -751,6 +748,9 @@ pub(crate) fn diagnose_environment(
#[derive(thiserror::Error, Debug)]
pub(crate) enum Error {
#[error("Failed to prepare distributions")]
Prepare(#[from] uv_installer::PrepareError),
#[error(transparent)]
Resolve(#[from] uv_resolver::ResolveError),

View File

@ -383,7 +383,7 @@ pub(crate) async fn pip_sync(
};
// Sync the environment.
operations::install(
match operations::install(
&resolution,
site_packages,
Modifications::Exact,
@ -405,7 +405,26 @@ pub(crate) async fn pip_sync(
dry_run,
printer,
)
.await?;
.await
{
Ok(_) => {}
Err(operations::Error::Prepare(uv_installer::PrepareError::Build(dist, err))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Prepare(uv_installer::PrepareError::DownloadAndBuild(
dist,
err,
))) => {
diagnostics::download_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(operations::Error::Prepare(uv_installer::PrepareError::Download(dist, err))) => {
diagnostics::download(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
}
// Notify the user of any resolution diagnostics.
operations::diagnose_resolution(resolution.diagnostics(), printer)?;

View File

@ -716,6 +716,24 @@ pub(crate) async fn add(
diagnostics::build(dist, err);
Ok(ExitStatus::Failure)
}
ProjectError::Operation(pip::operations::Error::Prepare(
uv_installer::PrepareError::Build(dist, err),
)) => {
diagnostics::build(dist, err);
Ok(ExitStatus::Failure)
}
ProjectError::Operation(pip::operations::Error::Prepare(
uv_installer::PrepareError::DownloadAndBuild(dist, err),
)) => {
diagnostics::download_and_build(dist, err);
Ok(ExitStatus::Failure)
}
ProjectError::Operation(pip::operations::Error::Prepare(
uv_installer::PrepareError::Download(dist, err),
)) => {
diagnostics::download(dist, err);
Ok(ExitStatus::Failure)
}
err => Err(err.into()),
}
}

View File

@ -21,10 +21,11 @@ use uv_workspace::pyproject_mut::{DependencyTarget, PyProjectTomlMut};
use uv_workspace::{DiscoveryOptions, VirtualProject, Workspace};
use crate::commands::pip::loggers::{DefaultInstallLogger, DefaultResolveLogger};
use crate::commands::pip::operations;
use crate::commands::pip::operations::Modifications;
use crate::commands::project::default_dependency_groups;
use crate::commands::project::lock::LockMode;
use crate::commands::{project, ExitStatus, SharedState};
use crate::commands::project::{default_dependency_groups, ProjectError};
use crate::commands::{diagnostics, project, ExitStatus, SharedState};
use crate::printer::Printer;
use crate::settings::ResolverInstallerSettings;
@ -213,7 +214,7 @@ pub(crate) async fn remove(
let state = SharedState::default();
// Lock and sync the environment, if necessary.
let lock = project::lock::do_safe_lock(
let lock = match project::lock::do_safe_lock(
mode,
project.workspace(),
settings.as_ref().into(),
@ -227,8 +228,41 @@ pub(crate) async fn remove(
cache,
printer,
)
.await?
.into_lock();
.await
{
Ok(result) => result.into_lock(),
Err(ProjectError::Operation(operations::Error::Resolve(
uv_resolver::ResolveError::NoSolution(err),
))) => {
diagnostics::no_solution(&err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Resolve(
uv_resolver::ResolveError::DownloadAndBuild(dist, err),
))) => {
diagnostics::download_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Resolve(
uv_resolver::ResolveError::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Requirements(
uv_requirements::Error::DownloadAndBuild(dist, err),
))) => {
diagnostics::download_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()),
};
if no_sync {
return Ok(ExitStatus::Success);
@ -255,7 +289,7 @@ pub(crate) async fn remove(
},
};
project::sync::do_sync(
match project::sync::do_sync(
target,
&venv,
&extras,
@ -272,7 +306,29 @@ pub(crate) async fn remove(
cache,
printer,
)
.await?;
.await
{
Ok(()) => {}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::DownloadAndBuild(dist, err),
))) => {
diagnostics::download_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::Download(dist, err),
))) => {
diagnostics::download(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
}
Ok(ExitStatus::Success)
}

View File

@ -697,7 +697,7 @@ pub(crate) async fn run(
let install_options = InstallOptions::default();
project::sync::do_sync(
match project::sync::do_sync(
target,
&venv,
&extras,
@ -718,7 +718,29 @@ pub(crate) async fn run(
cache,
printer,
)
.await?;
.await
{
Ok(()) => {}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::DownloadAndBuild(dist, err),
))) => {
diagnostics::download_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::Download(dist, err),
))) => {
diagnostics::download(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
}
lock = Some(result.into_lock());
}

View File

@ -213,7 +213,7 @@ pub(crate) async fn sync(
};
// Perform the sync operation.
do_sync(
match do_sync(
target,
&venv,
&extras,
@ -230,7 +230,29 @@ pub(crate) async fn sync(
cache,
printer,
)
.await?;
.await
{
Ok(()) => {}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::Build(dist, err),
))) => {
diagnostics::build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::DownloadAndBuild(dist, err),
))) => {
diagnostics::download_and_build(dist, err);
return Ok(ExitStatus::Failure);
}
Err(ProjectError::Operation(operations::Error::Prepare(
uv_installer::PrepareError::Download(dist, err),
))) => {
diagnostics::download(dist, err);
return Ok(ExitStatus::Failure);
}
Err(err) => return Err(err.into()),
}
Ok(ExitStatus::Success)
}

View File

@ -1552,7 +1552,6 @@ fn sha() -> Result<()> {
----- stderr -----
Building source distribution...
error: Failed to install requirements from `build-system.requires`
Caused by: Failed to prepare distributions
Caused by: Failed to download `setuptools==68.2.2`
Caused by: Hash mismatch for `setuptools==68.2.2`

View File

@ -5553,27 +5553,26 @@ fn fail_to_add_revert_project() -> Result<()> {
.collect::<Vec<_>>();
uv_snapshot!(filters, context.add().arg("./child"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 3 packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to build `child @ file://[TEMP_DIR]/child`
Caused by: Build backend failed to determine requirements with `build_wheel()` (exit status: 1)
× Failed to build `child @ file://[TEMP_DIR]/child`
Build backend failed to determine requirements with `build_wheel()` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 325, in get_requires_for_build_wheel
return self._get_build_requires(config_settings, requirements=['wheel'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 295, in _get_build_requires
self.run_setup()
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 311, in run_setup
exec(code, locals())
File "<string>", line 1, in <module>
ZeroDivisionError: division by zero
[stderr]
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 325, in get_requires_for_build_wheel
return self._get_build_requires(config_settings, requirements=['wheel'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 295, in _get_build_requires
self.run_setup()
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 311, in run_setup
exec(code, locals())
File "<string>", line 1, in <module>
ZeroDivisionError: division by zero
"###);
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
@ -5661,27 +5660,26 @@ fn fail_to_edit_revert_project() -> Result<()> {
.collect::<Vec<_>>();
uv_snapshot!(filters, context.add().arg("./child"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 3 packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to build `child @ file://[TEMP_DIR]/child`
Caused by: Build backend failed to determine requirements with `build_wheel()` (exit status: 1)
× Failed to build `child @ file://[TEMP_DIR]/child`
Build backend failed to determine requirements with `build_wheel()` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 325, in get_requires_for_build_wheel
return self._get_build_requires(config_settings, requirements=['wheel'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 295, in _get_build_requires
self.run_setup()
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 311, in run_setup
exec(code, locals())
File "<string>", line 1, in <module>
ZeroDivisionError: division by zero
[stderr]
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 325, in get_requires_for_build_wheel
return self._get_build_requires(config_settings, requirements=['wheel'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 295, in _get_build_requires
self.run_setup()
File "[CACHE_DIR]/builds-v0/[TMP]/build_meta.py", line 311, in run_setup
exec(code, locals())
File "<string>", line 1, in <module>
ZeroDivisionError: division by zero
"###);
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;

View File

@ -5549,20 +5549,19 @@ fn lock_invalid_hash() -> Result<()> {
// Install from the lockfile.
uv_snapshot!(context.filters(), context.sync().arg("--frozen").env_remove(EnvVars::UV_EXCLUDE_NEWER), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
error: Failed to prepare distributions
Caused by: Failed to download `idna==3.6`
Caused by: Hash mismatch for `idna==3.6`
× Failed to download `idna==3.6`
Hash mismatch for `idna==3.6`
Expected:
sha256:aecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca
sha256:d05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
Expected:
sha256:aecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca
sha256:d05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
Computed:
sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
Computed:
sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
"###);
Ok(())
@ -6394,27 +6393,25 @@ fn lock_redact_https() -> Result<()> {
// when installing `iniconfig`, rather than when building `foo`.
uv_snapshot!(context.filters(), context.sync().arg("--frozen").arg("--index-url").arg("https://pypi-proxy.fly.dev/basic-auth/simple").arg("--no-install-project"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
error: Failed to prepare distributions
Caused by: Failed to download `iniconfig==2.0.0`
Caused by: Failed to fetch: `https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl`
Caused by: HTTP status client error (401 Unauthorized) for url (https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl)
× Failed to download `iniconfig==2.0.0`
Failed to fetch: `https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl`
HTTP status client error (401 Unauthorized) for url (https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl)
"###);
// Installing from the lockfile should fail without an index.
uv_snapshot!(context.filters(), context.sync().arg("--frozen").arg("--no-install-project"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
error: Failed to prepare distributions
Caused by: Failed to download `iniconfig==2.0.0`
Caused by: Failed to fetch: `https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl`
Caused by: HTTP status client error (401 Unauthorized) for url (https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl)
× Failed to download `iniconfig==2.0.0`
Failed to fetch: `https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl`
HTTP status client error (401 Unauthorized) for url (https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl)
"###);
// Installing from the lockfile should succeed when credentials are included on the command-line.
@ -6447,14 +6444,13 @@ fn lock_redact_https() -> Result<()> {
// Installing without credentials will fail without a cache.
uv_snapshot!(context.filters(), context.sync().arg("--frozen").arg("--reinstall").arg("--no-cache").arg("--no-install-project"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
error: Failed to prepare distributions
Caused by: Failed to download `iniconfig==2.0.0`
Caused by: Failed to fetch: `https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl`
Caused by: HTTP status client error (401 Unauthorized) for url (https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl)
× Failed to download `iniconfig==2.0.0`
Failed to fetch: `https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl`
HTTP status client error (401 Unauthorized) for url (https://pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl)
"###);
// Installing with credentials from with `UV_INDEX_URL` should succeed.

View File

@ -2347,16 +2347,15 @@ fn no_prerelease_hint_source_builds() -> Result<()> {
uv_snapshot!(context.filters(), context.pip_install().arg(".").env(EnvVars::UV_EXCLUDE_NEWER, "2018-10-08"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to build `project @ file://[TEMP_DIR]/`
Caused by: Failed to resolve requirements from `setup.py` build
Caused by: No solution found when resolving: `setuptools>=40.8.0`
Caused by: Because only setuptools<40.8.0 is available and you require setuptools>=40.8.0, we can conclude that your requirements are unsatisfiable.
× Failed to build `project @ file://[TEMP_DIR]/`
Failed to resolve requirements from `setup.py` build
No solution found when resolving: `setuptools>=40.8.0`
Because only setuptools<40.8.0 is available and you require setuptools>=40.8.0, we can conclude that your requirements are unsatisfiable.
"###
);
@ -5741,21 +5740,20 @@ fn require_hashes_mismatch() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 3 packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
sha256:a7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
sha256:a7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);
@ -6226,21 +6224,20 @@ fn verify_hashes_mismatch() -> Result<()> {
.arg("requirements.txt")
.arg("--verify-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 3 packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
sha256:a7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
sha256:a7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);

View File

@ -3565,20 +3565,19 @@ fn require_hashes_wheel_no_binary() -> Result<()> {
.arg(":all:")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download and build `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Computed:
sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
"###
);
@ -3659,20 +3658,19 @@ fn require_hashes_source_only_binary() -> Result<()> {
.arg(":all:")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Expected:
sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);
@ -3692,20 +3690,19 @@ fn require_hashes_wrong_digest() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);
@ -3725,20 +3722,19 @@ fn require_hashes_wrong_algorithm() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha512:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha512:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha512:f30761c1e8725b49c498273b90dba4b05c0fd157811994c806183062cb6647e773364ce45f0e1ff0b10e32fe6d0232ea5ad39476ccf37109d6b49603a09c11c2
Computed:
sha512:f30761c1e8725b49c498273b90dba4b05c0fd157811994c806183062cb6647e773364ce45f0e1ff0b10e32fe6d0232ea5ad39476ccf37109d6b49603a09c11c2
"###
);
@ -3898,20 +3894,19 @@ fn require_hashes_wheel_url() -> Result<()> {
.arg("--reinstall")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Caused by: Hash mismatch for `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
× Failed to download `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Hash mismatch for `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);
@ -3953,20 +3948,19 @@ fn require_hashes_wheel_url_mismatch() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Caused by: Hash mismatch for `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
× Failed to download `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Hash mismatch for `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);
@ -4062,20 +4056,19 @@ fn require_hashes_re_download() -> Result<()> {
.arg("--reinstall")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio==4.0.0`
Caused by: Hash mismatch for `anyio==4.0.0`
× Failed to download `anyio==4.0.0`
Hash mismatch for `anyio==4.0.0`
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha256:afdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
"###
);
@ -4154,20 +4147,19 @@ fn require_hashes_wheel_path_mismatch() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `tqdm @ file://[WORKSPACE]/scripts/links/tqdm-1000.0.0-py3-none-any.whl`
Caused by: Hash mismatch for `tqdm @ file://[WORKSPACE]/scripts/links/tqdm-1000.0.0-py3-none-any.whl`
× Failed to download `tqdm @ file://[WORKSPACE]/scripts/links/tqdm-1000.0.0-py3-none-any.whl`
Hash mismatch for `tqdm @ file://[WORKSPACE]/scripts/links/tqdm-1000.0.0-py3-none-any.whl`
Expected:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Expected:
sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f
Computed:
sha256:a34996d4bd5abb2336e14ff0a2d22b92cfd0f0ed344e6883041ce01953276a13
Computed:
sha256:a34996d4bd5abb2336e14ff0a2d22b92cfd0f0ed344e6883041ce01953276a13
"###
);
@ -4431,20 +4423,19 @@ fn require_hashes_repeated_hash() -> Result<()> {
.arg("--require-hashes")
.arg("--reinstall"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Caused by: Hash mismatch for `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
× Failed to download `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Hash mismatch for `anyio @ https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl`
Expected:
md5:520d85e19168705cdf0223621b18831a
Expected:
md5:520d85e19168705cdf0223621b18831a
Computed:
md5:420d85e19168705cdf0223621b18831a
Computed:
md5:420d85e19168705cdf0223621b18831a
"###
);
@ -4563,20 +4554,19 @@ fn require_hashes_find_links_no_hash() -> Result<()> {
.arg("--find-links")
.arg("https://raw.githubusercontent.com/astral-test/astral-test-hash/main/no-hash/simple-html/example-a-961b4c22/index.html"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:123
Expected:
sha256:123
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
"###
);
@ -4593,20 +4583,19 @@ fn require_hashes_find_links_no_hash() -> Result<()> {
.arg("--find-links")
.arg("https://raw.githubusercontent.com/astral-test/astral-test-hash/main/no-hash/simple-html/example-a-961b4c22/index.html"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:294e788dbe500fdc39e8b88e82652ab67409a1dc9dd06543d0fe0ae31b713eb3
Expected:
sha256:294e788dbe500fdc39e8b88e82652ab67409a1dc9dd06543d0fe0ae31b713eb3
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
"###
);
@ -4684,20 +4673,19 @@ fn require_hashes_find_links_invalid_hash() -> Result<()> {
.arg("--find-links")
.arg("https://raw.githubusercontent.com/astral-test/astral-test-hash/main/invalid-hash/simple-html/example-a-961b4c22/index.html"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:123
Expected:
sha256:123
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
"###
);
@ -4713,20 +4701,19 @@ fn require_hashes_find_links_invalid_hash() -> Result<()> {
.arg("--find-links")
.arg("https://raw.githubusercontent.com/astral-test/astral-test-hash/main/invalid-hash/simple-html/example-a-961b4c22/index.html"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:8838f9d005ff0432b258ba648d9cabb1cbdf06ac29d14f788b02edae544032ea
Expected:
sha256:8838f9d005ff0432b258ba648d9cabb1cbdf06ac29d14f788b02edae544032ea
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
"###
);
@ -4794,21 +4781,20 @@ fn require_hashes_find_links_invalid_hash() -> Result<()> {
.arg("--find-links")
.arg("https://raw.githubusercontent.com/astral-test/astral-test-hash/main/invalid-hash/simple-html/example-a-961b4c22/index.html"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download and build `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
sha256:a3cf07a05aac526131a2e8b6e4375ee6c6eaac8add05b88035e960ac6cd999ee
Expected:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
sha256:a3cf07a05aac526131a2e8b6e4375ee6c6eaac8add05b88035e960ac6cd999ee
Computed:
sha256:294e788dbe500fdc39e8b88e82652ab67409a1dc9dd06543d0fe0ae31b713eb3
Computed:
sha256:294e788dbe500fdc39e8b88e82652ab67409a1dc9dd06543d0fe0ae31b713eb3
"###
);
@ -4890,20 +4876,19 @@ fn require_hashes_registry_invalid_hash() -> Result<()> {
.arg("--index-url")
.arg("https://astral-test.github.io/astral-test-hash/invalid-hash/simple-html/"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:123
Expected:
sha256:123
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
"###
);
@ -4920,20 +4905,19 @@ fn require_hashes_registry_invalid_hash() -> Result<()> {
.arg("--index-url")
.arg("https://astral-test.github.io/astral-test-hash/invalid-hash/simple-html/"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:8838f9d005ff0432b258ba648d9cabb1cbdf06ac29d14f788b02edae544032ea
Expected:
sha256:8838f9d005ff0432b258ba648d9cabb1cbdf06ac29d14f788b02edae544032ea
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
Computed:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
"###
);
@ -5004,21 +4988,20 @@ fn require_hashes_registry_invalid_hash() -> Result<()> {
.arg("--index-url")
.arg("https://astral-test.github.io/astral-test-hash/invalid-hash/simple-html/"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `example-a-961b4c22==1.0.0`
Caused by: Hash mismatch for `example-a-961b4c22==1.0.0`
× Failed to download and build `example-a-961b4c22==1.0.0`
Hash mismatch for `example-a-961b4c22==1.0.0`
Expected:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
sha256:a3cf07a05aac526131a2e8b6e4375ee6c6eaac8add05b88035e960ac6cd999ee
Expected:
sha256:5d69f0b590514103234f0c3526563856f04d044d8d0ea1073a843ae429b3187e
sha256:a3cf07a05aac526131a2e8b6e4375ee6c6eaac8add05b88035e960ac6cd999ee
Computed:
sha256:294e788dbe500fdc39e8b88e82652ab67409a1dc9dd06543d0fe0ae31b713eb3
Computed:
sha256:294e788dbe500fdc39e8b88e82652ab67409a1dc9dd06543d0fe0ae31b713eb3
"###
);
@ -5092,20 +5075,19 @@ fn require_hashes_url_invalid() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
Caused by: Hash mismatch for `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
× Failed to download `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
Hash mismatch for `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
Expected:
sha256:c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
Expected:
sha256:c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
Computed:
sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
Computed:
sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
"###
);
@ -5126,20 +5108,19 @@ fn require_hashes_url_ignore() -> Result<()> {
.arg("requirements.txt")
.arg("--require-hashes"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
Caused by: Hash mismatch for `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
× Failed to download `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
Hash mismatch for `iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl#sha256=b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374`
Expected:
sha256:c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
Expected:
sha256:c6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
Computed:
sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
Computed:
sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
"###
);
@ -5487,16 +5468,15 @@ fn incompatible_build_constraint() -> Result<()> {
.arg("--build-constraint")
.arg("build_constraints.txt"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 1 package in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `requests==1.2.0`
Caused by: Failed to resolve requirements from `setup.py` build
Caused by: No solution found when resolving: `setuptools>=40.8.0`
Caused by: Because you require setuptools>=40.8.0 and setuptools==1, we can conclude that your requirements are unsatisfiable.
× Failed to download and build `requests==1.2.0`
Failed to resolve requirements from `setup.py` build
No solution found when resolving: `setuptools>=40.8.0`
Because you require setuptools>=40.8.0 and setuptools==1, we can conclude that your requirements are unsatisfiable.
"###
);

View File

@ -688,20 +688,18 @@ fn sync_build_isolation_package() -> Result<()> {
.collect::<Vec<_>>();
uv_snapshot!(filters, context.sync().arg("--no-build-isolation-package").arg("source-distribution"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved 2 packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz`
Caused by: Build backend failed to build wheel through `build_wheel` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 8, in <module>
ModuleNotFoundError: No module named 'hatchling'
× Failed to download and build `source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz`
Build backend failed to build wheel through `build_wheel` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 8, in <module>
ModuleNotFoundError: No module named 'hatchling'
"###);
// Install `hatchling` for `source-distribution`.
@ -779,39 +777,35 @@ fn sync_build_isolation_extra() -> Result<()> {
.collect::<Vec<_>>();
uv_snapshot!(&filters, context.sync().arg("--extra").arg("compile"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved [N] packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz`
Caused by: Build backend failed to build wheel through `build_wheel` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 8, in <module>
ModuleNotFoundError: No module named 'hatchling'
× Failed to download and build `source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz`
Build backend failed to build wheel through `build_wheel` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 8, in <module>
ModuleNotFoundError: No module named 'hatchling'
"###);
// Running `uv sync` with `--all-extras` should also fail.
uv_snapshot!(&filters, context.sync().arg("--all-extras"), @r###"
success: false
exit_code: 2
exit_code: 1
----- stdout -----
----- stderr -----
Resolved [N] packages in [TIME]
error: Failed to prepare distributions
Caused by: Failed to download and build `source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz`
Caused by: Build backend failed to build wheel through `build_wheel` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 8, in <module>
ModuleNotFoundError: No module named 'hatchling'
× Failed to download and build `source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz`
Build backend failed to build wheel through `build_wheel` (exit status: 1)
[stderr]
Traceback (most recent call last):
File "<string>", line 8, in <module>
ModuleNotFoundError: No module named 'hatchling'
"###);
// Install the build dependencies.