10542: Use workspace cargo to fetch rust source's metadata r=lnicola a=Alexendoo

Previously the detected cargo is the global one, as it uses the
directory of the rust source which doesn't pick up the local override

This fixes the case in clippy where the local rust toolchain is a recent
nightly that has a 2021 edition Cargo.toml. The global (stable) cargo
returns an error attempting to parse it

Fixes #10445

Co-authored-by: Alex Macleod <alex@macleod.io>
This commit is contained in:
bors[bot] 2021-10-16 10:28:46 +00:00 committed by GitHub
commit 3c468ab2fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 13 deletions

View File

@ -251,6 +251,7 @@ struct PackageMetadata {
impl CargoWorkspace { impl CargoWorkspace {
pub fn fetch_metadata( pub fn fetch_metadata(
cargo_toml: &ManifestPath, cargo_toml: &ManifestPath,
current_dir: &AbsPath,
config: &CargoConfig, config: &CargoConfig,
progress: &dyn Fn(String), progress: &dyn Fn(String),
) -> Result<cargo_metadata::Metadata> { ) -> Result<cargo_metadata::Metadata> {
@ -275,7 +276,7 @@ pub fn fetch_metadata(
meta.features(CargoOpt::SomeFeatures(config.features.clone())); meta.features(CargoOpt::SomeFeatures(config.features.clone()));
} }
} }
meta.current_dir(cargo_toml.parent().as_os_str()); meta.current_dir(current_dir.as_os_str());
if let Some(target) = target { if let Some(target) = target {
meta.other_options(vec![String::from("--filter-platform"), target]); meta.other_options(vec![String::from("--filter-platform"), target]);

View File

@ -160,7 +160,12 @@ pub fn load(
cmd cmd
})?; })?;
let meta = CargoWorkspace::fetch_metadata(&cargo_toml, config, progress) let meta = CargoWorkspace::fetch_metadata(
&cargo_toml,
cargo_toml.parent(),
config,
progress,
)
.with_context(|| { .with_context(|| {
format!( format!(
"Failed to read Cargo metadata from Cargo.toml file {}, {}", "Failed to read Cargo metadata from Cargo.toml file {}, {}",
@ -189,7 +194,12 @@ pub fn load(
let rustc = match rustc_dir { let rustc = match rustc_dir {
Some(rustc_dir) => Some({ Some(rustc_dir) => Some({
let meta = CargoWorkspace::fetch_metadata(&rustc_dir, config, progress) let meta = CargoWorkspace::fetch_metadata(
&rustc_dir,
cargo_toml.parent(),
config,
progress,
)
.with_context(|| { .with_context(|| {
"Failed to read Cargo metadata for Rust sources".to_string() "Failed to read Cargo metadata for Rust sources".to_string()
})?; })?;