diff options
author | Silvan Mosberger <contact@infinisil.com> | 2019-10-22 14:37:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-22 14:37:40 +0200 |
commit | 1230fc8674439df5a90fe4c1ea740256ef9906e4 (patch) | |
tree | 52879d914eff4e4bb314046ba1b6b9b2b6b5c6e8 | |
parent | 872166e13650ffb39012c13d6841b56564b8fe58 (diff) | |
parent | a4896cb4aab132c0bcc32c5df4440f6d3b7ec5de (diff) | |
download | nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.tar nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.tar.gz nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.tar.bz2 nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.tar.lz nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.tar.xz nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.tar.zst nixpkgs-1230fc8674439df5a90fe4c1ea740256ef9906e4.zip |
Merge pull request #67809 from Infinisil/propagate-override-args
lib.makeOverridable: Propagate function arguments
-rw-r--r-- | lib/customisation.nix | 37 | ||||
-rw-r--r-- | pkgs/applications/graphics/gimp/wrapper.nix | 2 |
2 files changed, 24 insertions, 15 deletions
diff --git a/lib/customisation.nix b/lib/customisation.nix index 3be36fcd719..ac234e3b8c6 100644 --- a/lib/customisation.nix +++ b/lib/customisation.nix @@ -66,22 +66,31 @@ rec { */ makeOverridable = f: origArgs: let - ff = f origArgs; + result = f origArgs; + + # Creates a functor with the same arguments as f + copyArgs = g: lib.setFunctionArgs g (lib.functionArgs f); + # Changes the original arguments with (potentially a function that returns) a set of new attributes overrideWith = newArgs: origArgs // (if lib.isFunction newArgs then newArgs origArgs else newArgs); + + # Re-call the function but with different arguments + overrideArgs = copyArgs (newArgs: makeOverridable f (overrideWith newArgs)); + # Change the result of the function call by applying g to it + overrideResult = g: makeOverridable (copyArgs (args: g (f args))) origArgs; in - if builtins.isAttrs ff then (ff // { - override = newArgs: makeOverridable f (overrideWith newArgs); - overrideDerivation = fdrv: - makeOverridable (args: overrideDerivation (f args) fdrv) origArgs; - ${if ff ? overrideAttrs then "overrideAttrs" else null} = fdrv: - makeOverridable (args: (f args).overrideAttrs fdrv) origArgs; - }) - else if lib.isFunction ff then { - override = newArgs: makeOverridable f (overrideWith newArgs); - __functor = self: ff; - overrideDerivation = throw "overrideDerivation not yet supported for functors"; - } - else ff; + if builtins.isAttrs result then + result // { + override = overrideArgs; + overrideDerivation = fdrv: overrideResult (x: overrideDerivation x fdrv); + ${if result ? overrideAttrs then "overrideAttrs" else null} = fdrv: + overrideResult (x: x.overrideAttrs fdrv); + } + else if lib.isFunction result then + # Transform the result into a functor while propagating its arguments + lib.setFunctionArgs result (lib.functionArgs result) // { + override = overrideArgs; + } + else result; /* Call the package function in the file `fn' with the required diff --git a/pkgs/applications/graphics/gimp/wrapper.nix b/pkgs/applications/graphics/gimp/wrapper.nix index 11c1e9ada93..d58dc375cb9 100644 --- a/pkgs/applications/graphics/gimp/wrapper.nix +++ b/pkgs/applications/graphics/gimp/wrapper.nix @@ -1,7 +1,7 @@ { stdenv, lib, symlinkJoin, gimp, makeWrapper, gimpPlugins, gnome3, plugins ? null}: let -allPlugins = lib.filter (pkg: builtins.isAttrs pkg && pkg.type == "derivation" && !pkg.meta.broken or false) (lib.attrValues gimpPlugins); +allPlugins = lib.filter (pkg: lib.isDerivation pkg && !pkg.meta.broken or false) (lib.attrValues gimpPlugins); selectedPlugins = if plugins == null then allPlugins else plugins; extraArgs = map (x: x.wrapArgs or "") selectedPlugins; versionBranch = stdenv.lib.versions.majorMinor gimp.version; |