@@ -5,7 +5,7 @@ use std::str::FromStr;
5
5
use serde:: ser;
6
6
use serde:: de;
7
7
8
- use core:: { Package , PackageId , SourceId , Workspace } ;
8
+ use core:: { Package , PackageId , SourceId , Workspace , Dependency } ;
9
9
use util:: { Graph , Config , internal} ;
10
10
use util:: errors:: { CargoResult , CargoResultExt , CargoError } ;
11
11
@@ -60,7 +60,12 @@ impl EncodableResolve {
60
60
let id = match pkg. source . as_ref ( ) . or ( path_deps. get ( & pkg. name ) ) {
61
61
// We failed to find a local package in the workspace.
62
62
// It must have been removed and should be ignored.
63
- None => continue ,
63
+ None => {
64
+ debug ! ( "path dependency now missing {} v{}" ,
65
+ pkg. name,
66
+ pkg. version) ;
67
+ continue
68
+ }
64
69
Some ( source) => PackageId :: new ( & pkg. name , & pkg. version , source) ?
65
70
} ;
66
71
@@ -199,34 +204,49 @@ fn build_path_deps(ws: &Workspace) -> HashMap<String, SourceId> {
199
204
visited. insert ( member. package_id ( ) . source_id ( ) . clone ( ) ) ;
200
205
}
201
206
for member in members. iter ( ) {
202
- build ( member, ws. config ( ) , & mut ret, & mut visited) ;
207
+ build_pkg ( member, ws. config ( ) , & mut ret, & mut visited) ;
208
+ }
209
+ for ( _, deps) in ws. root_patch ( ) {
210
+ for dep in deps {
211
+ build_dep ( dep, ws. config ( ) , & mut ret, & mut visited) ;
212
+ }
213
+ }
214
+ for & ( _, ref dep) in ws. root_replace ( ) {
215
+ build_dep ( dep, ws. config ( ) , & mut ret, & mut visited) ;
203
216
}
204
217
205
218
return ret;
206
219
207
- fn build ( pkg : & Package ,
208
- config : & Config ,
209
- ret : & mut HashMap < String , SourceId > ,
210
- visited : & mut HashSet < SourceId > ) {
211
- let replace = pkg. manifest ( ) . replace ( ) . iter ( ) . map ( |p| & p. 1 ) ;
212
- let patch = pkg. manifest ( ) . patch ( ) . values ( ) . flat_map ( |v| v) ;
213
- let deps = pkg. dependencies ( )
214
- . iter ( )
215
- . chain ( replace)
216
- . chain ( patch)
217
- . map ( |d| d. source_id ( ) )
218
- . filter ( |id| !visited. contains ( id) && id. is_path ( ) )
219
- . filter_map ( |id| id. url ( ) . to_file_path ( ) . ok ( ) )
220
- . map ( |path| path. join ( "Cargo.toml" ) )
221
- . filter_map ( |path| Package :: for_path ( & path, config) . ok ( ) )
222
- . collect :: < Vec < _ > > ( ) ;
223
- for pkg in deps {
224
- ret. insert ( pkg. name ( ) . to_string ( ) ,
225
- pkg. package_id ( ) . source_id ( ) . clone ( ) ) ;
226
- visited. insert ( pkg. package_id ( ) . source_id ( ) . clone ( ) ) ;
227
- build ( & pkg, config, ret, visited) ;
220
+ fn build_pkg ( pkg : & Package ,
221
+ config : & Config ,
222
+ ret : & mut HashMap < String , SourceId > ,
223
+ visited : & mut HashSet < SourceId > ) {
224
+ for dep in pkg. dependencies ( ) {
225
+ build_dep ( dep, config, ret, visited) ;
228
226
}
229
227
}
228
+
229
+ fn build_dep ( dep : & Dependency ,
230
+ config : & Config ,
231
+ ret : & mut HashMap < String , SourceId > ,
232
+ visited : & mut HashSet < SourceId > ) {
233
+ let id = dep. source_id ( ) ;
234
+ if visited. contains ( id) || !id. is_path ( ) {
235
+ return
236
+ }
237
+ let path = match id. url ( ) . to_file_path ( ) {
238
+ Ok ( p) => p. join ( "Cargo.toml" ) ,
239
+ Err ( _) => return ,
240
+ } ;
241
+ let pkg = match Package :: for_path ( & path, config) {
242
+ Ok ( p) => p,
243
+ Err ( _) => return ,
244
+ } ;
245
+ ret. insert ( pkg. name ( ) . to_string ( ) ,
246
+ pkg. package_id ( ) . source_id ( ) . clone ( ) ) ;
247
+ visited. insert ( pkg. package_id ( ) . source_id ( ) . clone ( ) ) ;
248
+ build_pkg ( & pkg, config, ret, visited) ;
249
+ }
230
250
}
231
251
232
252
impl Patch {
0 commit comments