Skip to content

Commit

Permalink
Allow fallback to Python download on non-critical discovery errors
Browse files Browse the repository at this point in the history
  • Loading branch information
zanieb committed Jan 23, 2025
1 parent 542d386 commit c1de56e
Showing 1 changed file with 42 additions and 30 deletions.
72 changes: 42 additions & 30 deletions crates/uv-python/src/installation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,36 +92,48 @@ impl PythonInstallation {
let request = request.unwrap_or(&PythonRequest::Default);

// Search for the installation
match Self::find(request, environments, preference, cache) {
Ok(venv) => Ok(venv),
// If missing and allowed, perform a fetch
Err(Error::MissingPython(err))
if preference.allows_managed()
&& python_downloads.is_automatic()
&& client_builder.connectivity.is_online() =>
{
if let Some(request) = PythonDownloadRequest::from_request(request) {
debug!("Requested Python not found, checking for available download...");
match Self::fetch(
request.fill()?,
client_builder,
cache,
reporter,
python_install_mirror,
pypy_install_mirror,
)
.await
{
Ok(installation) => Ok(installation),
Err(Error::Download(downloads::Error::NoDownloadFound(_))) => {
Err(Error::MissingPython(err))
}
Err(err) => Err(err),
}
} else {
Err(Error::MissingPython(err))
}
}
let err = match Self::find(request, environments, preference, cache) {
Ok(installation) => return Ok(installation),
Err(err) => err,
};

let downloads_enabled = preference.allows_managed()
&& python_downloads.is_automatic()
&& client_builder.connectivity.is_online();

if !downloads_enabled {
return Err(err);
}

match err {
// If Python is missing, we should attempt a download
Error::MissingPython(_) => {}
// If we raised a non-critical error, we should attempt a download
Error::Discovery(ref err) if !err.is_critical() => {}
// Otherwise, this is fatal
_ => return Err(err),
}

// If we can't convert the request to a download, throw the original error
let Some(request) = PythonDownloadRequest::from_request(request) else {
return Err(err);
};

debug!("Requested Python not found, checking for available download...");
match Self::fetch(
request.fill()?,
client_builder,
cache,
reporter,
python_install_mirror,
pypy_install_mirror,
)
.await
{
Ok(installation) => Ok(installation),
// Throw the original error if we couldn't find a download
Err(Error::Download(downloads::Error::NoDownloadFound(_))) => Err(err),
// But if the download failed, throw that error
Err(err) => Err(err),
}
}
Expand Down

0 comments on commit c1de56e

Please sign in to comment.