diff --git a/src/eval.nix b/src/eval.nix index f3c6f5d8..ecc42911 100644 --- a/src/eval.nix +++ b/src/eval.nix @@ -6,36 +6,19 @@ let attrs = builtins.fromJSON (builtins.readFile attrsPath); - # We need to check whether attributes are defined manually e.g. in `all-packages.nix`, - # automatically by the `pkgs/by-name` overlay, or neither. The only way to do so is to override - # `callPackage` and `_internalCallByNamePackageFile` with our own version that adds this - # information to the result, and then try to access it. + # We need to check whether attributes are defined via callPackage of the same scope or not. overlay = final: prev: { - # Adds information to each attribute about whether it's manually defined using `callPackage` - callPackage = - fn: args: - addVariantInfo (prev.callPackage fn args) { - # This is a manual definition of the attribute, and it's a `1callPackage`, specifically a - # semantic `callPackage`. - ManualDefinition.is_semantic_call_package = true; - }; - - # Adds information to each attribute about whether it's automatically defined by the - # `pkgs/by-name` overlay. This internal attribute is only used by that overlay. - # - # This overrides the above `callPackage` information. It's OK because we don't need that one, - # since `pkgs/by-name` always uses `callPackage` underneath. - _internalCallByNamePackageFile = - file: addVariantInfo (prev._internalCallByNamePackageFile file) { AutoDefinition = null; }; + # Adds information to each attribute about whether it's defined using this scope's `callPackage` + callPackage = fn: args: addCallPackageReference (prev.callPackage fn args); }; # We can't just replace attribute values with their info in the overlay, because attributes can # depend on other attributes, so this would break evaluation. - addVariantInfo = - value: variant: + addCallPackageReference = + value: if builtins.isAttrs value then - value // { _callPackageVariant = variant; } + value // { _callPackage = true; } else # It's very rare that `callPackage` doesn't return an attribute set, but it can occur. # In such a case we can't really return anything sensible that would include the info, so just @@ -60,11 +43,7 @@ let { AttributeSet = { is_derivation = pkgs.lib.isDerivation value; - definition_variant = - if !value ? _callPackageVariant then - { ManualDefinition.is_semantic_call_package = false; } - else - value._callPackageVariant; + is_same_scope_call_package = value._callPackage or false; }; }; }; diff --git a/src/eval.rs b/src/eval.rs index 58a8c4a3..36fe6bf1 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -7,12 +7,9 @@ use relative_path::RelativePathBuf; use serde::Deserialize; use crate::NixFileStore; -use crate::nix_file::CallPackageArgumentInfo; -use crate::problem::{ - npv_100, npv_101, npv_102, npv_103, npv_104, npv_105, npv_106, npv_107, npv_108, npv_120, -}; -use crate::ratchet::RatchetState::{Loose, Tight}; -use crate::structure::{self, BASE_SUBPATH}; +use crate::problem::{npv_100, npv_101, npv_120}; +use crate::ratchet::RatchetState::Tight; +use crate::structure::BASE_SUBPATH; use crate::validation::ResultIteratorExt as _; use crate::validation::{self, Validation::Success}; use crate::{location, ratchet}; @@ -81,21 +78,8 @@ pub enum AttributeVariant { AttributeSet { /// Whether the attribute is a derivation (`lib.isDerivation`) is_derivation: bool, - /// The type of `callPackage` used. - definition_variant: DefinitionVariant, - }, -} - -#[derive(Deserialize)] -pub enum DefinitionVariant { - /// An automatic definition by the `pkgs/by-name` overlay, though it's detected using the - /// internal `_internalCallByNamePackageFile` attribute, which can in theory also be used by - /// other code. - AutoDefinition, - /// A manual definition of the attribute, typically in `all-packages.nix`. - ManualDefinition { - /// Whether the attribute is defined as `pkgs.callPackage ...` or something else. - is_semantic_call_package: bool, + /// Whether the attribute was defined via `callPackage` of the same scope + is_same_scope_call_package: bool, }, } @@ -246,12 +230,9 @@ pub fn check_values( &attribute_name, non_by_name_attribute, )?, - Attribute::ByName(by_name_attribute) => by_name( - nix_file_store, - nixpkgs_path, - &attribute_name, - by_name_attribute, - )?, + Attribute::ByName(by_name_attribute) => { + by_name(&attribute_name, by_name_attribute)? + } }; Ok::<_, anyhow::Error>(check_result.map(|value| (attribute_name.clone(), value))) }) @@ -263,8 +244,6 @@ pub fn check_values( /// Handle the evaluation result for an attribute in `pkgs/by-name`, making it a validation result. fn by_name( - nix_file_store: &mut NixFileStore, - nixpkgs_path: &Path, attribute_name: &str, by_name_attribute: ByNameAttribute, ) -> validation::Result { @@ -298,82 +277,16 @@ fn by_name( attribute_variant: AttributeVariant::AttributeSet { is_derivation, - definition_variant, + is_same_scope_call_package: _, }, - location, + location: _, }) => { // Only derivations are allowed in `pkgs/by-name`. - let is_derivation_result = if is_derivation { - Success(()) + if is_derivation { + Success(Tight) } else { npv_101::ByNameNonDerivation::new(attribute_name).into() - }; - - // If the definition looks correct - let variant_result = match definition_variant { - // An automatic `callPackage` by the `pkgs/by-name` overlay. - // Though this gets detected by checking whether the internal - // `_internalCallByNamePackageFile` was used - DefinitionVariant::AutoDefinition => location.map_or_else( - || Success(Tight), - // Such an automatic definition should definitely not have a location. - // Having one indicates that somebody is using - // `_internalCallByNamePackageFile`, - |_location| npv_102::ByNameInternalCallPackageUsed::new(attribute_name).into(), - ), - // The attribute is manually defined, e.g. in `all-packages.nix`. - // This means we need to enforce it to look like this: - // callPackage ../pkgs/by-name/fo/foo/package.nix { ... } - DefinitionVariant::ManualDefinition { - is_semantic_call_package, - } => { - // We should expect manual definitions to have a location, otherwise we can't - // enforce the expected format - if let Some(location) = location { - // Parse the Nix file in the location - let nix_file = nix_file_store.get(&location.file)?; - - // The relative path of the Nix file, for error messages - let location = location.relative(nixpkgs_path).with_context(|| { - format!( - "Failed to resolve the file where attribute {attribute_name} is defined" - ) - })?; - - // Figure out whether it's an attribute definition of the form - // `= callPackage `, returning the arguments if so. - let (optional_syntactic_call_package, definition) = nix_file - .call_package_argument_info_at( - location.line, - location.column, - nixpkgs_path, - ) - .with_context(|| { - format!( - "Failed to get the definition info for attribute {}", - attribute_name - ) - })?; - - by_name_override( - attribute_name, - is_semantic_call_package, - optional_syntactic_call_package, - definition, - location, - ) - } else { - // If manual definitions don't have a location, it's likely `mapAttrs`'d - // over, e.g. if it's defined in aliases.nix. - // We can't verify whether its of the expected `callPackage`, so error out. - npv_103::ByNameCannotDetermineAttributeLocation::new(attribute_name).into() - } - } - }; - - // Independently report problems about whether it's a derivation and the callPackage - // variant. - is_derivation_result.and_(variant_result) + } } }; Ok( @@ -387,63 +300,6 @@ fn by_name( ) } -/// Handles the case for packages in `pkgs/by-name` that are manually overridden, -/// e.g. in `pkgs/top-level/all-packages.nix`. -fn by_name_override( - attribute_name: &str, - is_semantic_call_package: bool, - optional_syntactic_call_package: Option, - definition: String, - location: location::Location, -) -> validation::Validation> { - let Some(syntactic_call_package) = optional_syntactic_call_package else { - // Something like ` = foo` - return npv_104::ByNameOverrideOfNonSyntacticCallPackage::new( - attribute_name, - location, - definition, - ) - .into(); - }; - - if !is_semantic_call_package { - // Something like ` = pythonPackages.callPackage ...` - return npv_105::ByNameOverrideOfNonTopLevelPackage::new( - attribute_name, - location, - definition, - ) - .into(); - } - - let Some(actual_package_path) = syntactic_call_package.relative_path else { - return npv_108::ByNameOverrideContainsEmptyPath::new(attribute_name, location, definition) - .into(); - }; - - let expected_package_path = structure::relative_file_for_package(attribute_name); - if actual_package_path != expected_package_path { - return npv_106::ByNameOverrideContainsWrongCallPackagePath::new( - attribute_name, - actual_package_path, - location, - ) - .into(); - } - - // Manual definitions with empty arguments are not allowed anymore, but existing ones should - // continue to be allowed. This is the state to migrate away from. - if syntactic_call_package.empty_arg { - Success(Loose( - npv_107::ByNameOverrideContainsEmptyArgument::new(attribute_name, location, definition) - .into(), - )) - } else { - // This is the state to migrate to. - Success(Tight) - } -} - /// Handles the evaluation result for an attribute _not_ in `pkgs/by-name`, turning it into a /// validation result. fn handle_non_by_name_attribute( @@ -483,22 +339,7 @@ fn handle_non_by_name_attribute( attribute_variant: AttributeVariant::AttributeSet { // As of today, non-derivation attribute sets can't be in `pkgs/by-name`. is_derivation: true, - // Of the two definition variants, really only the manual one makes sense here. - // - // Special cases are: - // - // - Manual aliases to auto-called packages are not treated as manual definitions, - // due to limitations in the semantic `callPackage` detection. - // So those should be ignored. - // - // - Manual definitions using the internal `_internalCallByNamePackageFile` are - // not treated as manual definitions, since `_internalCallByNamePackageFile` is - // used to detect automatic ones. We can't distinguish from the above case, so we - // just need to ignore this one too, even if that internal attribute should never - // be called manually. - definition_variant: DefinitionVariant::ManualDefinition { - is_semantic_call_package - } + is_same_scope_call_package, }, // We need the location of the manual definition, because otherwise we can't figure out // whether it's a syntactic `callPackage`. @@ -529,7 +370,7 @@ fn handle_non_by_name_attribute( })?; // At this point, we completed two different checks for whether it's a `callPackage`. - match (is_semantic_call_package, optional_syntactic_call_package) { + match (is_same_scope_call_package, optional_syntactic_call_package) { // Something like ` = { }` (false, None) // Something like ` = pythonPackages.callPackage ...` diff --git a/src/nix_file.rs b/src/nix_file.rs index ba8eb5c7..06980b49 100644 --- a/src/nix_file.rs +++ b/src/nix_file.rs @@ -6,7 +6,6 @@ use itertools::Either::{self, Left, Right}; use relative_path::RelativePathBuf; use rnix::ast; use rnix::ast::Expr; -use rnix::ast::HasEntry; use rowan::TextSize; use rowan::TokenAtOffset; use rowan::ast::AstNode; @@ -82,9 +81,6 @@ impl NixFile { pub struct CallPackageArgumentInfo { /// The relative path of the first argument, or `None` if it's not a path. pub relative_path: Option, - - /// Whether the second argument is an empty attribute set. - pub empty_arg: bool, } impl NixFile { @@ -125,7 +121,7 @@ impl NixFile { /// /// ```rust /// Ok(( - /// Some(CallPackageArgumentInfo { path = Some("default.nix"), empty_arg: true }), + /// Some(CallPackageArgumentInfo { path = Some("default.nix") }), /// "foo = self.callPackage ./default.nix { };", /// )) /// ``` @@ -289,22 +285,9 @@ impl NixFile { anyhow::bail!("apply node doesn't have a lambda: {apply1:?}") }; - let Some(arg1) = apply1.argument() else { - anyhow::bail!("apply node doesn't have an argument: {apply1:?}") - }; - // At this point we know it's something like `foo = `. // For a callPackage, `` would be `callPackage ./file` and `` would be `{ }`. - let empty_arg = if let Expr::AttrSet(attrset) = arg1 { - // We can only statically determine whether the argument is empty if it's an attribute - // set _expression_, even though other kind of expressions could evaluate to an - // attribute set _value_. But this is what we want anyway. - attrset.entries().next().is_none() - } else { - false - }; - // Because `callPackage` takes two curried arguments, the first function needs to be a // function call itself. let Expr::Apply(apply2) = function1 else { @@ -384,7 +367,6 @@ impl NixFile { if token.text() == "callPackage" { Ok(Some(CallPackageArgumentInfo { relative_path: path, - empty_arg, })) } else { Ok(None) @@ -593,8 +575,6 @@ mod tests { e = pythonPackages.callPackage ./file.nix { }; f = callPackage ./file.nix { }; g = callPackage ({ }: { }) { }; - h = callPackage ./file.nix { x = 0; }; - i = callPackage ({ }: { }) (let in { }); } "}; @@ -611,35 +591,18 @@ mod tests { 6, Some(CallPackageArgumentInfo { relative_path: Some(RelativePathBuf::from("file.nix")), - empty_arg: true, }), ), ( 7, Some(CallPackageArgumentInfo { relative_path: Some(RelativePathBuf::from("file.nix")), - empty_arg: true, }), ), ( 8, Some(CallPackageArgumentInfo { relative_path: None, - empty_arg: true, - }), - ), - ( - 9, - Some(CallPackageArgumentInfo { - relative_path: Some(RelativePathBuf::from("file.nix")), - empty_arg: false, - }), - ), - ( - 10, - Some(CallPackageArgumentInfo { - relative_path: None, - empty_arg: false, }), ), ]; diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 981c0ea2..8c0e5aae 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -1,16 +1,8 @@ use derive_enum_from_into::EnumFrom; use derive_more::Display; -use relative_path::RelativePath; pub mod npv_100; pub mod npv_101; -pub mod npv_102; -pub mod npv_103; -pub mod npv_104; -pub mod npv_105; -pub mod npv_106; -pub mod npv_107; -pub mod npv_108; pub mod npv_109; pub mod npv_110; pub mod npv_111; @@ -30,9 +22,7 @@ pub mod npv_143; pub mod npv_144; pub mod npv_160; -pub mod npv_161; pub mod npv_162; -pub mod npv_163; #[derive(Clone, Display, EnumFrom)] pub enum Problem { @@ -42,27 +32,6 @@ pub enum Problem { /// NPV-101: attribute is not a derivation ByNameNonDerivation(npv_101::ByNameNonDerivation), - /// NPV-102: attribute uses `_internalCallByNamePackageFile` - ByNameInternalCallPackageUsed(npv_102::ByNameInternalCallPackageUsed), - - /// NPV-103: attribute name position cannot be determined - ByNameCannotDetermineAttributeLocation(npv_103::ByNameCannotDetermineAttributeLocation), - - /// NPV-104: non-syntactic override of by-name package - ByNameOverrideOfNonSyntacticCallPackage(npv_104::ByNameOverrideOfNonSyntacticCallPackage), - - /// NPV-105: by-name override of ill-defined callPackage - ByNameOverrideOfNonTopLevelPackage(npv_105::ByNameOverrideOfNonTopLevelPackage), - - /// NPV-106: by-name override contains wrong callPackage path - ByNameOverrideContainsWrongCallPackagePath(npv_106::ByNameOverrideContainsWrongCallPackagePath), - - /// NPV-107: by-name override contains empty argument - ByNameOverrideContainsEmptyArgument(npv_107::ByNameOverrideContainsEmptyArgument), - - /// NPV-108: by-name override contains empty path - ByNameOverrideContainsEmptyPath(npv_108::ByNameOverrideContainsEmptyPath), - /// NPV-109: by-name shard is not a directory ByNameShardIsNotDirectory(npv_109::ByNameShardIsNotDirectory), @@ -111,41 +80,6 @@ pub enum Problem { /// NPV-160: top-level package moved out of by-name TopLevelPackageMovedOutOfByName(npv_160::TopLevelPackageMovedOutOfByName), - /// NPV-161: top-level package moved out of by-name with custom arguments - TopLevelPackageMovedOutOfByNameWithCustomArguments( - npv_161::TopLevelPackageMovedOutOfByNameWithCustomArguments, - ), - /// NPV-162: new top-level package should be in by-name NewTopLevelPackageShouldBeByName(npv_162::NewTopLevelPackageShouldBeByName), - - /// NPV-163: new top-level package should be in by-name with a custom argument - NewTopLevelPackageShouldBeByNameWithCustomArgument( - npv_163::NewTopLevelPackageShouldBeByNameWithCustomArgument, - ), -} - -fn indent_definition(column: usize, definition: &str) -> String { - // The entire code should be indented 4 spaces - textwrap::indent( - // But first we want to strip the code's natural indentation - &textwrap::dedent( - // The definition _doesn't_ include the leading spaces, but we can - // recover those from the column - &format!("{}{definition}", " ".repeat(column - 1)), - ), - " ", - ) -} - -/// Creates a Nix path expression that when put into Nix file `from_file`, would point to the `to_file`. -fn create_path_expr( - from_file: impl AsRef, - to_file: impl AsRef, -) -> String { - // This `expect` calls should never trigger because we only call this function with files. - // That's why we `expect` them! - let from = from_file.as_ref().parent().expect("a parent for this path"); - let rel = from.relative(to_file); - format!("./{rel}") } diff --git a/src/problem/npv_102.rs b/src/problem/npv_102.rs deleted file mode 100644 index 859233d8..00000000 --- a/src/problem/npv_102.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::fmt; - -use derive_new::new; - -#[derive(Clone, new)] -pub struct ByNameInternalCallPackageUsed { - #[new(into)] - attribute_name: String, -} - -impl fmt::Display for ByNameInternalCallPackageUsed { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { attribute_name } = self; - write!( - f, - "- pkgs.{attribute_name}: This attribute is defined using `_internalCallByNamePackageFile`, which is an internal function not intended for manual use.", - ) - } -} diff --git a/src/problem/npv_103.rs b/src/problem/npv_103.rs deleted file mode 100644 index e70cea91..00000000 --- a/src/problem/npv_103.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::fmt; - -use derive_new::new; - -#[derive(Clone, new)] -pub struct ByNameCannotDetermineAttributeLocation { - #[new(into)] - attribute_name: String, -} - -impl fmt::Display for ByNameCannotDetermineAttributeLocation { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { attribute_name } = self; - write!( - f, - "- pkgs.{attribute_name}: Cannot determine the location of this attribute using `builtins.unsafeGetAttrPos`.", - ) - } -} diff --git a/src/problem/npv_104.rs b/src/problem/npv_104.rs deleted file mode 100644 index 3aae4068..00000000 --- a/src/problem/npv_104.rs +++ /dev/null @@ -1,46 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; - -use crate::location::Location; -use crate::structure; - -use super::{create_path_expr, indent_definition}; - -#[derive(Clone, new)] -pub struct ByNameOverrideOfNonSyntacticCallPackage { - #[new(into)] - package_name: String, - location: Location, - #[new(into)] - definition: String, -} - -impl fmt::Display for ByNameOverrideOfNonSyntacticCallPackage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - location, - definition, - } = self; - let Location { file, line, column } = location; - let expected_package_path = structure::relative_file_for_package(package_name); - let relative_package_dir = structure::relative_dir_for_package(package_name); - let expected_path_expr = create_path_expr(file, expected_package_path); - let indented_definition = indent_definition(*column, definition); - - writedoc!( - f, - " - - Because {relative_package_dir} exists, the attribute `pkgs.{package_name}` must be defined like - - {package_name} = callPackage {expected_path_expr} {{ /* ... */ }}; - - However, in this PR, it isn't defined that way. See the definition in {file}:{line} - - {indented_definition} - ", - ) - } -} diff --git a/src/problem/npv_105.rs b/src/problem/npv_105.rs deleted file mode 100644 index 1fcae39f..00000000 --- a/src/problem/npv_105.rs +++ /dev/null @@ -1,46 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; - -use crate::location::Location; -use crate::structure; - -use super::{create_path_expr, indent_definition}; - -#[derive(Clone, new)] -pub struct ByNameOverrideOfNonTopLevelPackage { - #[new(into)] - package_name: String, - location: Location, - #[new(into)] - definition: String, -} - -impl fmt::Display for ByNameOverrideOfNonTopLevelPackage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - location, - definition, - } = self; - let Location { file, line, column } = location; - let relative_package_dir = structure::relative_dir_for_package(package_name); - let expected_package_path = structure::relative_file_for_package(package_name); - let expected_path_expr = create_path_expr(file, expected_package_path); - let indented_definition = indent_definition(*column, definition); - - writedoc!( - f, - " - - Because {relative_package_dir} exists, the attribute `pkgs.{package_name}` must be defined like - - {package_name} = callPackage {expected_path_expr} {{ /* ... */ }}; - - However, in this PR, a different `callPackage` is used. See the definition in {file}:{line}: - - {indented_definition} - ", - ) - } -} diff --git a/src/problem/npv_106.rs b/src/problem/npv_106.rs deleted file mode 100644 index 727210a0..00000000 --- a/src/problem/npv_106.rs +++ /dev/null @@ -1,46 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; -use relative_path::RelativePathBuf; - -use crate::location::Location; -use crate::structure; - -use super::create_path_expr; - -#[derive(Clone, new)] -pub struct ByNameOverrideContainsWrongCallPackagePath { - #[new(into)] - package_name: String, - #[new(into)] - actual_path: RelativePathBuf, - location: Location, -} - -impl fmt::Display for ByNameOverrideContainsWrongCallPackagePath { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - location, - actual_path, - } = self; - let Location { file, line, .. } = location; - let expected_package_path = structure::relative_file_for_package(package_name); - let expected_path_expr = create_path_expr(file, expected_package_path); - let relative_package_dir = structure::relative_dir_for_package(package_name); - let actual_path_expr = create_path_expr(file, actual_path); - writedoc!( - f, - " - - Because {relative_package_dir} exists, the attribute `pkgs.{package_name}` must be defined like - - {package_name} = callPackage {expected_path_expr} {{ /* ... */ }}; - - However, in this PR, the first `callPackage` argument is the wrong path. See the definition in {file}:{line}: - - {package_name} = callPackage {actual_path_expr} {{ /* ... */ }}; - ", - ) - } -} diff --git a/src/problem/npv_107.rs b/src/problem/npv_107.rs deleted file mode 100644 index e62ead90..00000000 --- a/src/problem/npv_107.rs +++ /dev/null @@ -1,48 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; - -use crate::location::Location; -use crate::structure; - -use super::{create_path_expr, indent_definition}; - -#[derive(Clone, new)] -pub struct ByNameOverrideContainsEmptyArgument { - #[new(into)] - package_name: String, - location: Location, - #[new(into)] - definition: String, -} - -impl fmt::Display for ByNameOverrideContainsEmptyArgument { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - location, - definition, - } = self; - let Location { file, line, column } = location; - let expected_package_path = structure::relative_file_for_package(package_name); - let expected_path_expr = create_path_expr(file, expected_package_path); - let relative_package_dir = structure::relative_dir_for_package(package_name); - let indented_definition = indent_definition(*column, definition); - - writedoc!( - f, - " - - Because {relative_package_dir} exists, the attribute `pkgs.{package_name}` must be defined like - - {package_name} = callPackage {expected_path_expr} {{ /* ... */ }}; - - However, in this PR, the second argument is empty. See the definition in {file}:{line}: - - {indented_definition} - - Such a definition is provided automatically and therefore not necessary. Please remove it. - ", - ) - } -} diff --git a/src/problem/npv_108.rs b/src/problem/npv_108.rs deleted file mode 100644 index a73e899c..00000000 --- a/src/problem/npv_108.rs +++ /dev/null @@ -1,46 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; - -use crate::location::Location; -use crate::structure; - -use super::{create_path_expr, indent_definition}; - -#[derive(Clone, new)] -pub struct ByNameOverrideContainsEmptyPath { - #[new(into)] - package_name: String, - location: Location, - #[new(into)] - definition: String, -} - -impl fmt::Display for ByNameOverrideContainsEmptyPath { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - location, - definition, - } = self; - let Location { file, line, column } = location; - let relative_package_dir = structure::relative_dir_for_package(package_name); - let expected_package_path = structure::relative_file_for_package(package_name); - let expected_path_expr = create_path_expr(file, expected_package_path); - let indented_definition = indent_definition(*column, definition); - - writedoc!( - f, - " - - Because {relative_package_dir} exists, the attribute `pkgs.{package_name}` must be defined like - - {package_name} = callPackage {expected_path_expr} {{ /* ... */ }}; - - However, in this PR, the first `callPackage` argument is not a path. See the definition in {file}:{line}: - - {indented_definition} - ", - ) - } -} diff --git a/src/problem/npv_161.rs b/src/problem/npv_161.rs deleted file mode 100644 index 6dc7a66e..00000000 --- a/src/problem/npv_161.rs +++ /dev/null @@ -1,38 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; -use relative_path::RelativePathBuf; - -use crate::structure; - -#[derive(Clone, new)] -pub struct TopLevelPackageMovedOutOfByNameWithCustomArguments { - #[new(into)] - package_name: String, - #[new(into)] - call_package_path: Option, - #[new(into)] - file: RelativePathBuf, -} - -impl fmt::Display for TopLevelPackageMovedOutOfByNameWithCustomArguments { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - call_package_path, - file, - } = self; - let relative_package_file = structure::relative_file_for_package(package_name); - let call_package_arg = call_package_path - .as_ref() - .map_or_else(|| "...".into(), |path| format!("./{}", path)); - writedoc!( - f, - " - - Attribute `pkgs.{package_name}` was previously defined in {relative_package_file}, but is now manually defined as `callPackage {call_package_arg} {{ ... }}` in {file}. - While the manual `callPackage` is still needed, it's not necessary to move the package files. - ", - ) - } -} diff --git a/src/problem/npv_162.rs b/src/problem/npv_162.rs index cbc47085..272559f8 100644 --- a/src/problem/npv_162.rs +++ b/src/problem/npv_162.rs @@ -12,8 +12,6 @@ pub struct NewTopLevelPackageShouldBeByName { package_name: String, #[new(into)] call_package_path: Option, - #[new(into)] - file: RelativePathBuf, } impl fmt::Display for NewTopLevelPackageShouldBeByName { @@ -21,7 +19,6 @@ impl fmt::Display for NewTopLevelPackageShouldBeByName { let Self { package_name, call_package_path, - file, } = self; let relative_package_file = structure::relative_file_for_package(package_name); let call_package_arg = call_package_path @@ -33,7 +30,6 @@ impl fmt::Display for NewTopLevelPackageShouldBeByName { - Attribute `pkgs.{package_name}` is a new top-level package using `pkgs.callPackage {call_package_arg} {{ /* ... */ }}`. Please define it in {relative_package_file} instead. See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is `{{ }}`, no manual `callPackage` in {file} is needed anymore. ", ) } diff --git a/src/problem/npv_163.rs b/src/problem/npv_163.rs deleted file mode 100644 index 81278e6a..00000000 --- a/src/problem/npv_163.rs +++ /dev/null @@ -1,40 +0,0 @@ -use std::fmt; - -use derive_new::new; -use indoc::writedoc; -use relative_path::RelativePathBuf; - -use crate::structure; - -#[derive(Clone, new)] -pub struct NewTopLevelPackageShouldBeByNameWithCustomArgument { - #[new(into)] - package_name: String, - #[new(into)] - call_package_path: Option, - #[new(into)] - file: RelativePathBuf, -} - -impl fmt::Display for NewTopLevelPackageShouldBeByNameWithCustomArgument { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let Self { - package_name, - call_package_path, - file, - } = self; - let relative_package_file = structure::relative_file_for_package(package_name); - let call_package_arg = call_package_path - .as_ref() - .map_or_else(|| "...".into(), |path| format!("./{}", path)); - writedoc!( - f, - " - - Attribute `pkgs.{package_name}` is a new top-level package using `pkgs.callPackage {call_package_arg} {{ /* ... */ }}`. - Please define it in {relative_package_file} instead. - See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is not `{{ }}`, the manual `callPackage` in {file} is still needed. - ", - ) - } -} diff --git a/src/ratchet.rs b/src/ratchet.rs index e977bb0c..e9207dad 100644 --- a/src/ratchet.rs +++ b/src/ratchet.rs @@ -8,7 +8,7 @@ use std::collections::BTreeMap; use relative_path::RelativePathBuf; use crate::nix_file::CallPackageArgumentInfo; -use crate::problem::{Problem, npv_160, npv_161, npv_162, npv_163}; +use crate::problem::{Problem, npv_160, npv_162}; use crate::validation::{self, Validation, Validation::Success}; /// The ratchet value for the entirety of Nixpkgs. @@ -132,16 +132,6 @@ impl RatchetState { /// This ratchet is only tight for attributes that: /// /// - Are not defined in `pkgs/by-name`, and rely on a manual definition. -/// -/// - Are defined in `pkgs/by-name` without any manual definition (no custom argument overrides). -/// -/// - Are defined with `pkgs/by-name` with a manual definition that can't be removed -/// because it provides custom argument overrides. -/// -/// In comparison, this ratchet is loose for attributes that: -/// -/// - Are defined in `pkgs/by-name` with a manual definition that doesn't have any -/// custom argument overrides. pub enum ManualDefinition {} impl ToProblem for ManualDefinition { @@ -164,30 +154,13 @@ impl ToProblem for UsesByName { fn to_problem(name: &str, optional_from: Option<()>, (to, file): &Self::ToContext) -> Problem { let is_new = optional_from.is_none(); - let is_empty = to.empty_arg; - match (is_new, is_empty) { - (false, true) => { + match is_new { + false => { npv_160::TopLevelPackageMovedOutOfByName::new(name, to.relative_path.clone(), file) .into() } - // This can happen if users mistakenly assume that `pkgs/by-name` can't be used - // for custom arguments. - (false, false) => npv_161::TopLevelPackageMovedOutOfByNameWithCustomArguments::new( - name, - to.relative_path.clone(), - file, - ) - .into(), - (true, true) => { - npv_162::NewTopLevelPackageShouldBeByName::new(name, to.relative_path.clone(), file) - .into() - } - (true, false) => npv_163::NewTopLevelPackageShouldBeByNameWithCustomArgument::new( - name, - to.relative_path.clone(), - file, - ) - .into(), + true => npv_162::NewTopLevelPackageShouldBeByName::new(name, to.relative_path.clone()) + .into(), } } } diff --git a/tests/alt-callPackage/expected b/tests/alt-callPackage/expected deleted file mode 100644 index 0435e03e..00000000 --- a/tests/alt-callPackage/expected +++ /dev/null @@ -1,9 +0,0 @@ -- Because pkgs/by-name/fo/foo exists, the attribute `pkgs.foo` must be defined like - - foo = callPackage ./../by-name/fo/foo/package.nix { /* ... */ }; - - However, in this PR, a different `callPackage` is used. See the definition in pkgs/top-level/all-packages.nix:5: - - foo = self.alt.callPackage ({ }: self.someDrv) { }; - -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/alt-callPackage/main/default.nix b/tests/alt-callPackage/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/alt-callPackage/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/alt-callPackage/main/pkgs/by-name/fo/foo/package.nix b/tests/alt-callPackage/main/pkgs/by-name/fo/foo/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/alt-callPackage/main/pkgs/by-name/fo/foo/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/alt-callPackage/main/pkgs/top-level/all-packages.nix b/tests/alt-callPackage/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index a763d3b1..00000000 --- a/tests/alt-callPackage/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,6 +0,0 @@ -self: super: { - - alt.callPackage = self.lib.callPackageWith { }; - - foo = self.alt.callPackage ({ }: self.someDrv) { }; -} diff --git a/tests/internalCallPackage/expected b/tests/internalCallPackage/expected deleted file mode 100644 index 13b6a613..00000000 --- a/tests/internalCallPackage/expected +++ /dev/null @@ -1,2 +0,0 @@ -- pkgs.foo: This attribute is defined using `_internalCallByNamePackageFile`, which is an internal function not intended for manual use. -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/internalCallPackage/main/default.nix b/tests/internalCallPackage/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/internalCallPackage/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/internalCallPackage/main/foo.nix b/tests/internalCallPackage/main/foo.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/internalCallPackage/main/foo.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/internalCallPackage/main/pkgs/by-name/README.md b/tests/internalCallPackage/main/pkgs/by-name/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/internalCallPackage/main/pkgs/by-name/fo/foo/package.nix b/tests/internalCallPackage/main/pkgs/by-name/fo/foo/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/internalCallPackage/main/pkgs/by-name/fo/foo/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/internalCallPackage/main/pkgs/top-level/all-packages.nix b/tests/internalCallPackage/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 0422aba1..00000000 --- a/tests/internalCallPackage/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,4 +0,0 @@ -self: super: { - foo = self._internalCallByNamePackageFile ./../../foo.nix; - bar = self._internalCallByNamePackageFile ./../../foo.nix; -} diff --git a/tests/manual-definition/base/default.nix b/tests/manual-definition/base/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/manual-definition/base/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/manual-definition/base/pkgs/by-name/README.md b/tests/manual-definition/base/pkgs/by-name/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/manual-definition/base/pkgs/top-level/all-packages.nix b/tests/manual-definition/base/pkgs/top-level/all-packages.nix deleted file mode 100644 index 8209b65f..00000000 --- a/tests/manual-definition/base/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,9 +0,0 @@ -self: super: { - nonAttributeSet = null; - nonCallPackage = self.someDrv; - internalCallByName = self._internalCallByNamePackageFile ./../../some-pkg.nix; - nonDerivation = self.callPackage ({ }: { }) { }; - - onlyMove = self.callPackage ({ someDrv }: someDrv) { }; - noEval = throw "foo"; -} diff --git a/tests/manual-definition/base/some-pkg.nix b/tests/manual-definition/base/some-pkg.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/manual-definition/base/some-pkg.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/manual-definition/expected b/tests/manual-definition/expected deleted file mode 100644 index 915cb8c7..00000000 --- a/tests/manual-definition/expected +++ /dev/null @@ -1,21 +0,0 @@ -- Because pkgs/by-name/no/noEval exists, the attribute `pkgs.noEval` must be defined like - - noEval = callPackage ./../by-name/no/noEval/package.nix { /* ... */ }; - - However, in this PR, the second argument is empty. See the definition in pkgs/top-level/all-packages.nix:9: - - noEval = self.callPackage ./../by-name/no/noEval/package.nix { }; - - Such a definition is provided automatically and therefore not necessary. Please remove it. - -- Because pkgs/by-name/on/onlyMove exists, the attribute `pkgs.onlyMove` must be defined like - - onlyMove = callPackage ./../by-name/on/onlyMove/package.nix { /* ... */ }; - - However, in this PR, the second argument is empty. See the definition in pkgs/top-level/all-packages.nix:7: - - onlyMove = self.callPackage ./../by-name/on/onlyMove/package.nix { }; - - Such a definition is provided automatically and therefore not necessary. Please remove it. - -This PR introduces additional instances of discouraged patterns as listed above. Merging is discouraged but would not break the base branch. diff --git a/tests/manual-definition/main/default.nix b/tests/manual-definition/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/manual-definition/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/manual-definition/main/pkgs/by-name/no/noEval/package.nix b/tests/manual-definition/main/pkgs/by-name/no/noEval/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/manual-definition/main/pkgs/by-name/no/noEval/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/manual-definition/main/pkgs/by-name/on/onlyMove/package.nix b/tests/manual-definition/main/pkgs/by-name/on/onlyMove/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/manual-definition/main/pkgs/by-name/on/onlyMove/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/manual-definition/main/pkgs/top-level/all-packages.nix b/tests/manual-definition/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 3e14d872..00000000 --- a/tests/manual-definition/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,10 +0,0 @@ -self: super: { - nonAttributeSet = self.callPackage ({ someDrv }: someDrv) { }; - nonCallPackage = self.callPackage ({ someDrv }: someDrv) { }; - internalCallByName = self.callPackage ({ someDrv }: someDrv) { }; - nonDerivation = self.callPackage ({ someDrv }: someDrv) { }; - - onlyMove = self.callPackage ./../by-name/on/onlyMove/package.nix { }; - - noEval = self.callPackage ./../by-name/no/noEval/package.nix { }; -} diff --git a/tests/mock-nixpkgs.nix b/tests/mock-nixpkgs.nix index 5ba41879..d8c17563 100644 --- a/tests/mock-nixpkgs.nix +++ b/tests/mock-nixpkgs.nix @@ -68,13 +68,7 @@ let # Turns autoCalledPackageFiles into an overlay that `callPackage`'s all of them autoCalledPackages = - self: super: - { - # Needed to be able to detect empty arguments in all-packages.nix - # See a more detailed description in pkgs/top-level/by-name-overlay.nix - _internalCallByNamePackageFile = file: self.callPackage file { }; - } - // builtins.mapAttrs (name: self._internalCallByNamePackageFile) autoCalledPackageFiles; + self: super: builtins.mapAttrs (name: file: self.callPackage file { }) autoCalledPackageFiles; # A list optionally containing the `all-packages.nix` file from the test case as an overlay optionalAllPackagesOverlay = diff --git a/tests/move-to-non-by-name/base/pkgs/by-name/fo/foo3/package.nix b/tests/move-to-non-by-name/base/pkgs/by-name/fo/foo3/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/move-to-non-by-name/base/pkgs/by-name/fo/foo3/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/move-to-non-by-name/base/pkgs/by-name/fo/foo4/package.nix b/tests/move-to-non-by-name/base/pkgs/by-name/fo/foo4/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/move-to-non-by-name/base/pkgs/by-name/fo/foo4/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/move-to-non-by-name/expected b/tests/move-to-non-by-name/expected index 0dc6989e..9da9f847 100644 --- a/tests/move-to-non-by-name/expected +++ b/tests/move-to-non-by-name/expected @@ -4,10 +4,4 @@ - Attribute `pkgs.foo2` was previously defined in pkgs/by-name/fo/foo2/package.nix, but is now manually defined as `callPackage ./without-config.nix { /* ... */ }` in pkgs/top-level/all-packages.nix. Please move the package back and remove the manual `callPackage`. -- Attribute `pkgs.foo3` was previously defined in pkgs/by-name/fo/foo3/package.nix, but is now manually defined as `callPackage ... { ... }` in pkgs/top-level/all-packages.nix. - While the manual `callPackage` is still needed, it's not necessary to move the package files. - -- Attribute `pkgs.foo4` was previously defined in pkgs/by-name/fo/foo4/package.nix, but is now manually defined as `callPackage ./with-config.nix { ... }` in pkgs/top-level/all-packages.nix. - While the manual `callPackage` is still needed, it's not necessary to move the package files. - This PR introduces additional instances of discouraged patterns as listed above. Merging is discouraged but would not break the base branch. diff --git a/tests/move-to-non-by-name/main/pkgs/top-level/all-packages.nix b/tests/move-to-non-by-name/main/pkgs/top-level/all-packages.nix index e01073a6..8437b7fc 100644 --- a/tests/move-to-non-by-name/main/pkgs/top-level/all-packages.nix +++ b/tests/move-to-non-by-name/main/pkgs/top-level/all-packages.nix @@ -1,6 +1,4 @@ self: super: { foo1 = self.callPackage ({ someDrv }: someDrv) { }; foo2 = self.callPackage ./../../without-config.nix { }; - foo3 = self.callPackage ({ someDrv, enableFoo }: someDrv) { enableFoo = null; }; - foo4 = self.callPackage ./../../with-config.nix { enableFoo = null; }; } diff --git a/tests/new-package-non-by-name/expected b/tests/new-package-non-by-name/expected index 43e9279c..98eb5ad5 100644 --- a/tests/new-package-non-by-name/expected +++ b/tests/new-package-non-by-name/expected @@ -1,21 +1,17 @@ - Attribute `pkgs.new1` is a new top-level package using `pkgs.callPackage ... { /* ... */ }`. Please define it in pkgs/by-name/ne/new1/package.nix instead. See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is `{ }`, no manual `callPackage` in pkgs/top-level/all-packages.nix is needed anymore. - Attribute `pkgs.new2` is a new top-level package using `pkgs.callPackage ./without-config.nix { /* ... */ }`. Please define it in pkgs/by-name/ne/new2/package.nix instead. See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is `{ }`, no manual `callPackage` in pkgs/top-level/all-packages.nix is needed anymore. - Attribute `pkgs.new3` is a new top-level package using `pkgs.callPackage ... { /* ... */ }`. Please define it in pkgs/by-name/ne/new3/package.nix instead. See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is not `{ }`, the manual `callPackage` in pkgs/top-level/all-packages.nix is still needed. - Attribute `pkgs.new4` is a new top-level package using `pkgs.callPackage ./with-config.nix { /* ... */ }`. Please define it in pkgs/by-name/ne/new4/package.nix instead. See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is not `{ }`, the manual `callPackage` in pkgs/top-level/all-packages.nix is still needed. This PR introduces additional instances of discouraged patterns as listed above. Merging is discouraged but would not break the base branch. diff --git a/tests/non-syntactical-callPackage-by-name/expected b/tests/non-syntactical-callPackage-by-name/expected deleted file mode 100644 index 01cbb1b0..00000000 --- a/tests/non-syntactical-callPackage-by-name/expected +++ /dev/null @@ -1,9 +0,0 @@ -- Because pkgs/by-name/fo/foo exists, the attribute `pkgs.foo` must be defined like - - foo = callPackage ./../by-name/fo/foo/package.nix { /* ... */ }; - - However, in this PR, it isn't defined that way. See the definition in pkgs/top-level/all-packages.nix:4 - - foo = self.bar; - -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/non-syntactical-callPackage-by-name/main/default.nix b/tests/non-syntactical-callPackage-by-name/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/non-syntactical-callPackage-by-name/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/non-syntactical-callPackage-by-name/main/pkgs/by-name/fo/foo/package.nix b/tests/non-syntactical-callPackage-by-name/main/pkgs/by-name/fo/foo/package.nix deleted file mode 100644 index 5ad6ea5e..00000000 --- a/tests/non-syntactical-callPackage-by-name/main/pkgs/by-name/fo/foo/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv, someFlag }: someDrv diff --git a/tests/non-syntactical-callPackage-by-name/main/pkgs/top-level/all-packages.nix b/tests/non-syntactical-callPackage-by-name/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 0a55d9c6..00000000 --- a/tests/non-syntactical-callPackage-by-name/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - - bar = (x: x) self.callPackage ./../by-name/fo/foo/package.nix { someFlag = true; }; - foo = self.bar; -} diff --git a/tests/override-different-file/expected b/tests/override-different-file/expected deleted file mode 100644 index ac86f322..00000000 --- a/tests/override-different-file/expected +++ /dev/null @@ -1,9 +0,0 @@ -- Because pkgs/by-name/no/nonDerivation exists, the attribute `pkgs.nonDerivation` must be defined like - - nonDerivation = callPackage ./../by-name/no/nonDerivation/package.nix { /* ... */ }; - - However, in this PR, the first `callPackage` argument is the wrong path. See the definition in pkgs/top-level/all-packages.nix:1: - - nonDerivation = callPackage ./../../someDrv.nix { /* ... */ }; - -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/override-different-file/main/default.nix b/tests/override-different-file/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-different-file/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-different-file/main/pkgs/by-name/no/nonDerivation/package.nix b/tests/override-different-file/main/pkgs/by-name/no/nonDerivation/package.nix deleted file mode 100644 index bd68dba1..00000000 --- a/tests/override-different-file/main/pkgs/by-name/no/nonDerivation/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ }: null diff --git a/tests/override-different-file/main/pkgs/top-level/all-packages.nix b/tests/override-different-file/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index da92b686..00000000 --- a/tests/override-different-file/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { nonDerivation = self.callPackage ./../../someDrv.nix { }; } diff --git a/tests/override-different-file/main/someDrv.nix b/tests/override-different-file/main/someDrv.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/override-different-file/main/someDrv.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/override-empty-arg-gradual/base/default.nix b/tests/override-empty-arg-gradual/base/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-empty-arg-gradual/base/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-empty-arg-gradual/base/pkgs/by-name/no/nonDerivation/package.nix b/tests/override-empty-arg-gradual/base/pkgs/by-name/no/nonDerivation/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/override-empty-arg-gradual/base/pkgs/by-name/no/nonDerivation/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/override-empty-arg-gradual/base/pkgs/top-level/all-packages.nix b/tests/override-empty-arg-gradual/base/pkgs/top-level/all-packages.nix deleted file mode 100644 index ebe25d3b..00000000 --- a/tests/override-empty-arg-gradual/base/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { nonDerivation = self.callPackage ./../by-name/no/nonDerivation/package.nix { }; } diff --git a/tests/override-empty-arg-gradual/expected b/tests/override-empty-arg-gradual/expected deleted file mode 100644 index defae263..00000000 --- a/tests/override-empty-arg-gradual/expected +++ /dev/null @@ -1 +0,0 @@ -Validated successfully diff --git a/tests/override-empty-arg-gradual/main/default.nix b/tests/override-empty-arg-gradual/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-empty-arg-gradual/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-empty-arg-gradual/main/pkgs/by-name/no/nonDerivation/package.nix b/tests/override-empty-arg-gradual/main/pkgs/by-name/no/nonDerivation/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/override-empty-arg-gradual/main/pkgs/by-name/no/nonDerivation/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/override-empty-arg-gradual/main/pkgs/top-level/all-packages.nix b/tests/override-empty-arg-gradual/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index ebe25d3b..00000000 --- a/tests/override-empty-arg-gradual/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { nonDerivation = self.callPackage ./../by-name/no/nonDerivation/package.nix { }; } diff --git a/tests/override-empty-arg/base/default.nix b/tests/override-empty-arg/base/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-empty-arg/base/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-empty-arg/base/pkgs/by-name/README.md b/tests/override-empty-arg/base/pkgs/by-name/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/override-empty-arg/expected b/tests/override-empty-arg/expected deleted file mode 100644 index ade92a7f..00000000 --- a/tests/override-empty-arg/expected +++ /dev/null @@ -1,11 +0,0 @@ -- Because pkgs/by-name/no/nonDerivation exists, the attribute `pkgs.nonDerivation` must be defined like - - nonDerivation = callPackage ./../by-name/no/nonDerivation/package.nix { /* ... */ }; - - However, in this PR, the second argument is empty. See the definition in pkgs/top-level/all-packages.nix:1: - - nonDerivation = self.callPackage ./../by-name/no/nonDerivation/package.nix { }; - - Such a definition is provided automatically and therefore not necessary. Please remove it. - -This PR introduces additional instances of discouraged patterns as listed above. Merging is discouraged but would not break the base branch. diff --git a/tests/override-empty-arg/main/default.nix b/tests/override-empty-arg/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-empty-arg/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-empty-arg/main/pkgs/by-name/no/nonDerivation/package.nix b/tests/override-empty-arg/main/pkgs/by-name/no/nonDerivation/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/override-empty-arg/main/pkgs/by-name/no/nonDerivation/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/override-empty-arg/main/pkgs/top-level/all-packages.nix b/tests/override-empty-arg/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index ebe25d3b..00000000 --- a/tests/override-empty-arg/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { nonDerivation = self.callPackage ./../by-name/no/nonDerivation/package.nix { }; } diff --git a/tests/override-no-call-package/expected b/tests/override-no-call-package/expected deleted file mode 100644 index 193d1566..00000000 --- a/tests/override-no-call-package/expected +++ /dev/null @@ -1,9 +0,0 @@ -- Because pkgs/by-name/no/nonDerivation exists, the attribute `pkgs.nonDerivation` must be defined like - - nonDerivation = callPackage ./../by-name/no/nonDerivation/package.nix { /* ... */ }; - - However, in this PR, it isn't defined that way. See the definition in pkgs/top-level/all-packages.nix:1 - - nonDerivation = self.someDrv; - -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/override-no-call-package/main/default.nix b/tests/override-no-call-package/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-no-call-package/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-no-call-package/main/pkgs/by-name/no/nonDerivation/package.nix b/tests/override-no-call-package/main/pkgs/by-name/no/nonDerivation/package.nix deleted file mode 100644 index bd68dba1..00000000 --- a/tests/override-no-call-package/main/pkgs/by-name/no/nonDerivation/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ }: null diff --git a/tests/override-no-call-package/main/pkgs/top-level/all-packages.nix b/tests/override-no-call-package/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 4c4a39be..00000000 --- a/tests/override-no-call-package/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { nonDerivation = self.someDrv; } diff --git a/tests/override-no-file/expected b/tests/override-no-file/expected deleted file mode 100644 index e96d29a8..00000000 --- a/tests/override-no-file/expected +++ /dev/null @@ -1,9 +0,0 @@ -- Because pkgs/by-name/no/nonDerivation exists, the attribute `pkgs.nonDerivation` must be defined like - - nonDerivation = callPackage ./../by-name/no/nonDerivation/package.nix { /* ... */ }; - - However, in this PR, the first `callPackage` argument is not a path. See the definition in pkgs/top-level/all-packages.nix:1: - - nonDerivation = self.callPackage ({ someDrv }: someDrv) { }; - -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/override-no-file/main/default.nix b/tests/override-no-file/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-no-file/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-no-file/main/pkgs/by-name/no/nonDerivation/package.nix b/tests/override-no-file/main/pkgs/by-name/no/nonDerivation/package.nix deleted file mode 100644 index bd68dba1..00000000 --- a/tests/override-no-file/main/pkgs/by-name/no/nonDerivation/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ }: null diff --git a/tests/override-no-file/main/pkgs/top-level/all-packages.nix b/tests/override-no-file/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index cec4a2b3..00000000 --- a/tests/override-no-file/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { nonDerivation = self.callPackage ({ someDrv }: someDrv) { }; } diff --git a/tests/override-non-path/expected b/tests/override-non-path/expected deleted file mode 100644 index 0460473b..00000000 --- a/tests/override-non-path/expected +++ /dev/null @@ -1,9 +0,0 @@ -- Because pkgs/by-name/fo/foo exists, the attribute `pkgs.foo` must be defined like - - foo = callPackage ./../by-name/fo/foo/package.nix { /* ... */ }; - - However, in this PR, the first `callPackage` argument is not a path. See the definition in pkgs/top-level/all-packages.nix:3: - - foo = self.callPackage ({ someDrv, someFlag }: someDrv) { someFlag = true; }; - -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/override-non-path/main/default.nix b/tests/override-non-path/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-non-path/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-non-path/main/pkgs/by-name/fo/foo/package.nix b/tests/override-non-path/main/pkgs/by-name/fo/foo/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/override-non-path/main/pkgs/by-name/fo/foo/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/override-non-path/main/pkgs/top-level/all-packages.nix b/tests/override-non-path/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 992ffb32..00000000 --- a/tests/override-non-path/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,4 +0,0 @@ -self: super: { - - foo = self.callPackage ({ someDrv, someFlag }: someDrv) { someFlag = true; }; -} diff --git a/tests/override-success/expected b/tests/override-success/expected deleted file mode 100644 index defae263..00000000 --- a/tests/override-success/expected +++ /dev/null @@ -1 +0,0 @@ -Validated successfully diff --git a/tests/override-success/main/default.nix b/tests/override-success/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/override-success/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/override-success/main/pkgs/by-name/fo/foo/package.nix b/tests/override-success/main/pkgs/by-name/fo/foo/package.nix deleted file mode 100644 index 72cbf0a9..00000000 --- a/tests/override-success/main/pkgs/by-name/fo/foo/package.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ - someDrv, - enableBar ? false, -}: -if enableBar then someDrv else { } diff --git a/tests/override-success/main/pkgs/top-level/all-packages.nix b/tests/override-success/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 77771324..00000000 --- a/tests/override-success/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: { foo = self.callPackage ./../by-name/fo/foo/package.nix { enableBar = true; }; } diff --git a/tests/sorted-order/expected b/tests/sorted-order/expected deleted file mode 100644 index 8cdd2c77..00000000 --- a/tests/sorted-order/expected +++ /dev/null @@ -1,31 +0,0 @@ -- Because pkgs/by-name/a/a exists, the attribute `pkgs.a` must be defined like - - a = callPackage ./../by-name/a/a/package.nix { /* ... */ }; - - However, in this PR, the second argument is empty. See the definition in pkgs/top-level/all-packages.nix:2: - - a = self.callPackage ./../by-name/a/a/package.nix { }; - - Such a definition is provided automatically and therefore not necessary. Please remove it. - -- Attribute `pkgs.b` is a new top-level package using `pkgs.callPackage ... { /* ... */ }`. - Please define it in pkgs/by-name/b/b/package.nix instead. - See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is `{ }`, no manual `callPackage` in pkgs/top-level/all-packages.nix is needed anymore. - -- Because pkgs/by-name/c/c exists, the attribute `pkgs.c` must be defined like - - c = callPackage ./../by-name/c/c/package.nix { /* ... */ }; - - However, in this PR, the second argument is empty. See the definition in pkgs/top-level/all-packages.nix:4: - - c = self.callPackage ./../by-name/c/c/package.nix { }; - - Such a definition is provided automatically and therefore not necessary. Please remove it. - -- Attribute `pkgs.d` is a new top-level package using `pkgs.callPackage ... { /* ... */ }`. - Please define it in pkgs/by-name/d/d/package.nix instead. - See `pkgs/by-name/README.md` for more details. - Since the second `callPackage` argument is `{ }`, no manual `callPackage` in pkgs/top-level/all-packages.nix is needed anymore. - -This PR introduces additional instances of discouraged patterns as listed above. Merging is discouraged but would not break the base branch. diff --git a/tests/sorted-order/main/default.nix b/tests/sorted-order/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/sorted-order/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/sorted-order/main/pkgs/by-name/a/a/package.nix b/tests/sorted-order/main/pkgs/by-name/a/a/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/sorted-order/main/pkgs/by-name/a/a/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/sorted-order/main/pkgs/by-name/c/c/package.nix b/tests/sorted-order/main/pkgs/by-name/c/c/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/sorted-order/main/pkgs/by-name/c/c/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/sorted-order/main/pkgs/top-level/all-packages.nix b/tests/sorted-order/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 2fb8d527..00000000 --- a/tests/sorted-order/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1,6 +0,0 @@ -self: super: { - a = self.callPackage ./../by-name/a/a/package.nix { }; - b = self.callPackage ({ someDrv }: someDrv) { }; - c = self.callPackage ./../by-name/c/c/package.nix { }; - d = self.callPackage ({ someDrv }: someDrv) { }; -} diff --git a/tests/unknown-location/expected b/tests/unknown-location/expected deleted file mode 100644 index fb671bb7..00000000 --- a/tests/unknown-location/expected +++ /dev/null @@ -1,2 +0,0 @@ -- pkgs.foo: Cannot determine the location of this attribute using `builtins.unsafeGetAttrPos`. -This PR introduces the problems listed above. Please fix them before merging, otherwise the base branch would break. diff --git a/tests/unknown-location/main/default.nix b/tests/unknown-location/main/default.nix deleted file mode 100644 index 861260cd..00000000 --- a/tests/unknown-location/main/default.nix +++ /dev/null @@ -1 +0,0 @@ -import { root = ./.; } diff --git a/tests/unknown-location/main/pkgs/by-name/fo/foo/package.nix b/tests/unknown-location/main/pkgs/by-name/fo/foo/package.nix deleted file mode 100644 index a1b92efb..00000000 --- a/tests/unknown-location/main/pkgs/by-name/fo/foo/package.nix +++ /dev/null @@ -1 +0,0 @@ -{ someDrv }: someDrv diff --git a/tests/unknown-location/main/pkgs/top-level/all-packages.nix b/tests/unknown-location/main/pkgs/top-level/all-packages.nix deleted file mode 100644 index 7349781c..00000000 --- a/tests/unknown-location/main/pkgs/top-level/all-packages.nix +++ /dev/null @@ -1 +0,0 @@ -self: super: builtins.mapAttrs (name: value: value) { foo = self.someDrv; }