@@ -9,7 +9,7 @@ toml = "0.8.10"
9
9
---
10
10
11
11
use cargo_util_schemas:: manifest:: TomlManifest ;
12
- use std:: { ffi:: OsStr , fs, io:: Write as _, path:: PathBuf } ;
12
+ use std:: { collections :: HashSet , ffi:: OsStr , fs, io:: Write as _, path:: PathBuf } ;
13
13
14
14
fn main ( ) {
15
15
let workspace_root = get_workspace_root ( ) ;
@@ -29,25 +29,52 @@ fn main() {
29
29
. dependencies
30
30
. as_ref ( )
31
31
. expect ( "expected workspace dependencies" ) ;
32
- let mut crate_names: Vec < String > = dependencies. iter ( ) . map ( |( name, _) | name. to_string ( ) ) . collect ( ) ;
32
+ let mut crate_names: HashSet < String > = dependencies
33
+ . iter ( )
34
+ . map ( |( name, _) | name. to_string ( ) )
35
+ . collect ( ) ;
33
36
34
37
// Extract workspace members.
35
- for relative_path in workspace_manifest
38
+ let members = workspace_manifest
36
39
. workspace
37
40
. as_ref ( )
38
41
. expect ( "expected workspace" )
39
42
. members
40
43
. as_ref ( )
41
- . expect ( "expected workspace members" )
42
- . into_iter ( ) {
43
- let crate_name = PathBuf :: from ( relative_path)
44
- . file_stem ( )
45
- . and_then ( OsStr :: to_str)
46
- . expect ( "expected crate name" )
47
- . to_string ( ) ;
48
- crate_names. push ( crate_name) ;
44
+ . expect ( "expected workspace members" ) ;
45
+
46
+ for relative_path in members. into_iter ( ) {
47
+ let member_dir_name = PathBuf :: from ( relative_path)
48
+ . file_stem ( )
49
+ . map ( |s| s. to_string_lossy ( ) . into_owned ( ) )
50
+ . expect ( "member directory name" ) ;
51
+ let member_manifest_path = workspace_root. join ( relative_path) . join ( "Cargo.toml" ) ;
52
+ eprintln ! ( "Reading member manifest {member_manifest_path:?}" ) ;
53
+ let member_manifest = fs:: read_to_string ( & member_manifest_path)
54
+ . unwrap_or_else ( |_| panic ! ( "member manifest content: {member_manifest_path:?}" ) ) ;
55
+ let member_manifest: TomlManifest = toml:: from_str ( & member_manifest)
56
+ . unwrap_or_else ( |_| panic ! ( "deserialize member manifest: {member_manifest_path:?}" ) ) ;
57
+
58
+ let sections = [
59
+ member_manifest. dependencies ,
60
+ member_manifest. dev_dependencies ,
61
+ member_manifest. build_dependencies ,
62
+ ] ;
63
+ for section in sections. iter ( ) . flatten ( ) {
64
+ for ( name, _) in section. iter ( ) {
65
+ crate_names. insert ( name. to_string ( ) ) ;
66
+ }
49
67
}
50
68
69
+ // Add the crate name for this member.
70
+ if let Some ( name) = member_manifest. package . as_ref ( ) . map ( |p| p. name . as_ref ( ) ) {
71
+ crate_names. insert ( name. to_string ( ) ) ;
72
+ } else {
73
+ crate_names. insert ( member_dir_name. to_string ( ) ) ;
74
+ }
75
+ }
76
+
77
+ let mut crate_names: Vec < String > = crate_names. into_iter ( ) . collect ( ) ;
51
78
crate_names. sort ( ) ;
52
79
let crate_names_path = workspace_root
53
80
. join ( "eng/dict/crates.txt" )
0 commit comments