refactor(xtask): derive closure from Cargo metadata
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Test / Lint (push) Failing after 2m1s
Test / Test (push) Skipped
Test / Render parity (push) Skipped

This commit is contained in:
2026-07-18 05:59:59 +04:00
parent cd57d16d60
commit 6ca7ab4f42
+36 -11
View File
@@ -891,21 +891,34 @@ fn validate_cargo_metadata_dependency_closures(
root: &Path, root: &Path,
failures: &mut Vec<String>, failures: &mut Vec<String>,
) -> Result<(), String> { ) -> Result<(), String> {
let mut manifests = Vec::new(); let metadata = workspace_metadata(root)?;
collect_cargo_manifests(root, &mut manifests)?; let deps_by_package = workspace_dependency_names(&metadata);
let mut deps_by_package = BTreeMap::new();
for manifest in manifests {
let policy = load_cargo_manifest_policy(&manifest)?;
let Some(package) = policy.package_name() else {
continue;
};
deps_by_package.insert(package.to_string(), policy.dependency_names());
}
validate_package_closure_excludes("fparkan-headless", &deps_by_package, failures); validate_package_closure_excludes("fparkan-headless", &deps_by_package, failures);
Ok(()) Ok(())
} }
/// Returns declared direct dependencies for each workspace package from Cargo's
/// own metadata model. Cargo, rather than a source-text heuristic, resolves
/// package identities and workspace membership before this policy sees them.
fn workspace_dependency_names(
metadata: &cargo_metadata::Metadata,
) -> BTreeMap<String, BTreeSet<String>> {
metadata
.workspace_packages()
.iter()
.map(|package| {
(
package.name.to_string(),
package
.dependencies
.iter()
.map(|dependency| dependency.name.clone())
.collect(),
)
})
.collect()
}
fn validate_package_closure_excludes( fn validate_package_closure_excludes(
package: &str, package: &str,
deps_by_package: &BTreeMap<String, BTreeSet<String>>, deps_by_package: &BTreeMap<String, BTreeSet<String>>,
@@ -3481,6 +3494,18 @@ mod tests {
Ok(()) Ok(())
} }
#[test]
fn workspace_metadata_keeps_headless_closure_platform_free() -> Result<(), String> {
let metadata = workspace_metadata(&workspace_root_path())?;
let dependencies = workspace_dependency_names(&metadata);
let mut failures = Vec::new();
validate_package_closure_excludes("fparkan-headless", &dependencies, &mut failures);
assert!(failures.is_empty(), "{failures:?}");
Ok(())
}
#[test] #[test]
fn parses_manifest_dependencies_for_arch_policy() { fn parses_manifest_dependencies_for_arch_policy() {
let manifest = r#" let manifest = r#"