Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nixpkgs-vet
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: a2ce7688c8ca330b611375c5de9121c53b543cbe
Choose a base ref
..
head repository: NixOS/nixpkgs-vet
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: b0edbd730754e1c69becaa0d4602788f2de73e4a
Choose a head ref
Showing with 198 additions and 57 deletions.
  1. +24 −23 CONTRIBUTING.md
  2. +4 −6 src/eval.rs
  3. +106 −0 src/files.rs
  4. +26 −14 src/main.rs
  5. +23 −7 src/ratchet.rs
  6. +5 −5 src/structure.rs
  7. +10 −2 src/validation.rs
  8. 0 tests/aliases/{ → main}/aliases.nix
  9. 0 tests/aliases/{ → main}/default.nix
  10. 0 tests/aliases/{ → main}/pkgs/by-name/fo/foo/package.nix
  11. 0 tests/aliases/{ → main}/pkgs/top-level/all-packages.nix
  12. 0 tests/alt-callPackage/{ → main}/default.nix
  13. 0 tests/alt-callPackage/{ → main}/pkgs/by-name/fo/foo/package.nix
  14. 0 tests/alt-callPackage/{ → main}/pkgs/top-level/all-packages.nix
  15. 0 tests/base-fixed/{ → main}/default.nix
  16. 0 tests/base-fixed/{ → main}/pkgs/by-name/README.md
  17. 0 tests/base-still-broken/{ → main}/default.nix
  18. 0 tests/base-still-broken/{ → main}/pkgs/by-name/bar
  19. 0 tests/broken-autocall/{ → main}/default.nix
  20. 0 tests/broken-autocall/{ → main}/pkgs/by-name/fo/foo/package.nix
  21. 0 tests/by-name-failure/{ → main}/default.nix
  22. 0 tests/by-name-failure/{ → main}/pkgs/by-name/fo/foo/package.nix
  23. 0 tests/callPackage-syntax/{ → main}/default.nix
  24. 0 tests/callPackage-syntax/{ → main}/pkgs/by-name/README.md
  25. 0 tests/callPackage-syntax/{ → main}/pkgs/top-level/all-packages.nix
  26. 0 tests/empty-base/{ → main}/default.nix
  27. 0 tests/empty-base/{ → main}/pkgs/by-name/README.md
  28. 0 tests/incorrect-shard/{ → main}/default.nix
  29. 0 tests/incorrect-shard/{ → main}/pkgs/by-name/aa/FOO/package.nix
  30. 0 tests/internalCallPackage/{ → main}/default.nix
  31. 0 tests/internalCallPackage/{ → main}/foo.nix
  32. 0 tests/internalCallPackage/{ → main}/pkgs/by-name/README.md
  33. 0 tests/internalCallPackage/{ → main}/pkgs/by-name/fo/foo/package.nix
  34. 0 tests/internalCallPackage/{ → main}/pkgs/top-level/all-packages.nix
  35. 0 tests/invalid-package-name/{ → main}/default.nix
  36. 0 tests/invalid-package-name/{ → main}/pkgs/by-name/fo/fo@/package.nix
  37. 0 tests/invalid-shard-name/{ → main}/default.nix
  38. 0 tests/invalid-shard-name/{ → main}/pkgs/by-name/A/A/.git-keep
  39. 0 tests/invalid-shard-name/{ → main}/pkgs/by-name/A/A/package.nix
  40. 0 tests/manual-definition/{ → main}/default.nix
  41. 0 tests/manual-definition/{ → main}/pkgs/by-name/no/noEval/package.nix
  42. 0 tests/manual-definition/{ → main}/pkgs/by-name/on/onlyMove/package.nix
  43. 0 tests/manual-definition/{ → main}/pkgs/top-level/all-packages.nix
  44. 0 tests/missing-package-nix/{ → main}/default.nix
  45. 0 tests/missing-package-nix/{ → main}/pkgs/by-name/fo/foo/.git-keep
  46. 0 tests/move-to-non-by-name/{ → main}/default.nix
  47. 0 tests/move-to-non-by-name/{ → main}/pkgs/by-name/README.md
  48. 0 tests/move-to-non-by-name/{ → main}/pkgs/top-level/all-packages.nix
  49. 0 tests/move-to-non-by-name/{ → main}/with-config.nix
  50. 0 tests/move-to-non-by-name/{ → main}/without-config.nix
  51. 0 tests/multiple-failures/{ → main}/default.nix
  52. 0 tests/multiple-failures/{ → main}/pkgs/by-name/A/fo@/foo
  53. 0 tests/multiple-failures/{ → main}/pkgs/by-name/A/fo@/package.nix
  54. 0 tests/multiple-failures/{ → main}/pkgs/by-name/aa
  55. 0 tests/multiple-failures/{ → main}/pkgs/by-name/ba/bar
  56. 0 tests/multiple-failures/{ → main}/pkgs/by-name/ba/baz/package.nix/default.nix
  57. 0 tests/multiple-failures/{ → main}/pkgs/by-name/ba/foo/package.nix
  58. 0 tests/multiple-failures/{ → main}/pkgs/by-name/fo/foo/.git-keep
  59. 0 tests/multiple-failures/{ → main}/someDrv.nix
  60. 0 tests/new-package-non-by-name/{ → main}/default.nix
  61. 0 tests/new-package-non-by-name/{ → main}/pkgs/by-name/README.md
  62. 0 tests/new-package-non-by-name/{ → main}/pkgs/top-level/all-packages.nix
  63. 0 tests/new-package-non-by-name/{ → main}/with-config.nix
  64. 0 tests/new-package-non-by-name/{ → main}/without-config.nix
  65. 0 tests/no-by-name/{ → main}/default.nix
  66. 0 tests/no-eval/{ → main}/default.nix
  67. 0 tests/no-eval/{ → main}/pkgs/by-name/README.md
  68. 0 tests/no-eval/{ → main}/pkgs/top-level/all-packages.nix
  69. 0 tests/non-attrs/{ → main}/default.nix
  70. 0 tests/non-attrs/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  71. 0 tests/non-by-name-trace/{ → main}/README.md
  72. 0 tests/non-by-name-trace/{ → main}/default.nix
  73. 0 tests/non-by-name-trace/{ → main}/pkgs/top-level/all-packages.nix
  74. 0 tests/non-derivation/{ → main}/default.nix
  75. 0 tests/non-derivation/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  76. 0 tests/non-syntactical-callPackage-by-name/{ → main}/default.nix
  77. 0 tests/non-syntactical-callPackage-by-name/{ → main}/pkgs/by-name/fo/foo/package.nix
  78. 0 tests/non-syntactical-callPackage-by-name/{ → main}/pkgs/top-level/all-packages.nix
  79. 0 tests/one-letter/{ → main}/default.nix
  80. 0 tests/one-letter/{ → main}/pkgs/by-name/a/a/package.nix
  81. 0 tests/only-callPackage-derivations/{ → main}/default.nix
  82. 0 tests/only-callPackage-derivations/{ → main}/pkgs/by-name/README.md
  83. 0 tests/only-callPackage-derivations/{ → main}/pkgs/top-level/all-packages.nix
  84. 0 tests/override-different-file/{ → main}/default.nix
  85. 0 tests/override-different-file/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  86. 0 tests/override-different-file/{ → main}/pkgs/top-level/all-packages.nix
  87. 0 tests/override-different-file/{ → main}/someDrv.nix
  88. 0 tests/override-empty-arg-gradual/{ → main}/default.nix
  89. 0 tests/override-empty-arg-gradual/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  90. 0 tests/override-empty-arg-gradual/{ → main}/pkgs/top-level/all-packages.nix
  91. 0 tests/override-empty-arg/{ → main}/default.nix
  92. 0 tests/override-empty-arg/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  93. 0 tests/override-empty-arg/{ → main}/pkgs/top-level/all-packages.nix
  94. 0 tests/override-no-call-package/{ → main}/default.nix
  95. 0 tests/override-no-call-package/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  96. 0 tests/override-no-call-package/{ → main}/pkgs/top-level/all-packages.nix
  97. 0 tests/override-no-file/{ → main}/default.nix
  98. 0 tests/override-no-file/{ → main}/pkgs/by-name/no/nonDerivation/package.nix
  99. 0 tests/override-no-file/{ → main}/pkgs/top-level/all-packages.nix
  100. 0 tests/override-non-path/{ → main}/default.nix
  101. 0 tests/override-non-path/{ → main}/pkgs/by-name/fo/foo/package.nix
  102. 0 tests/override-non-path/{ → main}/pkgs/top-level/all-packages.nix
  103. 0 tests/override-success/{ → main}/default.nix
  104. 0 tests/override-success/{ → main}/pkgs/by-name/fo/foo/package.nix
  105. 0 tests/override-success/{ → main}/pkgs/top-level/all-packages.nix
  106. 0 tests/package-dir-is-file/{ → main}/default.nix
  107. 0 tests/package-dir-is-file/{ → main}/pkgs/by-name/fo/foo
  108. 0 tests/package-nix-dir/{ → main}/default.nix
  109. 0 tests/package-nix-dir/{ → main}/pkgs/by-name/fo/foo/package.nix/default.nix
  110. 0 tests/package-variants/{ → main}/default.nix
  111. 0 tests/package-variants/{ → main}/package.nix
  112. 0 tests/package-variants/{ → main}/pkgs/by-name/fo/foo/package.nix
  113. 0 tests/package-variants/{ → main}/pkgs/top-level/all-packages.nix
  114. 0 tests/ref-absolute/{ → main}/default.nix
  115. 0 tests/ref-absolute/{ → main}/pkgs/by-name/aa/aa/package.nix
  116. 0 tests/ref-escape/{ → main}/default.nix
  117. 0 tests/ref-escape/{ → main}/pkgs/by-name/aa/aa/package.nix
  118. 0 tests/ref-nix-path/{ → main}/default.nix
  119. 0 tests/ref-nix-path/{ → main}/pkgs/by-name/aa/aa/package.nix
  120. 0 tests/ref-path-subexpr/{ → main}/default.nix
  121. 0 tests/ref-path-subexpr/{ → main}/pkgs/by-name/aa/aa/package.nix
  122. 0 tests/ref-success/{ → main}/default.nix
  123. 0 tests/ref-success/{ → main}/pkgs/by-name/aa/aa/dir/default.nix
  124. 0 tests/ref-success/{ → main}/pkgs/by-name/aa/aa/file
  125. 0 tests/ref-success/{ → main}/pkgs/by-name/aa/aa/file.nix
  126. 0 tests/ref-success/{ → main}/pkgs/by-name/aa/aa/package.nix
  127. 0 tests/shard-file/{ → main}/default.nix
  128. 0 tests/shard-file/{ → main}/pkgs/by-name/fo
  129. 0 tests/sorted-order/{ → main}/default.nix
  130. 0 tests/sorted-order/{ → main}/pkgs/by-name/a/a/package.nix
  131. 0 tests/sorted-order/{ → main}/pkgs/by-name/c/c/package.nix
  132. 0 tests/sorted-order/{ → main}/pkgs/top-level/all-packages.nix
  133. 0 tests/success/{ → main}/default.nix
  134. 0 tests/success/{ → main}/pkgs/by-name/fo/foo/package.nix
  135. 0 tests/symlink-escape/{ → main}/default.nix
  136. 0 tests/symlink-escape/{ → main}/pkgs/by-name/fo/foo/package.nix
  137. 0 tests/symlink-escape/{ → main}/someDrv.nix
  138. 0 tests/symlink-invalid/{ → main}/default.nix
  139. 0 tests/symlink-invalid/{ → main}/pkgs/by-name/fo/foo/foo
  140. 0 tests/symlink-invalid/{ → main}/pkgs/by-name/fo/foo/package.nix
  141. 0 tests/symlink-invalid/{ → main}/someDrv.nix
  142. 0 tests/unknown-location/{ → main}/default.nix
  143. 0 tests/unknown-location/{ → main}/pkgs/by-name/fo/foo/package.nix
  144. 0 tests/unknown-location/{ → main}/pkgs/top-level/all-packages.nix
  145. 0 tests/uppercase/{ → main}/default.nix
  146. 0 tests/uppercase/{ → main}/pkgs/by-name/fo/FOO/package.nix
  147. 0 tests/with-readme/{ → main}/default.nix
  148. 0 tests/with-readme/{ → main}/pkgs/by-name/README.md
