@@ -96,6 +96,7 @@ impl<'a> Prepare<'a> {
9696 }
9797
9898 let mut yanked_deps = false ;
99+ let mut missing_deps = false ;
99100 let mut cmd = Command :: new ( self . workspace , self . toolchain . cargo ( ) ) . args ( & [
100101 "generate-lockfile" ,
101102 "--manifest-path" ,
@@ -111,13 +112,20 @@ impl<'a> Prepare<'a> {
111112 . process_lines ( & mut |line, _| {
112113 if line. contains ( "failed to select a version for the requirement" ) {
113114 yanked_deps = true ;
115+ } else if line. contains ( "failed to load source for dependency" )
116+ || line. contains ( "no matching package named" )
117+ {
118+ missing_deps = true ;
114119 }
115120 } )
116121 . run ( ) ;
117122 match res {
118123 Err ( _) if yanked_deps => {
119124 return Err ( PrepareError :: YankedDependencies . into ( ) ) ;
120125 }
126+ Err ( _) if missing_deps => {
127+ return Err ( PrepareError :: MissingDependencies . into ( ) ) ;
128+ }
121129 other => other?,
122130 }
123131 self . lockfile_captured = true ;
@@ -126,6 +134,7 @@ impl<'a> Prepare<'a> {
126134
127135 fn fetch_deps ( & mut self ) -> Result < ( ) , Error > {
128136 let mut outdated_lockfile = false ;
137+ let mut missing_deps = false ;
129138 let res = Command :: new ( self . workspace , self . toolchain . cargo ( ) )
130139 . args ( & [ "fetch" , "--locked" , "--manifest-path" , "Cargo.toml" ] )
131140 . cd ( & self . source_dir )
@@ -134,21 +143,23 @@ impl<'a> Prepare<'a> {
134143 "Cargo.lock needs to be updated but --locked was passed to prevent this" ,
135144 ) {
136145 outdated_lockfile = true ;
146+ } else if line. contains ( "failed to load source for dependency" ) {
147+ missing_deps = true ;
137148 }
138149 } )
139150 . run ( ) ;
140151 match res {
141- Ok ( _) => { }
152+ Ok ( _) => Ok ( ( ) ) ,
142153 Err ( _) if outdated_lockfile && !self . lockfile_captured => {
143154 info ! ( "the lockfile is outdated, regenerating it" ) ;
144155 // Force-update the lockfile and recursively call this function to fetch
145156 // dependencies again.
146157 self . capture_lockfile ( true ) ?;
147- return self . fetch_deps ( ) ;
158+ self . fetch_deps ( )
148159 }
149- err => return err. map_err ( |e| e. into ( ) ) ,
160+ Err ( _) if missing_deps => Err ( PrepareError :: MissingDependencies . into ( ) ) ,
161+ err => err. map_err ( |e| e. into ( ) ) ,
150162 }
151- Ok ( ( ) )
152163 }
153164}
154165
@@ -197,7 +208,6 @@ impl<'a> TomlTweaker<'a> {
197208 self . remove_missing_items ( "test" ) ;
198209 self . remove_parent_workspaces ( ) ;
199210 self . remove_unwanted_cargo_features ( ) ;
200- self . remove_dependencies ( ) ;
201211 self . apply_patches ( ) ;
202212
203213 info ! ( "finished tweaking {}" , self . krate) ;
@@ -284,21 +294,6 @@ impl<'a> TomlTweaker<'a> {
284294 }
285295 }
286296
287- fn remove_dependencies ( & mut self ) {
288- let krate = self . krate . to_string ( ) ;
289-
290- Self :: remove_dependencies_from_table ( & mut self . table , & krate) ;
291-
292- // Tweak target-specific dependencies
293- if let Some ( & mut Value :: Table ( ref mut targets) ) = self . table . get_mut ( "target" ) {
294- for ( _, target) in targets. iter_mut ( ) {
295- if let Value :: Table ( ref mut target_table) = * target {
296- Self :: remove_dependencies_from_table ( target_table, & krate) ;
297- }
298- }
299- }
300- }
301-
302297 fn apply_patches ( & mut self ) {
303298 if !self . patches . is_empty ( ) {
304299 let mut patch_table = self . table . get_mut ( "patch" ) ;
@@ -335,24 +330,6 @@ impl<'a> TomlTweaker<'a> {
335330 }
336331 }
337332
338- // This is not a method to avoid borrow checker problems
339- fn remove_dependencies_from_table ( table : & mut Table , krate : & str ) {
340- // Convert path dependencies to registry dependencies
341- for section in & [ "dependencies" , "dev-dependencies" , "build-dependencies" ] {
342- if let Some ( & mut Value :: Table ( ref mut deps) ) = table. get_mut ( * section) {
343- // Iterate through the "name = { ... }", removing any "path"
344- // keys in the dependency definition
345- for ( dep_name, v) in deps. iter_mut ( ) {
346- if let Value :: Table ( ref mut dep_props) = * v {
347- if dep_props. remove ( "path" ) . is_some ( ) {
348- info ! ( "removed path dependency {} from {}" , dep_name, krate) ;
349- }
350- }
351- }
352- }
353- }
354- }
355-
356333 pub fn save ( self , output_file : & Path ) -> Result < ( ) , Error > {
357334 let crate_name = self . krate . to_string ( ) ;
358335 :: std:: fs:: write ( output_file, Value :: Table ( self . table ) . to_string ( ) . as_bytes ( ) ) ?;
@@ -383,6 +360,9 @@ pub enum PrepareError {
383360 /// Some of this crate's dependencies were yanked, preventing Crater from fetching them.
384361 #[ fail( display = "the crate depends on yanked dependencies" ) ]
385362 YankedDependencies ,
363+ /// Some of the dependencies do not exist anymore.
364+ #[ fail( display = "the crate depends on missing dependencies" ) ]
365+ MissingDependencies ,
386366}
387367
388368#[ cfg( test) ]
@@ -400,15 +380,6 @@ mod tests {
400380 [ package]
401381 name = "foo"
402382 version = "1.0"
403-
404- [ dependencies]
405- bar = "1.0"
406-
407- [ dev-dependencies]
408- baz = "1.0"
409-
410- [ target. "cfg(unix)" . dependencies]
411- quux = "1.0"
412383 } ;
413384
414385 let result = toml. clone ( ) ;
@@ -434,15 +405,6 @@ mod tests {
434405 publish-lockfile = true
435406 default -run = "foo"
436407
437- [ dependencies]
438- bar = { version = "1.0" , path = "../bar" }
439-
440- [ dev-dependencies]
441- baz = { version = "1.0" , path = "../baz" }
442-
443- [ target. "cfg(unix)" . dependencies]
444- quux = { version = "1.0" , path = "../quux" }
445-
446408 [ workspace]
447409 members = [ ]
448410 } ;
@@ -454,15 +416,6 @@ mod tests {
454416 name = "foo"
455417 version = "1.0"
456418
457- [ dependencies]
458- bar = { version = "1.0" }
459-
460- [ dev-dependencies]
461- baz = { version = "1.0" }
462-
463- [ target. "cfg(unix)" . dependencies]
464- quux = { version = "1.0" }
465-
466419 [ workspace]
467420 members = [ ]
468421 } ;
0 commit comments