Merge pull request #853 from tamird/public-api-mac

xtask: allow public-api regen on aarch64-apple-darwin
pull/854/head
Tamir Duberstein 9 months ago committed by GitHub
commit 1e99ac9323
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,7 +6,7 @@ use std::{
}; };
use anyhow::{bail, Context as _, Result}; use anyhow::{bail, Context as _, Result};
use cargo_metadata::{Metadata, Package}; use cargo_metadata::{Metadata, Package, Target};
use clap::Parser; use clap::Parser;
use dialoguer::{theme::ColorfulTheme, Confirm}; use dialoguer::{theme::ColorfulTheme, Confirm};
use diff::{lines, Result as Diff}; use diff::{lines, Result as Diff};
@ -17,11 +17,15 @@ pub struct Options {
/// Bless new API changes. /// Bless new API changes.
#[clap(long)] #[clap(long)]
pub bless: bool, pub bless: bool,
/// Bless new API changes.
#[clap(long)]
pub target: Option<String>,
} }
pub fn public_api(options: Options, metadata: Metadata) -> Result<()> { pub fn public_api(options: Options, metadata: Metadata) -> Result<()> {
let toolchain = "nightly"; let toolchain = "nightly";
let Options { bless } = options; let Options { bless, target } = options;
if !rustup_toolchain::is_installed(toolchain)? { if !rustup_toolchain::is_installed(toolchain)? {
if Confirm::with_theme(&ColorfulTheme::default()) if Confirm::with_theme(&ColorfulTheme::default())
@ -42,11 +46,29 @@ pub fn public_api(options: Options, metadata: Metadata) -> Result<()> {
let errors: Vec<_> = packages let errors: Vec<_> = packages
.into_iter() .into_iter()
.map(|Package { name, publish, .. }| { .map(
|Package {
name,
publish,
targets,
..
}| {
if matches!(publish, Some(publish) if publish.is_empty()) { if matches!(publish, Some(publish) if publish.is_empty()) {
Ok(()) Ok(())
} else { } else {
let diff = check_package_api(&name, toolchain, bless, workspace_root.as_std_path()) let target = target.as_ref().and_then(|target| {
let proc_macro = targets.iter().any(|Target { kind, .. }| {
kind.iter().any(|kind| kind == "proc-macro")
});
(!proc_macro).then_some(target)
});
let diff = check_package_api(
&name,
toolchain,
target.cloned(),
bless,
workspace_root.as_std_path(),
)
.with_context(|| format!("{name} failed to check public API"))?; .with_context(|| format!("{name} failed to check public API"))?;
if diff.is_empty() { if diff.is_empty() {
Ok(()) Ok(())
@ -56,7 +78,8 @@ pub fn public_api(options: Options, metadata: Metadata) -> Result<()> {
)) ))
} }
} }
}) },
)
.filter_map(|result| match result { .filter_map(|result| match result {
Ok(()) => None, Ok(()) => None,
Err(err) => Some(err), Err(err) => Some(err),
@ -73,6 +96,7 @@ pub fn public_api(options: Options, metadata: Metadata) -> Result<()> {
fn check_package_api( fn check_package_api(
package: &str, package: &str,
toolchain: &str, toolchain: &str,
target: Option<String>,
bless: bool, bless: bool,
workspace_root: &Path, workspace_root: &Path,
) -> Result<String> { ) -> Result<String> {
@ -82,16 +106,28 @@ fn check_package_api(
.join(package) .join(package)
.with_extension("txt"); .with_extension("txt");
let rustdoc_json = rustdoc_json::Builder::default() let mut builder = rustdoc_json::Builder::default()
.toolchain(toolchain) .toolchain(toolchain)
.package(package) .package(package)
.all_features(true) .all_features(true);
.build() if let Some(target) = target {
.context("rustdoc_json::Builder::build")?; builder = builder.target(target);
}
let rustdoc_json = builder.build().with_context(|| {
format!(
"rustdoc_json::Builder::default().toolchain({}).package({}).build()",
toolchain, package
)
})?;
let public_api = public_api::Builder::from_rustdoc_json(rustdoc_json) let public_api = public_api::Builder::from_rustdoc_json(&rustdoc_json)
.build() .build()
.context("public_api::Builder::build")?; .with_context(|| {
format!(
"public_api::Builder::from_rustdoc_json({})::build()",
rustdoc_json.display()
)
})?;
if bless { if bless {
let mut output = let mut output =

Loading…
Cancel
Save