@@ -7,16 +7,10 @@ use std::path::Path;
7
7
/// Describes how this module can fail
8
8
#[ derive( Debug , thiserror:: Error ) ]
9
9
pub 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 ) ,
20
14
#[ error( "Failed to run cargo vendor: {0:?}" ) ]
21
15
LaunchingVendor ( std:: io:: Error ) ,
22
16
#[ error( "Failed to complete cargo vendor" ) ]
@@ -88,71 +82,33 @@ pub fn get_metadata(
88
82
if manifest_path. file_name ( ) != Some ( OsStr :: new ( "Cargo.toml" ) ) {
89
83
panic ! ( "cargo_manifest::get requires a path to a Cargo.toml file" ) ;
90
84
}
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 ( ) ;
103
92
if manifest_path. starts_with ( root_path) {
104
93
// it's an in-tree dependency and reuse covers it
105
94
continue ;
106
95
}
107
96
// 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 ( ) } ;
126
98
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
+ } ,
129
105
) ;
130
106
}
131
107
}
132
108
133
109
Ok ( output)
134
110
}
135
111
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
-
156
112
/// Run cargo-vendor, fetching into the given dir
157
113
fn run_cargo_vendor ( cargo : & Path , dest : & Path , manifest_paths : & [ & Path ] ) -> Result < ( ) , Error > {
158
114
let mut vendor_command = std:: process:: Command :: new ( cargo) ;
0 commit comments