@@ -14,6 +14,7 @@ use std::ops::Not;
1414use std:: path:: { Path , PathBuf } ;
1515use std:: process:: { self , Command } ;
1616
17+ use cargo_metadata:: { Metadata , MetadataCommand } ;
1718use rustc_version:: VersionMeta ;
1819use serde:: { Deserialize , Serialize } ;
1920
@@ -582,18 +583,13 @@ path = "lib.rs"
582583 }
583584}
584585
585- #[ derive( Deserialize ) ]
586- struct Metadata {
587- target_directory : PathBuf ,
588- workspace_members : Vec < String > ,
589- }
590-
591586fn 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" ] ) ;
595587 // The `build.target-dir` config can be passed by `--config` flags, so forward them to
596588 // `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+
597593 let config_flag = "--config" ;
598594 for arg in ArgSplitFlagValue :: new (
599595 env:: args ( ) . skip ( 3 ) , // skip the program name, "miri" and "run" / "test"
@@ -602,21 +598,14 @@ fn get_cargo_metadata() -> Metadata {
602598 // Only look at `Ok`
603599 . flatten ( )
604600 {
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) ;
618603 }
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
620609}
621610
622611/// Pulls all the crates in this workspace from the cargo metadata.
@@ -627,7 +616,7 @@ fn local_crates(metadata: &Metadata) -> String {
627616 assert ! ( !metadata. workspace_members. is_empty( ) ) ;
628617 let mut local_crates = String :: new ( ) ;
629618 for member in & metadata. workspace_members {
630- let name = member. split ( ' ' ) . next ( ) . unwrap ( ) ;
619+ let name = member. repr . split ( ' ' ) . next ( ) . unwrap ( ) ;
631620 let name = name. replace ( '-' , "_" ) ;
632621 local_crates. push_str ( & name) ;
633622 local_crates. push ( ',' ) ;
0 commit comments