diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 6fbeb7301215..ff841bfacf2a 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -24,10 +24,24 @@ let let result = f origArgs; overrideWith = + # Preserve the plain arguments whenever possible, + # as `overrideStdenvCompat` works more reliably with `args.stdenv` + # than `result.__stdenvPythonCompat`. + # TODO(@ShamrockLee): After `overrideStdenvCompat` is fully deprecated, + # simplify as + # ```nix + # newArgs: lib.extends (lib.toExtension newArgs) origArgs + # ``` if lib.isFunction origArgs then - newArgs: lib.extends (_: lib.toFunction newArgs) origArgs + newArgs: lib.extends (lib.toExtension newArgs) origArgs else - newArgs: origArgs // lib.toFunction newArgs origArgs; + newArgs: + if !(lib.isFunction newArgs) then + origArgs // newArgs + else if !(lib.isFunction (newArgs origArgs)) then + origArgs // newArgs origArgs + else + finalAttrs: origArgs // newArgs finalAttrs origArgs; in if lib.isAttrs result then result diff --git a/pkgs/test/overriding.nix b/pkgs/test/overriding.nix index b536097cad85..5e6fe09b7890 100644 --- a/pkgs/test/overriding.nix +++ b/pkgs/test/overriding.nix @@ -434,6 +434,14 @@ let p.overridePythonAttrs (previousAttrs: { overridePythonAttrsFlag = previousAttrs.overridePythonAttrsFlag or 0 + 1; }); + applyOverridePythonAttrsFP = + p: + p.overridePythonAttrs ( + finalAttrs: previousAttrs: { + overridePythonAttrsFlag = previousAttrs.overridePythonAttrsFlag or 0 + 1; + overridePythonAttrsFlagP1 = finalAttrs.overridePythonAttrsFlag + 1; + } + ); overrideAttrsFooBar = drv: drv.overrideAttrs ( @@ -469,6 +477,18 @@ let expr = (package-stub.overridePythonAttrs { overridePythonAttrsFlag = 0; }).overridePythonAttrsFlag; expected = 0; }; + overridePythonAttrs-finalAttrs = { + expr = { + inherit (applyOverridePythonAttrsFP package-stub) + overridePythonAttrsFlag + overridePythonAttrsFlagP1 + ; + }; + expected = { + overridePythonAttrsFlag = 1; + overridePythonAttrsFlagP1 = 2; + }; + }; overrideAttrs-overridePythonAttrs-test-overrideAttrs = { expr = { inherit (applyOverridePythonAttrs (overrideAttrsFooBar package-stub))