Improve error for missing crate in --offline mode for sparse index

This changes sparse registries to instead return not found when a non-cached crate is requested in offline mode.

The resolver can then suggest removing the --offline flag if resolution
fails.
This commit is contained in:
Arlo Siemsen 2023-02-28 16:46:45 -06:00
parent e7b11e733d
commit 65e449ecda
3 changed files with 33 additions and 3 deletions

View File

@ -438,6 +438,13 @@ impl<'cfg> RegistryData for HttpRegistry<'cfg> {
return Poll::Ready(Ok(LoadResponse::NotFound));
}
if self.config.offline() || self.config.cli_unstable().no_index_update {
// Return NotFound in offline mode when the file doesn't exist in the cache.
// If this results in resolution failure, the resolver will suggest
// removing the --offline flag.
return Poll::Ready(Ok(LoadResponse::NotFound));
}
if let Some(result) = self.downloads.results.remove(path) {
let result =
result.with_context(|| format!("download of {} failed", path.display()))?;

View File

@ -1,6 +1,6 @@
//! Tests for the `cargo generate-lockfile` command.
use cargo_test_support::registry::Package;
use cargo_test_support::registry::{Package, RegistryBuilder};
use cargo_test_support::{basic_manifest, paths, project, ProjectBuilder};
use std::fs;
@ -57,6 +57,16 @@ fn adding_and_removing_packages() {
}
#[cargo_test]
fn no_index_update_sparse() {
let _registry = RegistryBuilder::new().http_index().build();
no_index_update();
}
#[cargo_test]
fn no_index_update_git() {
no_index_update();
}
fn no_index_update() {
Package::new("serde", "1.0.0").publish();

View File

@ -1,6 +1,9 @@
//! Tests for --offline flag.
use cargo_test_support::{basic_manifest, git, main_file, path2url, project, registry::Package};
use cargo_test_support::{
basic_manifest, git, main_file, path2url, project,
registry::{Package, RegistryBuilder},
};
use std::fs;
#[cargo_test]
@ -331,7 +334,6 @@ Caused by:
.run();
}
#[cargo_test]
fn update_offline_not_cached() {
let p = project()
.file(
@ -362,6 +364,17 @@ retry without the offline flag.",
.run();
}
#[cargo_test]
fn update_offline_not_cached_sparse() {
let _registry = RegistryBuilder::new().http_index().build();
update_offline_not_cached()
}
#[cargo_test]
fn update_offline_not_cached_git() {
update_offline_not_cached()
}
#[cargo_test]
fn cargo_compile_offline_with_cached_git_dep() {
let git_project = git::new("dep1", |project| {