summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdam Joseph <adam@westernsemico.com>2023-08-14 02:47:59 +0300
committerArtturin <Artturin@artturin.com>2023-08-14 02:50:32 +0300
commita1fdbae706c846f01c31bbe02cb8246fa348b480 (patch)
treea6b5eca09c67592a15c211cfc3f3d25f225166f5
parentb5f77af42cf760e6d4b44015c6e7bb36938e56ab (diff)
downloadnixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.tar
nixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.tar.gz
nixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.tar.bz2
nixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.tar.lz
nixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.tar.xz
nixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.tar.zst
nixpkgs-a1fdbae706c846f01c31bbe02cb8246fa348b480.zip
lib.customisation: add uncurried form of makeScopeWithSplicing
Deeply-curried functions are pretty error-prone in untyped languages
like Nix.  This is a particularly bad case because
`top-level/splice.nix` *also* declares a makeScopeWithSplicing, but
it takes *two fewer arguments*.

Let's add a version that uses attrset-passing form, to provide some
minimal level of sanity-checking.

This also provides defaults for keep and extra (these are often
unneeded by the user).
-rw-r--r--lib/customisation.nix29
-rw-r--r--lib/default.nix2
-rw-r--r--pkgs/top-level/splice.nix1
3 files changed, 23 insertions, 9 deletions
diff --git a/lib/customisation.nix b/lib/customisation.nix
index a9281b1ab69..6dbe8f472f9 100644
--- a/lib/customisation.nix
+++ b/lib/customisation.nix
@@ -277,9 +277,24 @@ rec {
         };
     in self;
 
+  /* backward compatibility with old uncurried form; deprecated */
+  makeScopeWithSplicing =
+    splicePackages: newScope: otherSplices: keep: extra: f:
+    makeScopeWithSplicing' {
+      inherit splicePackages newScope otherSplices keep extra f;
+    };
+
   /* Like the above, but aims to support cross compilation. It's still ugly, but
      hopefully it helps a little bit. */
-  makeScopeWithSplicing = splicePackages: newScope: otherSplices: keep: extra: f:
+  makeScopeWithSplicing' =
+    { splicePackages
+    , newScope
+    }:
+    { otherSplices
+    , keep ? (_self: {})
+    , extra ? (_spliced0: {})
+    , f
+    }:
     let
       spliced0 = splicePackages {
         pkgsBuildBuild = otherSplices.selfBuildBuild;
@@ -295,13 +310,11 @@ rec {
         callPackage = newScope spliced; # == self.newScope {};
         # N.B. the other stages of the package set spliced in are *not*
         # overridden.
-        overrideScope = g: makeScopeWithSplicing
-          splicePackages
-          newScope
-          otherSplices
-          keep
-          extra
-          (lib.fixedPoints.extends g f);
+        overrideScope = g: (makeScopeWithSplicing'
+          { inherit splicePackages newScope; }
+          { inherit otherSplices keep extra;
+            f = lib.fixedPoints.extends g f;
+          });
         packages = f;
       };
     in self;
diff --git a/lib/default.nix b/lib/default.nix
index 73b8ad87154..1958d93aaf5 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -112,7 +112,7 @@ let
       noDepEntry fullDepEntry packEntry stringAfter;
     inherit (self.customisation) overrideDerivation makeOverridable
       callPackageWith callPackagesWith extendDerivation hydraJob
-      makeScope makeScopeWithSplicing;
+      makeScope makeScopeWithSplicing makeScopeWithSplicing';
     inherit (self.derivations) lazyDerivation;
     inherit (self.meta) addMetaAttrs dontDistribute setName updateName
       appendToName mapDerivationAttrset setPrio lowPrio lowPrioSet hiPrio
diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix
index 51fd6f420e8..9ac0fe2200f 100644
--- a/pkgs/top-level/splice.nix
+++ b/pkgs/top-level/splice.nix
@@ -145,6 +145,7 @@ in
 
   # prefill 2 fields of the function for convenience
   makeScopeWithSplicing = lib.makeScopeWithSplicing splicePackages pkgs.newScope;
+  makeScopeWithSplicing' = lib.makeScopeWithSplicing' { inherit splicePackages; inherit (pkgs) newScope; };
 
   # generate 'otherSplices' for 'makeScopeWithSplicing'
   generateSplicesForMkScope = attr: