lintcheck: rename a few symbols, add documentation to functions

This commit is contained in:
Matthias Krüger 2021-02-14 18:51:53 +01:00
parent 1b74439871
commit 4856e5f8fc

View File

@ -17,14 +17,14 @@ use clap::ArgMatches;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::Value; use serde_json::Value;
// use this to store the crates when interacting with the crates.toml file /// List of sources to check, loaded from a .toml file
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
struct CrateList { struct SourceList {
crates: HashMap<String, TomlCrate>, crates: HashMap<String, TomlCrate>,
} }
// crate data we stored in the toml, can have multiple versions per crate /// A crate source stored inside the .toml
// A single TomlCrate is laster mapped to several CrateSources in that case /// will be translated into on one of the `CrateSource` variants
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
struct TomlCrate { struct TomlCrate {
name: String, name: String,
@ -34,7 +34,8 @@ struct TomlCrate {
path: Option<String>, path: Option<String>,
} }
// represents an archive we download from crates.io, or a git repo, or a local repo /// Represents an archive we download from crates.io, or a git repo, or a local repo/folder
/// Once processed (downloaded/extracted/cloned/copied...), this will be translated into a `Crate`
#[derive(Debug, Serialize, Deserialize, Eq, Hash, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, Hash, PartialEq)]
enum CrateSource { enum CrateSource {
CratesIo { name: String, version: String }, CratesIo { name: String, version: String },
@ -42,9 +43,7 @@ enum CrateSource {
Path { name: String, path: PathBuf }, Path { name: String, path: PathBuf },
} }
// represents the extracted sourcecode of a crate /// Represents the actual source code of a crate that we ran "cargo clippy" on
// we actually don't need to special-case git repos here because it does not matter for clippy, yay!
// (clippy only needs a simple path)
#[derive(Debug)] #[derive(Debug)]
struct Crate { struct Crate {
version: String, version: String,
@ -53,6 +52,7 @@ struct Crate {
path: PathBuf, path: PathBuf,
} }
/// A single warning that clippy issued while checking a `Crate`
#[derive(Debug)] #[derive(Debug)]
struct ClippyWarning { struct ClippyWarning {
crate_name: String, crate_name: String,
@ -76,6 +76,9 @@ impl std::fmt::Display for ClippyWarning {
} }
impl CrateSource { impl CrateSource {
/// Makes the sources available on the disk for clippy to check.
/// Clones a git repo and checks out the specified commit or downloads a crate from crates.io or
/// copies a local folder
fn download_and_extract(&self) -> Crate { fn download_and_extract(&self) -> Crate {
match self { match self {
CrateSource::CratesIo { name, version } => { CrateSource::CratesIo { name, version } => {
@ -178,6 +181,8 @@ impl CrateSource {
} }
impl Crate { impl Crate {
/// Run `cargo clippy` on the `Crate` and collect and return all the lint warnings that clippy
/// issued
fn run_clippy_lints(&self, cargo_clippy_path: &PathBuf) -> Vec<ClippyWarning> { fn run_clippy_lints(&self, cargo_clippy_path: &PathBuf) -> Vec<ClippyWarning> {
println!("Linting {} {}...", &self.name, &self.version); println!("Linting {} {}...", &self.name, &self.version);
let cargo_clippy_path = std::fs::canonicalize(cargo_clippy_path).unwrap(); let cargo_clippy_path = std::fs::canonicalize(cargo_clippy_path).unwrap();
@ -218,6 +223,7 @@ impl Crate {
} }
} }
/// Builds clippy inside the repo to make sure we have a clippy executable we can use.
fn build_clippy() { fn build_clippy() {
Command::new("cargo") Command::new("cargo")
.arg("build") .arg("build")
@ -225,7 +231,7 @@ fn build_clippy() {
.expect("Failed to build clippy!"); .expect("Failed to build clippy!");
} }
// get a list of CrateSources we want to check from a "lintcheck_crates.toml" file. /// Read a `toml` file and return a list of `CrateSources` that we want to check with clippy
fn read_crates(toml_path: Option<&str>) -> (String, Vec<CrateSource>) { fn read_crates(toml_path: Option<&str>) -> (String, Vec<CrateSource>) {
let toml_path = PathBuf::from( let toml_path = PathBuf::from(
env::var("LINTCHECK_TOML").unwrap_or(toml_path.unwrap_or("clippy_dev/lintcheck_crates.toml").to_string()), env::var("LINTCHECK_TOML").unwrap_or(toml_path.unwrap_or("clippy_dev/lintcheck_crates.toml").to_string()),
@ -234,7 +240,7 @@ fn read_crates(toml_path: Option<&str>) -> (String, Vec<CrateSource>) {
let toml_filename = toml_path.file_stem().unwrap().to_str().unwrap().to_string(); let toml_filename = toml_path.file_stem().unwrap().to_str().unwrap().to_string();
let toml_content: String = let toml_content: String =
std::fs::read_to_string(&toml_path).unwrap_or_else(|_| panic!("Failed to read {}", toml_path.display())); std::fs::read_to_string(&toml_path).unwrap_or_else(|_| panic!("Failed to read {}", toml_path.display()));
let crate_list: CrateList = let crate_list: SourceList =
toml::from_str(&toml_content).unwrap_or_else(|e| panic!("Failed to parse {}: \n{}", toml_path.display(), e)); toml::from_str(&toml_content).unwrap_or_else(|e| panic!("Failed to parse {}: \n{}", toml_path.display(), e));
// parse the hashmap of the toml file into a list of crates // parse the hashmap of the toml file into a list of crates
let tomlcrates: Vec<TomlCrate> = crate_list let tomlcrates: Vec<TomlCrate> = crate_list
@ -288,7 +294,7 @@ fn read_crates(toml_path: Option<&str>) -> (String, Vec<CrateSource>) {
(toml_filename, crate_sources) (toml_filename, crate_sources)
} }
// extract interesting data from a json lint message /// Parse the json output of clippy and return a `ClippyWarning`
fn parse_json_message(json_message: &str, krate: &Crate) -> ClippyWarning { fn parse_json_message(json_message: &str, krate: &Crate) -> ClippyWarning {
let jmsg: Value = serde_json::from_str(&json_message).unwrap_or_else(|e| panic!("Failed to parse json:\n{:?}", e)); let jmsg: Value = serde_json::from_str(&json_message).unwrap_or_else(|e| panic!("Failed to parse json:\n{:?}", e));
@ -313,7 +319,7 @@ fn parse_json_message(json_message: &str, krate: &Crate) -> ClippyWarning {
} }
} }
// the main fn /// lintchecks `main()` function
pub fn run(clap_config: &ArgMatches) { pub fn run(clap_config: &ArgMatches) {
let cargo_clippy_path: PathBuf = PathBuf::from("target/debug/cargo-clippy"); let cargo_clippy_path: PathBuf = PathBuf::from("target/debug/cargo-clippy");