From 5cfdec6e94574e8e08068e2de5e8ef2a375bb894 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Fri, 7 Sep 2018 20:59:12 +0200 Subject: [PATCH 1/3] lib: Improve overrideExisting implementation --- lib/attrsets.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 1e4142562fa6..9bac69af34f3 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -440,7 +440,7 @@ rec { => { a = { b = 6; d = 2; }; } */ overrideExisting = old: new: - old // listToAttrs (map (attr: nameValuePair attr (attrByPath [attr] old.${attr} new)) (attrNames old)); + mapAttrs (name: value: new.${name} or value) old; /* Get a package output. If no output is found, fallback to `.out` and then to the default. From afd86206210e468173ec0d2a0e135843d5ab2ee7 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Mon, 17 Sep 2018 22:40:08 +0200 Subject: [PATCH 2/3] lib/tests: Add overrideExisting tests --- lib/tests/misc.nix | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index d3bd7746d89c..d89bcfde4819 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -236,6 +236,20 @@ runTests { }; }; + testOverrideExistingEmpty = { + expr = overrideExisting {} { a = 1; }; + expected = {}; + }; + + testOverrideExistingDisjoint = { + expr = overrideExisting { b = 2; } { a = 1; }; + expected = { b = 2; }; + }; + + testOverrideExistingOverride = { + expr = overrideExisting { a = 3; b = 2; } { a = 1; }; + expected = { a = 1; b = 2; }; + }; # GENERATORS # these tests assume attributes are converted to lists From c7104d97c87316a6062c88696d80a45918fab7a6 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Mon, 17 Sep 2018 23:28:47 +0200 Subject: [PATCH 3/3] lib.overrideExisting: Better example --- lib/attrsets.nix | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 9bac69af34f3..2a1b866dbc5e 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -435,9 +435,12 @@ rec { useful for deep-overriding. Example: - x = { a = { b = 4; c = 3; }; } - overrideExisting x { a = { b = 6; d = 2; }; } - => { a = { b = 6; d = 2; }; } + overrideExisting {} { a = 1; } + => {} + overrideExisting { b = 2; } { a = 1; } + => { b = 2; } + overrideExisting { a = 3; b = 2; } { a = 1; } + => { a = 1; b = 2; } */ overrideExisting = old: new: mapAttrs (name: value: new.${name} or value) old;