From f08c835bf9ae4e577f1fb8faf3b6aba2063c8f94 Mon Sep 17 00:00:00 2001 From: quantenzitrone Date: Tue, 17 Mar 2026 16:24:10 +0100 Subject: [PATCH 1/2] lib.newScope: allow overriding callPackage --- lib/customisation.nix | 7 +++++-- pkgs/top-level/octave-packages.nix | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/customisation.nix b/lib/customisation.nix index dfdb64cbf3e2..ce00e364ba76 100644 --- a/lib/customisation.nix +++ b/lib/customisation.nix @@ -631,9 +631,12 @@ rec { makeScope = newScope: f: let - self = f self // { - newScope = scope: newScope (self // scope); + self = { callPackage = self.newScope { }; + } + // f self + // { + newScope = scope: newScope (self // scope); overrideScope = g: makeScope newScope (extends g f); packages = f; }; diff --git a/pkgs/top-level/octave-packages.nix b/pkgs/top-level/octave-packages.nix index e9a8a13608ec..f0214bdbe83d 100644 --- a/pkgs/top-level/octave-packages.nix +++ b/pkgs/top-level/octave-packages.nix @@ -56,7 +56,7 @@ makeScope newScope ( in { - inherit callPackage buildOctavePackage computeRequiredOctavePackages; + inherit buildOctavePackage computeRequiredOctavePackages; inherit (callPackage ../development/interpreters/octave/hooks { }) writeRequiredOctavePackagesHook From 4085f24e25cd34137d513fba5c9a0a4ddce121ac Mon Sep 17 00:00:00 2001 From: Philip Taron Date: Thu, 19 Mar 2026 14:11:11 -0700 Subject: [PATCH 2/2] lib.makeScope: add tests for callPackage overriding Test that: - makeScope provides a default callPackage - the scope function can override callPackage - the override persists through overrideScope --- lib/tests/misc.nix | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index d4bdc344deb9..1a69d7dfb484 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -4789,6 +4789,58 @@ runTests { }; }; + # Check that makeScope provides a default callPackage + testMakeScopeDefaultCallPackage = + let + scope = lib.makeScope lib.callPackageWith (self: { + foo = self.callPackage ({ }: "foo-value") { }; + }); + in + { + expr = scope.foo; + expected = "foo-value"; + }; + + # Check that callPackage can be overridden by the scope function + testMakeScopeOverrideCallPackage = + let + customCallPackage = + _self: fn: args: + (fn args) + "-custom"; + scope = lib.makeScope lib.callPackageWith (self: { + callPackage = customCallPackage self; + foo = self.callPackage ({ }: "foo-value") { }; + }); + in + { + expr = scope.foo; + expected = "foo-value-custom"; + }; + + # Check that overriding callPackage persists through overrideScope + testMakeScopeOverrideCallPackagePersistsThroughOverrideScope = + let + customCallPackage = + _self: fn: args: + (fn args) + "-custom"; + scope = lib.makeScope lib.callPackageWith (self: { + callPackage = customCallPackage self; + foo = self.callPackage ({ }: "foo-value") { }; + }); + overridden = scope.overrideScope ( + _final: _prev: { + bar = scope.callPackage ({ }: "bar-value") { }; + } + ); + in + { + expr = { inherit (overridden) foo bar; }; + expected = { + foo = "foo-value-custom"; + bar = "bar-value-custom"; + }; + }; + testFilesystemResolveDefaultNixFile1 = { expr = lib.filesystem.resolveDefaultNix ./foo.nix; expected = ./foo.nix;