diff --git a/lib/customisation.nix b/lib/customisation.nix index 0b5cad71fddf..7be412bac353 100644 --- a/lib/customisation.nix +++ b/lib/customisation.nix @@ -221,9 +221,10 @@ rec { let f = if isFunction fn then fn else import fn; auto = intersectAttrs (functionArgs f) autoArgs; + mirrorArgs = mirrorFunctionArgs f; origArgs = auto // args; pkgs = f origArgs; - mkAttrOverridable = name: _: makeOverridable (newArgs: (f newArgs).${name}) origArgs; + mkAttrOverridable = name: _: makeOverridable (mirrorArgs (newArgs: (f newArgs).${name})) origArgs; in if isDerivation pkgs then throw ("function `callPackages` was called on a *single* derivation " diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index 193e68a96933..041122feadae 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -55,6 +55,24 @@ runTests { expected = { a = false; b = false; c = true; }; }; + testCallPackageWithOverridePreservesArguments = + let + f = { a ? 0, b }: {}; + f' = callPackageWith { a = 1; b = 2; } f {}; + in { + expr = functionArgs f'.override; + expected = functionArgs f; + }; + + testCallPackagesWithOverridePreservesArguments = + let + f = { a ? 0, b }: { nested = {}; }; + f' = callPackagesWith { a = 1; b = 2; } f {}; + in { + expr = functionArgs f'.nested.override; + expected = functionArgs f; + }; + # TRIVIAL testId = {