4
4
extern crate cargo;
5
5
extern crate crates_io;
6
6
extern crate env_logger;
7
+ extern crate failure;
7
8
extern crate getopts;
8
9
#[ macro_use]
9
10
extern crate log;
10
11
11
12
use cargo:: {
12
- core:: { compiler:: CompileMode , Package , PackageId , Source , SourceId , Workspace } ,
13
+ core:: {
14
+ compiler:: CompileMode , Package , PackageId , PackageSet , Source , SourceId , SourceMap ,
15
+ Workspace ,
16
+ } ,
13
17
exit_with_error,
14
18
ops:: { compile, CompileOptions } ,
15
- util:: {
16
- config:: Config , important_paths:: find_root_manifest_for_wd, CargoError , CargoResult ,
17
- CliError ,
18
- } ,
19
+ util:: { config:: Config , important_paths:: find_root_manifest_for_wd, CargoResult , CliError } ,
19
20
} ;
20
21
use crates_io:: { Crate , Registry } ;
21
22
use getopts:: { Matches , Options } ;
@@ -123,17 +124,36 @@ impl<'a> WorkInfo<'a> {
123
124
/// version.
124
125
fn remote (
125
126
config : & ' a Config ,
126
- source : & mut SourceInfo < ' a > ,
127
+ source : SourceInfo < ' a > ,
127
128
info : & NameAndVersion ,
128
129
) -> CargoResult < WorkInfo < ' a > > {
129
130
// TODO: fall back to locally cached package instance, or better yet, search for it
130
131
// first.
131
- let package_id = PackageId :: new ( info. name , info. version , & source. id ) ?;
132
- debug ! ( "(remote) package id: {:?}" , package_id) ;
133
- let package = source. source . download ( & package_id) ?;
132
+ let package_ids = [ PackageId :: new ( info. name , info. version , source. id ) ?] ;
133
+ debug ! ( "(remote) package id: {:?}" , package_ids[ 0 ] ) ;
134
+ let sources = {
135
+ let mut s = SourceMap :: new ( ) ;
136
+ s. insert ( source. source ) ;
137
+ s
138
+ } ;
139
+
140
+ let package_set = PackageSet :: new ( & package_ids, sources, config) ?;
141
+ let mut downloads = package_set. enable_download ( ) ?;
142
+ let package = if let Some ( package) = downloads. start ( package_ids[ 0 ] ) ? {
143
+ package
144
+ } else {
145
+ downloads. wait ( ) ?;
146
+ downloads
147
+ . start ( package_ids[ 0 ] ) ?
148
+ . expect ( "started download did not finish after wait" )
149
+ } ;
150
+
134
151
let workspace = Workspace :: ephemeral ( package. clone ( ) , config, None , false ) ?;
135
152
136
- Ok ( Self { package, workspace } )
153
+ Ok ( Self {
154
+ package : package. clone ( ) ,
155
+ workspace,
156
+ } )
137
157
}
138
158
139
159
/// Obtain the paths to the produced rlib and the dependency output directory.
@@ -155,7 +175,7 @@ impl<'a> WorkInfo<'a> {
155
175
156
176
env:: remove_var ( "RUSTFLAGS" ) ;
157
177
158
- let rlib = compilation. libraries [ self . package . package_id ( ) ]
178
+ let rlib = compilation. libraries [ & self . package . package_id ( ) ]
159
179
. iter ( )
160
180
. find ( |t| t. 0 . name ( ) == name)
161
181
. ok_or_else ( || Error ( "lost a build artifact" . to_owned ( ) ) ) ?;
@@ -192,10 +212,8 @@ fn do_main(config: &Config, matches: &Matches, explain: bool) -> CargoResult<()>
192
212
193
213
debug ! ( "running cargo-semver" ) ;
194
214
195
- let mut source = SourceInfo :: new ( config) ?;
196
-
197
215
let current = if let Some ( opt) = matches. opt_str ( "C" ) {
198
- WorkInfo :: remote ( config, & mut source , & parse_arg ( & opt) ?) ?
216
+ WorkInfo :: remote ( config, SourceInfo :: new ( config ) ? , & parse_arg ( & opt) ?) ?
199
217
} else {
200
218
WorkInfo :: local ( config, matches. opt_str ( "c" ) . map ( PathBuf :: from) ) ?
201
219
} ;
@@ -206,7 +224,7 @@ fn do_main(config: &Config, matches: &Matches, explain: bool) -> CargoResult<()>
206
224
let info = parse_arg ( & opt) ?;
207
225
let version = info. version . to_owned ( ) ;
208
226
209
- let work_info = WorkInfo :: remote ( config, & mut source , & info) ?;
227
+ let work_info = WorkInfo :: remote ( config, SourceInfo :: new ( config ) ? , & info) ?;
210
228
211
229
( work_info, version)
212
230
} else if let Some ( path) = matches. opt_str ( "s" ) {
@@ -219,7 +237,7 @@ fn do_main(config: &Config, matches: &Matches, explain: bool) -> CargoResult<()>
219
237
name : & name,
220
238
version : & stable_crate. max_version ,
221
239
} ;
222
- let work_info = WorkInfo :: remote ( config, & mut source , & info) ?;
240
+ let work_info = WorkInfo :: remote ( config, SourceInfo :: new ( config ) ? , & info) ?;
223
241
224
242
( work_info, stable_crate. max_version . clone ( ) )
225
243
} ;
@@ -305,7 +323,7 @@ fn version() {
305
323
///
306
324
/// Parse CLI arguments, handle their semantics, and provide for proper error handling.
307
325
fn main ( ) {
308
- fn err ( config : & Config , e : CargoError ) -> ! {
326
+ fn err ( config : & Config , e : failure :: Error ) -> ! {
309
327
exit_with_error ( CliError :: new ( e, 1 ) , & mut config. shell ( ) ) ;
310
328
}
311
329
0 commit comments