use crate::clippy_project_root; use std::ffi::OsStr; use std::fs; use std::path::{Path, PathBuf}; use walkdir::WalkDir; // The maximum length allowed for stderr files. // // We limit this because small files are easier to deal with than bigger files. const LENGTH_LIMIT: usize = 200; pub fn check() { let exceeding_files: Vec<_> = exceeding_stderr_files(); if !exceeding_files.is_empty() { eprintln!("Error: stderr files exceeding limit of {} lines:", LENGTH_LIMIT); for (path, count) in exceeding_files { println!("{}: {}", path.display(), count); } std::process::exit(1); } } fn exceeding_stderr_files() -> Vec<(PathBuf, usize)> { // We use `WalkDir` instead of `fs::read_dir` here in order to recurse into subdirectories. WalkDir::new(clippy_project_root().join("tests/ui")) .into_iter() .filter_map(Result::ok) .filter(|f| !f.file_type().is_dir()) .filter_map(|e| { let p = e.into_path(); let count = count_linenumbers(&p); if p.extension() == Some(OsStr::new("stderr")) && count > LENGTH_LIMIT { Some((p, count)) } else { None } }) .collect() } #[must_use] fn count_linenumbers(filepath: &Path) -> usize { match fs::read(filepath) { Ok(content) => bytecount::count(&content, b'\n'), Err(e) => { eprintln!("Failed to read file: {}", e); 0 }, } }