Restore proper error for crate not in local reg

Fixes #10682.
This commit is contained in:
Jon Gjengset 2022-05-20 18:24:22 +00:00
parent f624095e1c
commit c262f100ec
2 changed files with 49 additions and 2 deletions

View File

@ -4,8 +4,8 @@ use crate::util::errors::CargoResult;
use crate::util::{Config, Filesystem};
use cargo_util::{paths, Sha256};
use std::fs::File;
use std::io::prelude::*;
use std::io::SeekFrom;
use std::io::{self, prelude::*};
use std::path::Path;
use std::task::Poll;
@ -54,8 +54,17 @@ impl<'cfg> RegistryData for LocalRegistry<'cfg> {
_index_version: Option<&str>,
) -> Poll<CargoResult<LoadResponse>> {
if self.updated {
let raw_data = match paths::read_bytes(&root.join(path)) {
Err(e)
if e.downcast_ref::<io::Error>()
.map_or(false, |ioe| ioe.kind() == io::ErrorKind::NotFound) =>
{
return Poll::Ready(Ok(LoadResponse::NotFound));
}
r => r,
}?;
Poll::Ready(Ok(LoadResponse::Data {
raw_data: paths::read_bytes(&root.join(path))?,
raw_data,
index_version: None,
}))
} else {

View File

@ -62,6 +62,44 @@ fn simple() {
p.cargo("test").run();
}
#[cargo_test]
fn not_found() {
setup();
// Publish a package so that the directory hierarchy is created.
// Note, however, that we declare a dependency on baZ.
Package::new("bar", "0.0.1").local(true).publish();
let p = project()
.file(
"Cargo.toml",
r#"
[project]
name = "foo"
version = "0.0.1"
authors = []
[dependencies]
baz = "0.0.1"
"#,
)
.file(
"src/lib.rs",
"extern crate baz; pub fn foo() { baz::bar(); }",
)
.build();
p.cargo("build")
.with_status(101)
.with_stderr(
"\
[ERROR] no matching package named `baz` found
location searched: registry `crates-io`
required by package `foo v0.0.1 ([..]/foo)`
",
)
.run();
}
#[cargo_test]
fn depend_on_yanked() {
setup();