Auto merge of #3644 - narpfel:local-crates-metadata-format-update, r=RalfJung

Fix "local crate" detection

`PackageId` is an opaque identifier whose internal format is subject to change, so looking up the names of local crates by ID is more robust than parsing the ID.

Resolves #3643.
This commit is contained in:
bors 2024-05-30 08:25:23 +00:00
commit 58f3894342
8 changed files with 28 additions and 12 deletions

View file

@ -1,3 +1,4 @@
use std::collections::HashMap;
use std::env;
use std::ffi::OsString;
use std::fs::File;
@ -233,21 +234,18 @@ pub fn get_cargo_metadata() -> Metadata {
}
/// Pulls all the crates in this workspace from the cargo metadata.
/// Workspace members are emitted like "miri 0.1.0 (path+file:///path/to/miri)"
/// Additionally, somewhere between cargo metadata and TyCtxt, '-' gets replaced with '_' so we
/// make that same transformation here.
pub fn local_crates(metadata: &Metadata) -> String {
assert!(!metadata.workspace_members.is_empty());
let mut local_crates = String::new();
for member in &metadata.workspace_members {
let name = member.repr.split(' ').next().unwrap();
let name = name.replace('-', "_");
local_crates.push_str(&name);
local_crates.push(',');
}
local_crates.pop(); // Remove the trailing ','
local_crates
let package_name_by_id: HashMap<_, _> =
metadata.packages.iter().map(|package| (&package.id, package.name.as_str())).collect();
metadata
.workspace_members
.iter()
.map(|id| package_name_by_id[id].replace('-', "_"))
.collect::<Vec<_>>()
.join(",")
}
/// Debug-print a command that is going to be run.

View file

@ -123,6 +123,10 @@ dependencies = [
"byteorder 1.5.0",
]
[[package]]
name = "test-local-crate-detection"
version = "0.1.0"
[[package]]
name = "unicode-ident"
version = "1.0.12"

View file

@ -1,5 +1,5 @@
[workspace]
members = ["subcrate", "issue-1567", "exported-symbol-dep"]
members = ["subcrate", "issue-1567", "exported-symbol-dep", "test-local-crate-detection"]
exclude = ["no-std-smoke"] # it wants to be panic="abort"
[package]

View file

@ -131,6 +131,10 @@ def test_cargo_miri_run():
cargo_miri("run") + ["--target-dir=custom-run", "--", "--target-dir=target/custom-run"],
"run.args.stdout.ref", "run.custom-target-dir.stderr.ref",
)
test("`cargo miri run --package=test-local-crate-detection` (test local crate detection)",
cargo_miri("run") + ["--package=test-local-crate-detection"],
"run.local_crate.stdout.ref", "run.local_crate.stderr.ref",
)
def test_cargo_miri_test():
# rustdoc is not run on foreign targets

View file

@ -0,0 +1 @@
subcrate,issue_1567,exported_symbol_dep,test_local_crate_detection,cargo_miri_test,cdylib,exported_symbol,issue_1691,issue_1705,issue_rust_86261,proc_macro_crate

View file

@ -0,0 +1,4 @@
[package]
name = "test-local-crate-detection"
version = "0.1.0"
edition = "2021"

View file

@ -0,0 +1,5 @@
fn main() {
// Make sure we detect all crates from this workspace as "local".
// The env var is set during the "build" so we can use `env!` to access it directly.
println!("{}", env!("MIRI_LOCAL_CRATES"));
}