Skip to content

Commit

Permalink
Improve error for missing crate in --offline mode for sparse index
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
arlosi committed Mar 1, 2023
1 parent e7b11e7 commit 4a0c883
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 2 deletions.
7 changes: 7 additions & 0 deletions src/cargo/sources/registry/http_remote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()))?;
Expand Down
8 changes: 7 additions & 1 deletion tests/testsuite/generate_lockfile.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -56,6 +56,12 @@ fn adding_and_removing_packages() {
assert_eq!(lock1, lock4);
}

#[cargo_test]
fn no_index_update_sparse() {
let _registry = RegistryBuilder::new().http_index().build();
no_index_update();
}

#[cargo_test]
fn no_index_update() {
Package::new("serde", "1.0.0").publish();
Expand Down
38 changes: 37 additions & 1 deletion tests/testsuite/offline.rs
Original file line number Diff line number Diff line change
@@ -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]
Expand Down Expand Up @@ -362,6 +365,39 @@ retry without the offline flag.",
.run();
}

#[cargo_test]
fn update_offline_not_cached_sparse() {
let _registry = RegistryBuilder::new().http_index().build();

let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.1"
authors = []
[dependencies]
bar = "*"
"#,
)
.file("src/main.rs", "fn main() {}")
.build();
p.cargo("update --offline")
.with_status(101)
.with_stderr(
"\
[ERROR] no matching package named `bar` found
location searched: registry `[..]`
required by package `foo v0.0.1 ([..]/foo)`
As a reminder, you're using offline mode (--offline) which can sometimes cause \
surprising resolution failures, if this error is too confusing you may wish to \
retry without the offline flag.",
)
.run();
}

#[cargo_test]
fn cargo_compile_offline_with_cached_git_dep() {
let git_project = git::new("dep1", |project| {
Expand Down

0 comments on commit 4a0c883

Please sign in to comment.