summary refs log tree commit diff
path: root/pkgs/test/nixpkgs-check-by-name/src/structure.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/test/nixpkgs-check-by-name/src/structure.rs')
-rw-r--r--pkgs/test/nixpkgs-check-by-name/src/structure.rs166
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())
+    }
 }