diff options
Diffstat (limited to 'pkgs/test/nixpkgs-check-by-name/src/structure.rs')
-rw-r--r-- | pkgs/test/nixpkgs-check-by-name/src/structure.rs | 166 |
1 files changed, 86 insertions, 80 deletions
diff --git a/pkgs/test/nixpkgs-check-by-name/src/structure.rs b/pkgs/test/nixpkgs-check-by-name/src/structure.rs index 90a552a388637..b69f6211c0a05 100644 --- a/pkgs/test/nixpkgs-check-by-name/src/structure.rs +++ b/pkgs/test/nixpkgs-check-by-name/src/structure.rs @@ -1,10 +1,13 @@ use crate::check_result; -use crate::check_result::{CheckProblem, CheckResult}; +use crate::check_result::CheckResult; +use crate::nixpkgs_problem::NixpkgsProblem; use crate::references; use crate::utils; use crate::utils::{BASE_SUBPATH, PACKAGE_NIX_FILENAME}; +use itertools::concat; use lazy_static::lazy_static; use regex::Regex; +use std::fs::DirEntry; use std::path::{Path, PathBuf}; lazy_static! { @@ -30,8 +33,8 @@ pub fn relative_file_for_package(package_name: &str) -> PathBuf { relative_dir_for_package(package_name).join(PACKAGE_NIX_FILENAME) } -/// Read the structure of a Nixpkgs directory, displaying errors on the writer. -/// May return early with I/O errors. +/// Check the structure of Nixpkgs, returning the attribute names that are defined in +/// `pkgs/by-name` pub fn check_structure(path: &Path) -> CheckResult<Vec<String>> { let base_dir = path.join(BASE_SUBPATH); @@ -46,7 +49,7 @@ pub fn check_structure(path: &Path) -> CheckResult<Vec<String>> { // README.md is allowed to be a file and not checked check_result::ok(vec![]) } else if !shard_path.is_dir() { - CheckProblem::ShardNonDir { + NixpkgsProblem::ShardNonDir { relative_shard_path: relative_shard_path.clone(), } .into_result() @@ -54,7 +57,7 @@ pub fn check_structure(path: &Path) -> CheckResult<Vec<String>> { } else { let shard_name_valid = SHARD_NAME_REGEX.is_match(&shard_name); let result = if !shard_name_valid { - CheckProblem::InvalidShardName { + NixpkgsProblem::InvalidShardName { relative_shard_path: relative_shard_path.clone(), shard_name: shard_name.clone(), } @@ -72,7 +75,7 @@ pub fn check_structure(path: &Path) -> CheckResult<Vec<String>> { l.file_name().to_ascii_lowercase() == r.file_name().to_ascii_lowercase() }) .map(|(l, r)| { - CheckProblem::CaseSensitiveDuplicate { + NixpkgsProblem::CaseSensitiveDuplicate { relative_shard_path: relative_shard_path.clone(), first: l.file_name(), second: r.file_name(), @@ -83,84 +86,87 @@ pub fn check_structure(path: &Path) -> CheckResult<Vec<String>> { let result = check_result::and(result, check_result::sequence_(duplicate_results)); let package_results = entries.into_iter().map(|package_entry| { - let package_path = package_entry.path(); - let package_name = package_entry.file_name().to_string_lossy().into_owned(); - let relative_package_dir = - PathBuf::from(format!("{BASE_SUBPATH}/{shard_name}/{package_name}")); - - if !package_path.is_dir() { - CheckProblem::PackageNonDir { - relative_package_dir: relative_package_dir.clone(), - } - .into_result() - } else { - let package_name_valid = PACKAGE_NAME_REGEX.is_match(&package_name); - let result = if !package_name_valid { - CheckProblem::InvalidPackageName { - relative_package_dir: relative_package_dir.clone(), - package_name: package_name.clone(), - } - .into_result() - } else { - check_result::ok(()) - }; - - let correct_relative_package_dir = relative_dir_for_package(&package_name); - let result = check_result::and( - result, - if relative_package_dir != correct_relative_package_dir { - // Only show this error if we have a valid shard and package name - // Because if one of those is wrong, you should fix that first - if shard_name_valid && package_name_valid { - CheckProblem::IncorrectShard { - relative_package_dir: relative_package_dir.clone(), - correct_relative_package_dir: correct_relative_package_dir - .clone(), - } - .into_result() - } else { - check_result::ok(()) - } - } else { - check_result::ok(()) - }, - ); - - let package_nix_path = package_path.join(PACKAGE_NIX_FILENAME); - let result = check_result::and( - result, - if !package_nix_path.exists() { - CheckProblem::PackageNixNonExistent { - relative_package_dir: relative_package_dir.clone(), - } - .into_result() - } else if package_nix_path.is_dir() { - CheckProblem::PackageNixDir { - relative_package_dir: relative_package_dir.clone(), - } - .into_result() - } else { - check_result::ok(()) - }, - ); - - let result = check_result::and( - result, - references::check_references( - &relative_package_dir, - &path.join(&relative_package_dir), - ), - ); - - check_result::map(result, |_| package_name.clone()) - } + check_package(path, &shard_name, shard_name_valid, package_entry) }); check_result::and(result, check_result::sequence(package_results)) } }); - check_result::map(check_result::sequence(shard_results), |x| { - x.into_iter().flatten().collect::<Vec<_>>() - }) + // Combine the package names conatained within each shard into a longer list + check_result::map(check_result::sequence(shard_results), concat) +} + +fn check_package( + path: &Path, + shard_name: &str, + shard_name_valid: bool, + package_entry: DirEntry, +) -> CheckResult<String> { + let package_path = package_entry.path(); + let package_name = package_entry.file_name().to_string_lossy().into_owned(); + let relative_package_dir = PathBuf::from(format!("{BASE_SUBPATH}/{shard_name}/{package_name}")); + + if !package_path.is_dir() { + NixpkgsProblem::PackageNonDir { + relative_package_dir: relative_package_dir.clone(), + } + .into_result() + } else { + let package_name_valid = PACKAGE_NAME_REGEX.is_match(&package_name); + let result = if !package_name_valid { + NixpkgsProblem::InvalidPackageName { + relative_package_dir: relative_package_dir.clone(), + package_name: package_name.clone(), + } + .into_result() + } else { + check_result::ok(()) + }; + + let correct_relative_package_dir = relative_dir_for_package(&package_name); + let result = check_result::and( + result, + if relative_package_dir != correct_relative_package_dir { + // Only show this error if we have a valid shard and package name + // Because if one of those is wrong, you should fix that first + if shard_name_valid && package_name_valid { + NixpkgsProblem::IncorrectShard { + relative_package_dir: relative_package_dir.clone(), + correct_relative_package_dir: correct_relative_package_dir.clone(), + } + .into_result() + } else { + check_result::ok(()) + } + } else { + check_result::ok(()) + }, + ); + + let package_nix_path = package_path.join(PACKAGE_NIX_FILENAME); + let result = check_result::and( + result, + if !package_nix_path.exists() { + NixpkgsProblem::PackageNixNonExistent { + relative_package_dir: relative_package_dir.clone(), + } + .into_result() + } else if package_nix_path.is_dir() { + NixpkgsProblem::PackageNixDir { + relative_package_dir: relative_package_dir.clone(), + } + .into_result() + } else { + check_result::ok(()) + }, + ); + + let result = check_result::and( + result, + references::check_references(&relative_package_dir, &path.join(&relative_package_dir)), + ); + + check_result::map(result, |_| package_name.clone()) + } } |