@@ -9,7 +9,7 @@ toml = "0.8.10"
99---
1010
1111use 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 } ;
1313
1414fn main ( ) {
1515 let workspace_root = get_workspace_root ( ) ;
@@ -29,25 +29,52 @@ fn main() {
2929 . dependencies
3030 . as_ref ( )
3131 . 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 ( ) ;
3336
3437 // Extract workspace members.
35- for relative_path in workspace_manifest
38+ let members = workspace_manifest
3639 . workspace
3740 . as_ref ( )
3841 . expect ( "expected workspace" )
3942 . members
4043 . 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+ }
4967 }
5068
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 ( ) ;
5178 crate_names. sort ( ) ;
5279 let crate_names_path = workspace_root
5380 . join ( "eng/dict/crates.txt" )
0 commit comments