@@ -7,16 +7,10 @@ use std::path::Path;
77/// Describes how this module can fail
88#[ derive( Debug , thiserror:: Error ) ]
99pub enum Error {
10- #[ error( "Failed to run cargo metadata: {0:?}" ) ]
11- LaunchingMetadata ( #[ from] std:: io:: Error ) ,
12- #[ error( "Failed get output from cargo metadata: {0:?}" ) ]
13- GettingMetadata ( String ) ,
14- #[ error( "Failed parse JSON output from cargo metadata: {0:?}" ) ]
15- ParsingJson ( #[ from] serde_json:: Error ) ,
16- #[ error( "Failed find expected JSON element {0} in output from cargo metadata" ) ]
17- MissingJsonElement ( & ' static str ) ,
18- #[ error( "Failed find expected JSON element {0} in output from cargo metadata for package {1}" ) ]
19- MissingJsonElementForPackage ( String , String ) ,
10+ #[ error( "I/O Error: {0:?}" ) ]
11+ Io ( #[ from] std:: io:: Error ) ,
12+ #[ error( "Failed get output from cargo-metadata: {0:?}" ) ]
13+ GettingMetadata ( #[ from] cargo_metadata:: Error ) ,
2014 #[ error( "Failed to run cargo vendor: {0:?}" ) ]
2115 LaunchingVendor ( std:: io:: Error ) ,
2216 #[ error( "Failed to complete cargo vendor" ) ]
@@ -88,71 +82,33 @@ pub fn get_metadata(
8882 if manifest_path. file_name ( ) != Some ( OsStr :: new ( "Cargo.toml" ) ) {
8983 panic ! ( "cargo_manifest::get requires a path to a Cargo.toml file" ) ;
9084 }
91- let metadata_json = get_metadata_json ( cargo, manifest_path) ?;
92- let packages = metadata_json[ "packages" ]
93- . as_array ( )
94- . ok_or_else ( || Error :: MissingJsonElement ( "packages array" ) ) ?;
95- for package in packages {
96- let package =
97- package. as_object ( ) . ok_or_else ( || Error :: MissingJsonElement ( "package object" ) ) ?;
98- let manifest_path = package
99- . get ( "manifest_path" )
100- . and_then ( |v| v. as_str ( ) )
101- . map ( Path :: new)
102- . ok_or_else ( || Error :: MissingJsonElement ( "package.manifest_path" ) ) ?;
85+ let metadata = cargo_metadata:: MetadataCommand :: new ( )
86+ . cargo_path ( cargo)
87+ . env ( "RUSTC_BOOTSTRAP" , "1" )
88+ . manifest_path ( manifest_path)
89+ . exec ( ) ?;
90+ for package in metadata. packages {
91+ let manifest_path = package. manifest_path . as_path ( ) ;
10392 if manifest_path. starts_with ( root_path) {
10493 // it's an in-tree dependency and reuse covers it
10594 continue ;
10695 }
10796 // otherwise it's an out-of-tree dependency
108- let get_string = |field_name : & str , package_name : & str | {
109- package. get ( field_name) . and_then ( |v| v. as_str ( ) ) . ok_or_else ( || {
110- Error :: MissingJsonElementForPackage (
111- format ! ( "package.{field_name}" ) ,
112- package_name. to_owned ( ) ,
113- )
114- } )
115- } ;
116- let name = get_string ( "name" , "unknown" ) ?;
117- let license = get_string ( "license" , name) ?;
118- let version = get_string ( "version" , name) ?;
119- let authors_list = package
120- . get ( "authors" )
121- . and_then ( |v| v. as_array ( ) )
122- . ok_or_else ( || Error :: MissingJsonElement ( "package.authors" ) ) ?;
123- let authors: Vec < String > =
124- authors_list. iter ( ) . filter_map ( |v| v. as_str ( ) ) . map ( |s| s. to_owned ( ) ) . collect ( ) ;
125- let package = Package { name : name. to_owned ( ) , version : version. to_owned ( ) } ;
97+ let package_id = Package { name : package. name , version : package. version . to_string ( ) } ;
12698 output. insert (
127- package. clone ( ) ,
128- PackageMetadata { license : license. to_owned ( ) , authors, notices : BTreeMap :: new ( ) } ,
99+ package_id,
100+ PackageMetadata {
101+ license : package. license . unwrap_or_else ( || String :: from ( "Unspecified" ) ) ,
102+ authors : package. authors ,
103+ notices : BTreeMap :: new ( ) ,
104+ } ,
129105 ) ;
130106 }
131107 }
132108
133109 Ok ( output)
134110}
135111
136- /// Get cargo-metdata for a package, as JSON
137- fn get_metadata_json ( cargo : & Path , manifest_path : & Path ) -> Result < serde_json:: Value , Error > {
138- let metadata_output = std:: process:: Command :: new ( cargo)
139- . arg ( "metadata" )
140- . arg ( "--format-version=1" )
141- . arg ( "--all-features" )
142- . arg ( "--manifest-path" )
143- . arg ( manifest_path)
144- . env ( "RUSTC_BOOTSTRAP" , "1" )
145- . output ( )
146- . map_err ( Error :: LaunchingMetadata ) ?;
147- if !metadata_output. status . success ( ) {
148- return Err ( Error :: GettingMetadata (
149- String :: from_utf8 ( metadata_output. stderr ) . expect ( "UTF-8 output from cargo" ) ,
150- ) ) ;
151- }
152- let json = serde_json:: from_slice ( & metadata_output. stdout ) ?;
153- Ok ( json)
154- }
155-
156112/// Run cargo-vendor, fetching into the given dir
157113fn run_cargo_vendor ( cargo : & Path , dest : & Path , manifest_paths : & [ & Path ] ) -> Result < ( ) , Error > {
158114 let mut vendor_command = std:: process:: Command :: new ( cargo) ;
0 commit comments