47 changes: 24 additions & 23 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -47,31 +47,32 @@ The most important tools and commands in this environment are:
### Integration tests

Integration tests are declared in [`./tests`](./tests) as subdirectories imitating Nixpkgs with these files:
- `default.nix`:
Always contains
```nix
import <test-nixpkgs> { root = ./.; }
```
which makes
```
nix-instantiate <subdir> --eval -A <attr> --arg overlays <overlays>
```
work very similarly to the real Nixpkgs, just enough for the program to be able to test it.
- `pkgs/by-name`:
The `pkgs/by-name` directory to check.

- `pkgs/top-level/all-packages.nix` (optional):
Contains an overlay of the form
```nix
self: super: {
# ...
}
```
allowing the simulation of package overrides to the real [`pkgs/top-level/all-packages.nix`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/all-packages.nix).
The default is an empty overlay.
- `main`: A Nixpkgs root directory with:
- `default.nix`:
Always contains
```nix
import <test-nixpkgs> { root = ./.; }
```
which makes
```
nix-instantiate <subdir> --eval -A <attr> --arg overlays <overlays>
```
work very similarly to the real Nixpkgs, just enough for the program to be able to test it.
- `pkgs/by-name`:
The `pkgs/by-name` directory to check.
- `pkgs/top-level/all-packages.nix` (optional):
Contains an overlay of the form
```nix
self: super: {
# ...
}
```
allowing the simulation of package overrides to the real [`pkgs/top-level/all-packages.nix`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/all-packages.nix).
The default is an empty overlay.
- `base` (optional):
Contains another subdirectory imitating Nixpkgs with potentially any of the above structures.
Contains another Nixpkgs root directory with potentially any of the above structures.
This is used to test [ratchet checks](./README.md#ratchet-checks).
- `expected` (optional):
10 changes: 4 additions & 6 deletions src/eval.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
use std::{env, fs, process};

@@ -156,7 +157,7 @@ pub fn check_values(
nixpkgs_path: &Path,
nix_file_store: &mut NixFileStore,
package_names: &[String],
) -> validation::Result<ratchet::Nixpkgs> {
) -> validation::Result<BTreeMap<String, ratchet::Package>> {
let work_dir = tempfile::Builder::new()
.prefix("nixpkgs-vet")
.tempdir()
@@ -255,10 +256,7 @@ pub fn check_values(
.collect_vec()?,
);

Ok(check_result.map(|elems| ratchet::Nixpkgs {
package_names: elems.iter().map(|(name, _)| name.to_owned()).collect(),
package_map: elems.into_iter().collect(),
}))
Ok(check_result.map(|elems| elems.into_iter().collect()))
}

/// Handle the evaluation result for an attribute in `pkgs/by-name`, making it a validation result.
@@ -373,7 +371,7 @@ fn by_name(

// Independently report problems about whether it's a derivation and the callPackage
// variant.
is_derivation_result.and(variant_result)
is_derivation_result.and_(variant_result)
}
};
Ok(
106 changes: 106 additions & 0 deletions src/files.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
use crate::problem::npv_169;
use crate::problem::npv_170;
use relative_path::RelativePath;
use relative_path::RelativePathBuf;
use rnix::ast::Expr::Str;
use std::collections::BTreeMap;
use std::path::Path;

use crate::nix_file::NixFileStore;
use crate::validation::ResultIteratorExt;
use crate::validation::Validation::Success;
use crate::{nix_file, ratchet, structure, validation};

fn find_invalid_withs(syntax: SyntaxNode<NixLanguage>) -> Option<SyntaxNode<NixLanguage>> {
syntax
.descendants()
.filter(|node| node.kind() == rnix::SyntaxKind::NODE_WITH)
.filter(|node| {
node.descendants()
.map(|child| {
if child == *node {
return None;
}
let node_if_invalid = match child.kind() {
SyntaxKind::NODE_WITH => Some(node),
SyntaxKind::NODE_LET_IN => Some(node),
SyntaxKind::NODE_ATTR_SET => Some(node),
_ => None,
};
println!(
"validate with={:?} subexpr={:?} invalid={:?}",
node.to_string(),
child.to_string(),
node_if_invalid
);
node_if_invalid
})
.any(|cond| cond != None)
})
.take(1)
.last()
}

pub fn check_files(
nixpkgs_path: &Path,
nix_file_store: &mut NixFileStore,
) -> validation::Result<BTreeMap<RelativePathBuf, ratchet::File>> {
process_nix_files(nixpkgs_path, nix_file_store, |nix_file| {
if let Some(open_scope_with_lib) = find_invalid_withs(nix_file.syntax_root) {
// TODO: what do I return
// return ratchet::RatchetState::Loose(
// npv_169::TopLevelWithMayShadowVariablesAndBreakStaticChecks::new(
// nix_file.relative_path,
// )
// .into(),
// );
}
Ok(Success(ratchet::File {}))
})
}

fn collect_nix_files(
base: &Path,
dir: &RelativePath,
files: &mut Vec<RelativePathBuf>,
) -> anyhow::Result<()> {
for entry in structure::read_dir_sorted(&dir.to_path(base))? {
let mut relative_path = dir.to_relative_path_buf();
relative_path.push(entry.file_name().to_string_lossy().into_owned());

let absolute_path = entry.path();

if absolute_path.is_symlink() {
continue;
}
if absolute_path.is_dir() {
collect_nix_files(base, &relative_path, files)?
} else if absolute_path.extension().is_some_and(|x| x == "nix") {
files.push(relative_path)
}
}
Ok(())
}

fn process_nix_files<F: Fn(&nix_file::NixFile) -> validation::Result<ratchet::File>>(
nixpkgs_path: &Path,
nix_file_store: &mut NixFileStore,
f: F,
) -> validation::Result<BTreeMap<RelativePathBuf, ratchet::File>> {
let files = {
let mut files = vec![];
collect_nix_files(nixpkgs_path, &RelativePathBuf::new(), &mut files)?;
files
};

let file_results: Vec<validation::Validation<(RelativePathBuf, ratchet::File)>> = files
.into_iter()
.map(|path| {
let nix_file = nix_file_store.get(&path.to_path(nixpkgs_path))?;
let val = f(nix_file)?.map(|file| (path, file));
Ok::<_, anyhow::Error>(val)
})
.collect_vec()?;

Ok(validation::sequence(file_results).map(|entries| entries.into_iter().collect()))
}
40 changes: 26 additions & 14 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
// #![allow(clippy::missing_const_for_fn)]

mod eval;
mod files;
mod location;
mod nix_file;
mod problem;
@@ -21,6 +22,7 @@ mod validation;

use anyhow::Context as _;
use clap::Parser;
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
use std::process::ExitCode;
use std::{panic, thread};
@@ -113,20 +115,30 @@ fn check_nixpkgs(nixpkgs_path: &Path) -> validation::Result<ratchet::Nixpkgs> {
)
})?;

