From d9dcfd81c5d4325379ac88c4250b9c77ecbd75e8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 1 Mar 2021 20:16:23 +0300 Subject: Simplify xtask lib/bin/test separation isn't really needed. --- xtask/src/main.rs | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 127 insertions(+), 7 deletions(-) (limited to 'xtask/src/main.rs') diff --git a/xtask/src/main.rs b/xtask/src/main.rs index cbb9b315e..48c0d9920 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -7,22 +7,35 @@ //! //! This binary is integrated into the `cargo` command line by using an alias in //! `.cargo/config`. +mod codegen; +mod ast_src; +#[cfg(test)] +mod tidy; -use std::env; +mod install; +mod release; +mod dist; +mod pre_commit; +mod metrics; +mod pre_cache; -use anyhow::bail; +use anyhow::{bail, Result}; use codegen::CodegenCmd; use pico_args::Arguments; -use xshell::{cmd, cp, pushd}; -use xtask::{ - codegen::{self, Mode}, +use std::{ + env, + path::{Path, PathBuf}, +}; +use walkdir::{DirEntry, WalkDir}; +use xshell::{cmd, cp, pushd, pushenv}; + +use crate::{ + codegen::Mode, dist::DistCmd, install::{InstallCmd, Malloc, ServerOpt}, metrics::MetricsCmd, pre_cache::PreCacheCmd, - pre_commit, project_root, release::{PromoteCmd, ReleaseCmd}, - run_clippy, run_fuzzer, run_rustfmt, Result, }; fn main() -> Result<()> { @@ -172,3 +185,110 @@ fn finish_args(args: Arguments) -> Result<()> { } Ok(()) } + +fn project_root() -> PathBuf { + Path::new( + &env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()), + ) + .ancestors() + .nth(1) + .unwrap() + .to_path_buf() +} + +fn rust_files() -> impl Iterator { + rust_files_in(&project_root().join("crates")) +} + +#[cfg(test)] +fn cargo_files() -> impl Iterator { + files_in(&project_root(), "toml") + .filter(|path| path.file_name().map(|it| it == "Cargo.toml").unwrap_or(false)) +} + +fn rust_files_in(path: &Path) -> impl Iterator { + files_in(path, "rs") +} + +fn run_rustfmt(mode: Mode) -> Result<()> { + let _dir = pushd(project_root())?; + let _e = pushenv("RUSTUP_TOOLCHAIN", "stable"); + ensure_rustfmt()?; + let check = match mode { + Mode::Overwrite => &[][..], + Mode::Verify => &["--", "--check"], + }; + cmd!("cargo fmt {check...}").run()?; + Ok(()) +} + +fn ensure_rustfmt() -> Result<()> { + let out = cmd!("rustfmt --version").read()?; + if !out.contains("stable") { + bail!( + "Failed to run rustfmt from toolchain 'stable'. \ + Please run `rustup component add rustfmt --toolchain stable` to install it.", + ) + } + Ok(()) +} + +fn run_clippy() -> Result<()> { + if cmd!("cargo clippy --version").read().is_err() { + bail!( + "Failed run cargo clippy. \ + Please run `rustup component add clippy` to install it.", + ) + } + + let allowed_lints = " + -A clippy::collapsible_if + -A clippy::needless_pass_by_value + -A clippy::nonminimal_bool + -A clippy::redundant_pattern_matching + " + .split_ascii_whitespace(); + cmd!("cargo clippy --all-features --all-targets -- {allowed_lints...}").run()?; + Ok(()) +} + +fn run_fuzzer() -> Result<()> { + let _d = pushd("./crates/syntax")?; + let _e = pushenv("RUSTUP_TOOLCHAIN", "nightly"); + if cmd!("cargo fuzz --help").read().is_err() { + cmd!("cargo install cargo-fuzz").run()?; + }; + + // Expecting nightly rustc + let out = cmd!("rustc --version").read()?; + if !out.contains("nightly") { + bail!("fuzz tests require nightly rustc") + } + + cmd!("cargo fuzz run parser").run()?; + Ok(()) +} + +fn date_iso() -> Result { + let res = cmd!("date --iso --utc").read()?; + Ok(res) +} + +fn is_release_tag(tag: &str) -> bool { + tag.len() == "2020-02-24".len() && tag.starts_with(|c: char| c.is_ascii_digit()) +} + +fn files_in(path: &Path, ext: &'static str) -> impl Iterator { + let iter = WalkDir::new(path); + return iter + .into_iter() + .filter_entry(|e| !is_hidden(e)) + .map(|e| e.unwrap()) + .filter(|e| !e.file_type().is_dir()) + .map(|e| e.into_path()) + .filter(move |path| path.extension().map(|it| it == ext).unwrap_or(false)); + + fn is_hidden(entry: &DirEntry) -> bool { + entry.file_name().to_str().map(|s| s.starts_with('.')).unwrap_or(false) + } +} -- cgit v1.2.3