axbuild 0.4.17

An OS build lib toolkit used by arceos
Documentation
use std::time::Instant;

use anyhow::{Context, bail};
use chrono::Local;

mod check;
mod env;
mod expand;
mod report;
mod runner;
mod selection;
mod targets;
mod timing;

#[cfg(test)]
mod tests;

use expand::expand_clippy_checks;
use report::print_report_summary;
use runner::{ProcessCargoRunner, run_clippy_checks};
use selection::{
    clippy_metadata_needs_deps, resolve_requested_packages, skip_unsupported_packages,
    validate_clippy_args, workspace_packages,
};
use timing::print_clippy_timing;

pub(super) const DEFAULT_FEATURE: &str = "default";
pub(super) const AXSTD_STD_PACKAGE: &str = "ax-std";
pub(super) const AXSTD_STD_DEFAULT_FEATURE: &str = "default";
pub(super) const AXSTD_STD_CLIPPY_FEATURES: &str = "std-compat,fs,multitask,irq,net";
pub(super) const AXSTD_STD_CLIPPY_TARGET: &str = "x86_64-unknown-none";
pub(super) const AX_HAL_PACKAGE: &str = "ax-hal";

pub(crate) fn run_workspace_clippy_command(args: &crate::ClippyArgs) -> anyhow::Result<()> {
    validate_clippy_args(args)?;
    let started_at = Local::now();
    let timer = Instant::now();
    println!(
        "clippy started at: {}",
        started_at.format("%Y-%m-%d %H:%M:%S %z")
    );
    let workspace_manifest = crate::context::workspace_manifest_path()?;
    let metadata = if clippy_metadata_needs_deps(args) {
        crate::context::workspace_metadata_root_manifest_with_deps(&workspace_manifest)
    } else {
        crate::context::workspace_metadata_root_manifest(&workspace_manifest)
    }
    .context("failed to load cargo metadata")?;
    let workspace_root = metadata.workspace_root.clone().into_std_path_buf();
    let all_packages = workspace_packages(&metadata);
    let packages = skip_unsupported_packages(resolve_requested_packages(
        args,
        &workspace_root,
        &metadata,
        &all_packages,
    )?);
    if packages.is_empty() {
        println!(
            "no clippy packages selected from {}; skipping",
            workspace_root.display()
        );
        print_clippy_timing(timer.elapsed());
        return Ok(());
    }
    let checks = expand_clippy_checks(&packages, &metadata)?;

    println!(
        "running clippy for {} package(s) with {} check(s) from {}",
        packages.len(),
        checks.len(),
        workspace_root.display()
    );

    let mut runner = ProcessCargoRunner;
    let report = match run_clippy_checks(&mut runner, &workspace_root, &checks) {
        Ok(report) => report,
        Err(err) => {
            print_clippy_timing(timer.elapsed());
            return Err(err);
        }
    };
    print_report_summary(&report);
    print_clippy_timing(timer.elapsed());

    if report.failed_packages().is_empty() {
        println!("all clippy checks passed");
        return Ok(());
    }

    bail!(
        "clippy failed for {} package(s): {}",
        report.failed_packages().len(),
        report.failed_packages().join(", ")
    )
}