@@ -14,6 +14,7 @@ use std::ops::Not;
14
14
use std:: path:: { Path , PathBuf } ;
15
15
use std:: process:: { self , Command } ;
16
16
17
+ use cargo_metadata:: { Metadata , MetadataCommand } ;
17
18
use rustc_version:: VersionMeta ;
18
19
use serde:: { Deserialize , Serialize } ;
19
20
@@ -582,18 +583,13 @@ path = "lib.rs"
582
583
}
583
584
}
584
585
585
- #[ derive( Deserialize ) ]
586
- struct Metadata {
587
- target_directory : PathBuf ,
588
- workspace_members : Vec < String > ,
589
- }
590
-
591
586
fn get_cargo_metadata ( ) -> Metadata {
592
- let mut cmd = cargo ( ) ;
593
- // `-Zunstable-options` is required by `--config`.
594
- cmd. args ( [ "metadata" , "--no-deps" , "--format-version=1" , "-Zunstable-options" ] ) ;
595
587
// The `build.target-dir` config can be passed by `--config` flags, so forward them to
596
588
// `cargo metadata`.
589
+ let mut additional_options = Vec :: new ( ) ;
590
+ // `-Zunstable-options` is required by `--config`.
591
+ additional_options. push ( "-Zunstable-options" . to_string ( ) ) ;
592
+
597
593
let config_flag = "--config" ;
598
594
for arg in ArgSplitFlagValue :: new (
599
595
env:: args ( ) . skip ( 3 ) , // skip the program name, "miri" and "run" / "test"
@@ -602,21 +598,14 @@ fn get_cargo_metadata() -> Metadata {
602
598
// Only look at `Ok`
603
599
. flatten ( )
604
600
{
605
- cmd. arg ( config_flag) . arg ( arg) ;
606
- }
607
- let mut child = cmd
608
- . stdin ( process:: Stdio :: null ( ) )
609
- . stdout ( process:: Stdio :: piped ( ) )
610
- . spawn ( )
611
- . expect ( "failed ro run `cargo metadata`" ) ;
612
- // Check this `Result` after `status.success()` is checked, so we don't print the error
613
- // to stderr if `cargo metadata` is also printing to stderr.
614
- let metadata: Result < Metadata , _ > = serde_json:: from_reader ( child. stdout . take ( ) . unwrap ( ) ) ;
615
- let status = child. wait ( ) . expect ( "failed to wait for `cargo metadata` to exit" ) ;
616
- if !status. success ( ) {
617
- std:: process:: exit ( status. code ( ) . unwrap_or ( -1 ) ) ;
601
+ additional_options. push ( config_flag. to_string ( ) ) ;
602
+ additional_options. push ( arg) ;
618
603
}
619
- metadata. unwrap_or_else ( |e| show_error ( format ! ( "invalid `cargo metadata` output: {}" , e) ) )
604
+
605
+ let metadata =
606
+ MetadataCommand :: new ( ) . no_deps ( ) . other_options ( additional_options) . exec ( ) . unwrap ( ) ;
607
+
608
+ metadata
620
609
}
621
610
622
611
/// Pulls all the crates in this workspace from the cargo metadata.
@@ -627,7 +616,7 @@ fn local_crates(metadata: &Metadata) -> String {
627
616
assert ! ( !metadata. workspace_members. is_empty( ) ) ;
628
617
let mut local_crates = String :: new ( ) ;
629
618
for member in & metadata. workspace_members {
630
- let name = member. split ( ' ' ) . next ( ) . unwrap ( ) ;
619
+ let name = member. repr . split ( ' ' ) . next ( ) . unwrap ( ) ;
631
620
let name = name. replace ( '-' , "_" ) ;
632
621
local_crates. push_str ( & name) ;
633
622
local_crates. push ( ',' ) ;
0 commit comments