if !nixpkgs_path.join(structure::BASE_SUBPATH).exists() {
// No pkgs/by-name directory, always valid
return Ok(Success(ratchet::Nixpkgs::default()));
}

let mut nix_file_store = NixFileStore::default();
let structure = check_structure(&nixpkgs_path, &mut nix_file_store)?;

// Only if we could successfully parse the structure, we do the evaluation checks
let result = structure.result_map(|package_names| {
eval::check_values(&nixpkgs_path, &mut nix_file_store, package_names.as_slice())
})?;
let package_result = {
if !nixpkgs_path.join(structure::BASE_SUBPATH).exists() {
// No pkgs/by-name directory, always valid
Success(BTreeMap::new())
} else {
let structure = check_structure(&nixpkgs_path, &mut nix_file_store)?;

// Only if we could successfully parse the structure, we do the evaluation checks
structure.result_map(|package_names| {
eval::check_values(&nixpkgs_path, &mut nix_file_store, package_names.as_slice())
})?
}
};

let file_result = files::check_files(&nixpkgs_path, &mut nix_file_store)?;

Ok(result)
Ok(
package_result.and(file_result, |packages, files| ratchet::Nixpkgs {
packages,
files,
}),
)
}

#[cfg(test)]
@@ -178,7 +190,7 @@ mod tests {
return Ok(());
}

