about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul Gey <narpfel@gmx.de>2024-05-28 22:28:55 +0200
committerPaul Gey <narpfel@gmx.de>2024-05-28 22:28:55 +0200
commitd5235f91ad4807a955bace31668c03c5afa353eb (patch)
tree67e89079be8d858114a0f60dbb0a2013106cb1c4
parent9d162eb3fe96c4267630ec1ee5c16028e3b717ea (diff)
downloadrust-d5235f91ad4807a955bace31668c03c5afa353eb.tar.gz
rust-d5235f91ad4807a955bace31668c03c5afa353eb.zip
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
1 files changed, 9 insertions, 11 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.