@@ -87,14 +87,9 @@ def from_dep_kind(cls, kind: str):
87
87
for dep in next (n ['deps' ] for n in metadata ['resolve' ]['nodes' ] if n ['id' ] == main_package ['id' ]):
88
88
if _need_dev_deps (main_target ) or any (k ['kind' ] is None for k in dep ['dep_kinds' ]):
89
89
dependencies [DependencyNamespace .NORMAL_DEVELOPMENT ][dep ['name' ]] = packages_by_id [dep ['pkg' ]]
90
- if any (k ['kind' ] == [ 'build' ] for k in dep ['dep_kinds' ]):
90
+ if any (k ['kind' ] == 'build' for k in dep ['dep_kinds' ]):
91
91
dependencies [DependencyNamespace .BUILD ][dep ['name' ]] = packages_by_id [dep ['pkg' ]]
92
92
93
- # Decides whether to include `main_package` itself.
94
- # Note that cargo-udeps does not detect it if it is unused.
95
- # https://github.com/est31/cargo-udeps/pull/35
96
- depends_on_main_package_itself = not _is_lib_or_proc_macro (main_target ) and any (map (_is_lib_or_proc_macro , main_package ['targets' ]))
97
-
98
93
# If `cargo_udeps_toolchain` is present, collects packages that are "unused" by `target`.
99
94
unused_packages = defaultdict (set )
100
95
if cargo_udeps_toolchain is not None :
@@ -124,14 +119,22 @@ def from_dep_kind(cls, kind: str):
124
119
#
125
120
# - those detected by cargo-udeps
126
121
# - those come from Crates.io or Git repositories (e.g. `proconio`, other people's libraries including `ac-library-rs`)
122
+
123
+ # `main_package` should always be included.
124
+ # Note that cargo-udeps does not detect it if it is unused.
125
+ # https://github.com/est31/cargo-udeps/pull/35
126
+ depended_packages = [main_package ]
127
+ for dependency_namespace , values in dependencies .items ():
128
+ for depended_package in values .values ():
129
+ if depended_package ['id' ] not in unused_packages [dependency_namespace ] and not depended_package ['source' ]:
130
+ depended_packages .append (depended_package )
131
+
127
132
ret = common_result
128
- depended_packages = [(DependencyNamespace .NORMAL_DEVELOPMENT , main_package )] if depends_on_main_package_itself else []
129
- depended_packages .extend ((dependency_namespace , package ) for dependency_namespace , dependencies in dependencies .items () for package in dependencies .values ())
130
- for dependency_namespace , depended_package in depended_packages :
131
- if depended_package ['id' ] in unused_packages [dependency_namespace ] or depended_package ['source' ]:
132
- continue
133
- depended_target = next (filter (_is_lib_or_proc_macro , depended_package ['targets' ]), None )
134
- if depended_target :
133
+
134
+ for depended_package in depended_packages :
135
+ depended_targets = [t for t in depended_package ['targets' ] if t != main_target and (_is_build (t ) or _is_lib_or_proc_macro (t ))]
136
+ assert len (depended_targets ) <= 2
137
+ for depended_target in depended_targets :
135
138
related_source_files = _related_source_files (basedir , _cargo_metadata_by_manifest_path (pathlib .Path (depended_package ["manifest_path" ])))
136
139
ret |= _source_files_in_same_targets (pathlib .Path (depended_target ['src_path' ]).resolve (strict = True ), related_source_files )
137
140
return sorted (ret )
@@ -168,12 +171,13 @@ def _related_source_files(basedir: pathlib.Path, metadata: Dict[str, Any]) -> Di
168
171
#
169
172
# - https://github.com/rust-lang/cargo/blob/rust-1.49.0/src/cargo/core/compiler/fingerprint.rs#L1979-L1997
170
173
# - https://github.com/rust-lang/cargo/blob/rust-1.49.0/src/cargo/core/compiler/fingerprint.rs#L1824-L1830
171
- dep_info_paths = sorted (
172
- pathlib .Path (metadata ['target_directory' ], 'debug' , 'examples' if _is_example (target ) else 'deps' ).glob (f'{ target ["name" ].replace ("-" , "_" )} -*.d' ),
173
- key = lambda p : p .stat ().st_mtime_ns ,
174
- reverse = True ,
175
- )
176
- for dep_info_path in dep_info_paths :
174
+ if _is_build (target ):
175
+ dep_info_paths = pathlib .Path (metadata ['target_directory' ], 'debug' , 'build' ).rglob (f'{ _crate_name (target )} -*.d' )
176
+ elif _is_example (target ):
177
+ dep_info_paths = pathlib .Path (metadata ['target_directory' ], 'debug' , 'examples' ).glob (f'{ _crate_name (target )} -*.d' )
178
+ else :
179
+ dep_info_paths = pathlib .Path (metadata ['target_directory' ], 'debug' , 'deps' ).glob (f'{ _crate_name (target )} -*.d' )
180
+ for dep_info_path in sorted (dep_info_paths , key = lambda p : p .stat ().st_mtime_ns , reverse = True ):
177
181
with open (dep_info_path ) as file :
178
182
dep_info = file .read ()
179
183
for line in dep_info .splitlines ():
@@ -355,6 +359,14 @@ def _ensure_target(metadata: Dict[str, Any], src_path: pathlib.Path) -> Dict[str
355
359
return target
356
360
357
361
362
+ def _crate_name (target : Dict [str , Any ]) -> bool :
363
+ return target ['name' ].replace ('-' , '_' )
364
+
365
+
366
+ def _is_build (target : Dict [str , Any ]) -> bool :
367
+ return target ['kind' ] == ['custom-build' ]
368
+
369
+
358
370
def _is_lib_or_proc_macro (target : Dict [str , Any ]) -> bool :
359
371
return target ['kind' ] in [['lib' ], ['proc-macro' ]]
360
372
0 commit comments