about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-05-30 08:25:23 +0000
committerbors <bors@rust-lang.org>2024-05-30 08:25:23 +0000
commit58f3894342f673b9c1c633538398d02af3e66cb2 (patch)
treeca901d7f8811f468b5c18cc5c3ed1b6e6017da94
parent8a7338ab4d1bf61a62d5fa44e58825bfd9335210 (diff)
parent00644c12ed77e6f3e5bf38d98e359d101e3f9188 (diff)
downloadrust-58f3894342f673b9c1c633538398d02af3e66cb2.tar.gz
rust-58f3894342f673b9c1c633538398d02af3e66cb2.zip
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.
-rw-r--r--src/tools/miri/cargo-miri/src/util.rs20
-rw-r--r--src/tools/miri/test-cargo-miri/Cargo.lock4
-rw-r--r--src/tools/miri/test-cargo-miri/Cargo.toml2
-rwxr-xr-xsrc/tools/miri/test-cargo-miri/run-test.py4
-rw-r--r--src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref0
-rw-r--r--src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref1
-rw-r--r--src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml4
-rw-r--r--src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs5
8 files changed, 28 insertions, 12 deletions
diff --git a/src/tools/miri/cargo-miri/src/util.rs b/src/tools/miri/cargo-miri/src/util.rs
index 5b6a391aabc..f36cff1f798 100644
--- a/src/tools/miri/cargo-miri/src/util.rs
+++ b/src/tools/miri/cargo-miri/src/util.rs
@@ -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.
diff --git a/src/tools/miri/test-cargo-miri/Cargo.lock b/src/tools/miri/test-cargo-miri/Cargo.lock
index 4783f79ea8f..8f618e7ffb3 100644
--- a/src/tools/miri/test-cargo-miri/Cargo.lock
+++ b/src/tools/miri/test-cargo-miri/Cargo.lock
@@ -124,6 +124,10 @@ dependencies = [
 ]
 
 [[package]]
+name = "test-local-crate-detection"
+version = "0.1.0"
+
+[[package]]
 name = "unicode-ident"
 version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/src/tools/miri/test-cargo-miri/Cargo.toml b/src/tools/miri/test-cargo-miri/Cargo.toml
index bfef388669d..574f1d05a6f 100644
--- a/src/tools/miri/test-cargo-miri/Cargo.toml
+++ b/src/tools/miri/test-cargo-miri/Cargo.toml
@@ -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]
diff --git a/src/tools/miri/test-cargo-miri/run-test.py b/src/tools/miri/test-cargo-miri/run-test.py
index 83f3e4c919b..d855c333a75 100755
--- a/src/tools/miri/test-cargo-miri/run-test.py
+++ b/src/tools/miri/test-cargo-miri/run-test.py
@@ -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
diff --git a/src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref b/src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref
diff --git a/src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref b/src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref
new file mode 100644
index 00000000000..1587de9ff3f
--- /dev/null
+++ b/src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref
@@ -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
diff --git a/src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml b/src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml
new file mode 100644
index 00000000000..2d41b210d4c
--- /dev/null
+++ b/src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml
@@ -0,0 +1,4 @@
+[package]
+name = "test-local-crate-detection"
+version = "0.1.0"
+edition = "2021"
diff --git a/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs b/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs
new file mode 100644
index 00000000000..0991aa38460
--- /dev/null
+++ b/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs
@@ -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"));
+}