@@ -267,6 +267,78 @@ fn clean_workspace_does_not_touch_non_workspace_packages() {
267267 ) ;
268268}
269269
270+ #[ cargo_test]
271+ fn clean_workspace_with_extra_package_specifiers ( ) {
272+ Package :: new ( "external_dependency_1" , "0.1.0" ) . publish ( ) ;
273+ Package :: new ( "external_dependency_2" , "0.1.0" ) . publish ( ) ;
274+ let foo_manifest = r#"
275+ [package]
276+ name = "foo"
277+ version = "0.1.0"
278+ edition = "2015"
279+
280+ [dependencies]
281+ external_dependency_1 = "0.1.0"
282+ external_dependency_2 = "0.1.0"
283+ "# ;
284+ let p = project ( )
285+ . file (
286+ "Cargo.toml" ,
287+ r#"
288+ [workspace]
289+ members = [
290+ "foo",
291+ "foo_core",
292+ "foo-base",
293+ ]
294+ "# ,
295+ )
296+ . file ( "foo/Cargo.toml" , foo_manifest)
297+ . file ( "foo/src/lib.rs" , "//! foo" )
298+ . file ( "foo_core/Cargo.toml" , & basic_manifest ( "foo_core" , "0.1.0" ) )
299+ . file ( "foo_core/src/lib.rs" , "//! foo_core" )
300+ . file ( "foo-base/Cargo.toml" , & basic_manifest ( "foo-base" , "0.1.0" ) )
301+ . file ( "foo-base/src/lib.rs" , "//! foo-base" )
302+ . build ( ) ;
303+
304+ let fingerprint_path = & p. build_dir ( ) . join ( "debug" ) . join ( ".fingerprint" ) ;
305+
306+ p. cargo ( "check -p foo -p foo_core -p foo-base" ) . run ( ) ;
307+
308+ let mut fingerprint_names = get_fingerprints_without_hashes ( fingerprint_path) ;
309+
310+ // Artifacts present for all after building
311+ assert ! ( fingerprint_names. iter( ) . any( |e| e == "foo" ) ) ;
312+ assert ! ( fingerprint_names. iter( ) . any( |e| e == "foo_core" ) ) ;
313+ assert ! ( fingerprint_names. iter( ) . any( |e| e == "foo-base" ) ) ;
314+
315+ let num_external_dependency_2_artifacts = fingerprint_names
316+ . iter ( )
317+ . filter ( |& e| e == "external_dependency_2" )
318+ . count ( ) ;
319+ assert_ne ! ( num_external_dependency_2_artifacts, 0 ) ;
320+
321+ p. cargo ( "clean -p foo -p foo_core -p foo-base -p external_dependency_1" )
322+ . run ( ) ;
323+
324+ fingerprint_names = get_fingerprints_without_hashes ( fingerprint_path) ;
325+
326+ // Cleaning workspace members and external_dependency_1 leaves artifacts for the external_dependency_2
327+ assert ! (
328+ !fingerprint_names. iter( ) . any( |e| e == "foo"
329+ || e == "foo_core"
330+ || e == "foo-base"
331+ || e == "external_dependency_1" )
332+ ) ;
333+ assert_eq ! (
334+ fingerprint_names
335+ . iter( )
336+ . filter( |& e| e == "external_dependency_2" )
337+ . count( ) ,
338+ num_external_dependency_2_artifacts,
339+ ) ;
340+ }
341+
270342fn get_fingerprints_without_hashes ( fingerprint_path : & Path ) -> Vec < String > {
271343 std:: fs:: read_dir ( fingerprint_path)
272344 . expect ( "Build dir should be readable" )
0 commit comments