commit 9ad2168c20bf409f5968d3a9952bc53a2033db6e
parent 5245d7fdf487ac905f2ddd47f635d349f9911465
Author: triesap <tyson@radroots.org>
Date: Fri, 21 Aug 2026 01:06:33 +0000
build: stabilize API qualification
- clear only extbuild-owned Rustdoc artifacts before each package
- prevent stale HTML or dependency fingerprints from hiding JSON output
- preserve the governed cargo-semver-checks contract and target routing
- cover the exact bounded cleanup invocation in xtask tests
Diffstat:
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/tools/xtask/src/api_qualification.rs b/tools/xtask/src/api_qualification.rs
@@ -29,6 +29,7 @@ pub fn run(root: &Path) -> Result<(), String> {
verify_revision(root, &baseline.revision)?;
}
for package in &contract.packages {
+ clear_rustdoc_artifacts(root)?;
let args = invocation(&contract, package);
eprintln!("cargo {}", args.join(" "));
let status = Command::new("cargo")
@@ -48,6 +49,25 @@ pub fn run(root: &Path) -> Result<(), String> {
Ok(())
}
+fn clear_rustdoc_artifacts(root: &Path) -> Result<(), String> {
+ let args = rustdoc_cleanup_invocation();
+ eprintln!("cargo {}", args.join(" "));
+ let status = Command::new("cargo")
+ .args(args)
+ .current_dir(root)
+ .status()
+ .map_err(|error| format!("failed to start rustdoc cleanup: {error}"))?;
+ if status.success() {
+ Ok(())
+ } else {
+ Err("rustdoc cleanup failed before public API qualification".to_owned())
+ }
+}
+
+fn rustdoc_cleanup_invocation() -> [&'static str; 2] {
+ ["clean", "--doc"]
+}
+
fn load(root: &Path) -> Result<Contract, String> {
let path = root.join("contracts/releases/api_semver.toml");
let raw = fs::read_to_string(&path)
@@ -148,7 +168,7 @@ fn invocation(contract: &Contract, package: &str) -> Vec<String> {
#[cfg(test)]
mod tests {
- use super::{invocation, load, validate};
+ use super::{invocation, load, rustdoc_cleanup_invocation, validate};
#[test]
fn current_contract_covers_all_library_packages() {
@@ -161,5 +181,6 @@ mod tests {
let invocation = invocation(&contract, "radroots_core");
assert!(invocation.contains(&"--all-features".to_owned()));
assert!(invocation.ends_with(&["--release-type".to_owned(), "major".to_owned()]));
+ assert_eq!(rustdoc_cleanup_invocation(), ["clean", "--doc"]);
}
}