let base = path.join(BASE_SUBPATH);
let base = path.join("main").join(BASE_SUBPATH);

fs::create_dir_all(base.join("fo/foo"))?;
fs::write(base.join("fo/foo/package.nix"), "{ someDrv }: someDrv")?;
@@ -237,7 +249,7 @@ mod tests {
.build()
.expect("valid regex");

let path = path.to_owned();
let main_path = path.join("main");
let base_path = path.join("base");
let base_nixpkgs = if base_path.exists() {
base_path
@@ -251,7 +263,7 @@ mod tests {
let nix_conf_dir = nix_conf_dir.path().as_os_str();

let status = temp_env::with_var("NIX_CONF_DIR", Some(nix_conf_dir), || {
process(base_nixpkgs, &path)
process(base_nixpkgs, &main_path)
});

let actual_errors = format!("{status}\n");
30 changes: 23 additions & 7 deletions src/ratchet.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,8 @@
//!
//! Each type has a `compare` method that validates the ratchet checks for that item.
use std::collections::HashMap;
use relative_path::RelativePath;
use std::collections::BTreeMap;

use relative_path::RelativePathBuf;

@@ -13,10 +14,9 @@ use crate::validation::{self, Validation, Validation::Success};
/// The ratchet value for the entirety of Nixpkgs.
#[derive(Default)]
pub struct Nixpkgs {
/// Sorted list of packages in `package_map`
pub package_names: Vec<String>,
/// The ratchet values for all packages
pub package_map: HashMap<String, Package>,
pub packages: BTreeMap<String, Package>,
pub files: BTreeMap<RelativePathBuf, File>,
}

impl Nixpkgs {
@@ -25,10 +25,13 @@ impl Nixpkgs {
validation::sequence_(
// We only loop over the current attributes,
// we don't need to check ones that were removed
to.package_names.into_iter().map(|name| {
Package::compare(&name, from.package_map.get(&name), &to.package_map[&name])
}),
to.packages
.into_iter()
.map(|(name, pkg)| Package::compare(&name, from.packages.get(&name), &pkg)),
)
.and_(validation::sequence_(to.files.into_iter().map(
|(name, file)| File::compare(&name, from.files.get(&name), &file),
)))
}
}

@@ -59,6 +62,19 @@ impl Package {
}
}

pub struct File {}

impl File {
/// Validates the ratchet checks for a top-level package
pub fn compare(
_name: &RelativePath,
_optional_from: Option<&Self>,
_to: &Self,
) -> Validation<()> {
Success(())
}
}

/// The ratchet state of a generic ratchet check.
pub enum RatchetState<Ratchet: ToProblem> {
/// The ratchet is loose. It can be tightened more. In other words, this is the legacy state
10 changes: 5 additions & 5 deletions src/structure.rs
Original file line number Diff line number Diff line change
@@ -96,7 +96,7 @@ pub fn check_structure(
.into()
});

let result = result.and(validation::sequence_(duplicate_results));
let result = result.and_(validation::sequence_(duplicate_results));

let package_results = entries
.into_iter()
@@ -111,7 +111,7 @@ pub fn check_structure(
})
.collect_vec()?;

result.and(validation::sequence(package_results))
result.and_(validation::sequence(package_results))
})
})
.collect_vec()?;
@@ -147,7 +147,7 @@ fn check_package(
};

let correct_relative_package_dir = relative_dir_for_package(&package_name);
let result = result.and(if relative_package_dir != correct_relative_package_dir {
let result = result.and_(if relative_package_dir != correct_relative_package_dir {
// Only show this error if we have a valid shard and package name.
// If one of those is wrong, you should fix that first.
if shard_name_valid && package_name_valid {
@@ -164,15 +164,15 @@ fn check_package(
});

let package_nix_path = package_path.join(PACKAGE_NIX_FILENAME);
let result = result.and(if !package_nix_path.exists() {
let result = result.and_(if !package_nix_path.exists() {
npv_143::PackageNixMissing::new(package_name.clone()).into()
} else if !package_nix_path.is_file() {
npv_144::PackageNixIsNotFile::new(package_name.clone()).into()
} else {
Success(())
});

let result = result.and(references::check_references(
let result = result.and_(references::check_references(
nix_file_store,
&relative_package_dir,
&relative_package_dir.to_path(path),
Loading