From e470ae6dce5066897c42e28209a23071695ab326 Mon Sep 17 00:00:00 2001 From: Vinny Meller Date: Sat, 14 Mar 2026 23:47:30 -0500 Subject: [PATCH] feat(modules.makeWrapper): allow null values in env and envDefault to remove entries --- ci/checks/env-null.nix | 38 ++++++++++++++++++++++++++++++++++ lib/makeWrapper/default.nix | 4 +++- modules/makeWrapper/module.nix | 4 ++-- 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 ci/checks/env-null.nix diff --git a/ci/checks/env-null.nix b/ci/checks/env-null.nix new file mode 100644 index 0000000..1055d1e --- /dev/null +++ b/ci/checks/env-null.nix @@ -0,0 +1,38 @@ +{ + pkgs, + self, +}: + +let + wrappedPackage = self.lib.wrapPackage { + inherit pkgs; + package = pkgs.hello; + env.MY_NULL_ENV = null; + envDefault.MY_NULL_DEFAULT = null; + }; + +in +pkgs.runCommand "env-null-test" { } '' + echo "Testing that null env and envDefault entries are omitted..." + + wrapperScript="${wrappedPackage}/bin/hello" + if [ ! -f "$wrapperScript" ]; then + echo "FAIL: Wrapper script not found" + exit 1 + fi + + if grep -q "MY_NULL_ENV" "$wrapperScript"; then + echo "FAIL: MY_NULL_ENV should be omitted (value was null)" + cat "$wrapperScript" + exit 1 + fi + + if grep -q "MY_NULL_DEFAULT" "$wrapperScript"; then + echo "FAIL: MY_NULL_DEFAULT should be omitted (value was null)" + cat "$wrapperScript" + exit 1 + fi + + echo "SUCCESS: null env and envDefault entries correctly omitted" + touch $out +'' diff --git a/lib/makeWrapper/default.nix b/lib/makeWrapper/default.nix index c32a824..0812187 100644 --- a/lib/makeWrapper/default.nix +++ b/lib/makeWrapper/default.nix @@ -368,7 +368,9 @@ in ++ mapAndLiftDal "addFlag" (config.addFlag or [ ]) ++ mapAndLiftDal "appendFlag" (config.appendFlag or [ ]); in - if sortResult then wlib.dag.unwrapSort "makeWrapper" unsorted else unsorted; + builtins.filter (v: !(v.type == "env" || v.type == "envDefault") || v.data or null != null) ( + if sortResult then wlib.dag.unwrapSort "makeWrapper" unsorted else unsorted + ); /* splitDal receives the dal as returned by `aggregateSingleOptionSet` and splits it into 2 lists, `args` and `other`. diff --git a/modules/makeWrapper/module.nix b/modules/makeWrapper/module.nix index c6ca333..53220d7 100644 --- a/modules/makeWrapper/module.nix +++ b/modules/makeWrapper/module.nix @@ -408,7 +408,7 @@ let ]; }; options.${if !(excluded.env or false) then "env" else null} = lib.mkOption { - type = wlib.types.dagWithEsc wlib.types.stringable; + type = wlib.types.dagWithEsc (lib.types.nullOr wlib.types.stringable); default = if mainConfig != null && config.mirror or false then mainConfig.env else { }; example = { "XDG_DATA_HOME" = "/somewhere/on/your/machine"; @@ -425,7 +425,7 @@ let ''; }; options.${if !(excluded.envDefault or false) then "envDefault" else null} = lib.mkOption { - type = wlib.types.dagWithEsc wlib.types.stringable; + type = wlib.types.dagWithEsc (lib.types.nullOr wlib.types.stringable); default = if mainConfig != null && config.mirror or false then mainConfig.envDefault else { }; example = { "XDG_DATA_HOME" = "/only/if/not/set";