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:
commit
58f3894342
8 changed files with 28 additions and 12 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[package]
|
||||
name = "test-local-crate-detection"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
|
@ -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"));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue