refactor(xtask): derive closure from Cargo metadata
This commit is contained in:
+36
-11
@@ -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#"
|
||||||
|
|||||||
Reference in New Issue
Block a user