about summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Arvstedt <erik.arvstedt@gmail.com>2022-08-25 14:03:57 +0200
committerErik Arvstedt <erik.arvstedt@gmail.com>2022-08-31 14:23:28 +0200
commite2cc36197053c087b16009750fd3e60029600e25 (patch)
treef4c4231d1f29da8ec740b70598a7d94e5ed7a3d1
parentcbf9a129d273d203a98c2fefe8bda52af42ab5e3 (diff)
lib.modules: support strings with absolute paths in `disabledModules`
This is particularly useful for disabling modules defined in a flake.
Example:
disabledModules = [ "${flake}/modules/mymodule.nix" ];

Previously, absolute string paths were internally prepended with `modulesPath`,
which caused the module filtering to fail.
-rw-r--r--lib/modules.nix4
-rwxr-xr-xlib/tests/modules.sh1
-rw-r--r--lib/tests/modules/disable-define-enable-string-path.nix5
3 files changed, 9 insertions, 1 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 7f1646e9b8bc0..6a1b0bfdc4fa7 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -433,7 +433,9 @@ rec {
       # modules recursively. It returns the final list of unique-by-key modules
       filterModules = modulesPath: { disabled, modules }:
         let
-          moduleKey = m: if isString m then toString modulesPath + "/" + m else toString m;
+          moduleKey = m: if isString m && (builtins.substring 0 1 m != "/")
+            then toString modulesPath + "/" + m
+            else toString m;
           disabledKeys = map moduleKey disabled;
           keyFilter = filter (attrs: ! elem attrs.key disabledKeys);
         in map (attrs: attrs.module) (builtins.genericClosure {
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh
index c92cc62023b56..2ef7c48065952 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -130,6 +130,7 @@ checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enab
 set -- config.enable ./define-enable.nix ./declare-enable.nix
 checkConfigOutput '^true$' "$@"
 checkConfigOutput '^false$' "$@" ./disable-define-enable.nix
+checkConfigOutput '^false$' "$@" ./disable-define-enable-string-path.nix
 checkConfigError "The option .*enable.* does not exist. Definition values:\n\s*- In .*: true" "$@" ./disable-declare-enable.nix
 checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-define-enable.nix ./disable-declare-enable.nix
 checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-enable-modules.nix
diff --git a/lib/tests/modules/disable-define-enable-string-path.nix b/lib/tests/modules/disable-define-enable-string-path.nix
new file mode 100644
index 0000000000000..6429a6d6354ae
--- /dev/null
+++ b/lib/tests/modules/disable-define-enable-string-path.nix
@@ -0,0 +1,5 @@
+{ lib, ... }:
+
+{
+  disabledModules = [ (toString ./define-enable.nix) ];
+}