From 7cb118c9d232e36f8508686535dec8596c8c48a8 Mon Sep 17 00:00:00 2001 From: polykernel <81340136+polykernel@users.noreply.github.com> Date: Sun, 12 Sep 2021 22:44:58 -0400 Subject: [PATCH] xdg: coerce XDG base directories settings to strings Currently, when a custom path is set for any of the XDG base directories (i.e XDG_DATA_HOME, XDG_CONFIG_HOME, ...), the path will be coerced into a string when consumed by other options such as xdg.configFile et al. This causes the the given path to be copied to the nix store which in the case of xdg.configFile et al, translate to the file being written there as it is a absolute path. Interestingly, the default base directories all work as intended as they are encoded as a string. This commit converts the option to a string regardless of whether it is a primitive path or a string encoded path. This allows downstream consumers to use the base directories in arbitrary way without accidentally copying the content of the directory to the store. It is implemented in a similar manner as how home.homeDirectory undergoes string conversion. The existing file-attr-name test was modified to test also custom xdg base directories, and the home.file generation test was removed as there is a dedicated test for this case in the files module. The test case was renamed to file-gen to better reflect the new scope. --- modules/misc/xdg.nix | 21 ++++++++------- tests/modules/misc/xdg/default.nix | 2 +- tests/modules/misc/xdg/file-attr-names.nix | 26 ------------------- tests/modules/misc/xdg/file-gen.nix | 30 ++++++++++++++++++++++ 4 files changed, 43 insertions(+), 36 deletions(-) delete mode 100644 tests/modules/misc/xdg/file-attr-names.nix create mode 100644 tests/modules/misc/xdg/file-gen.nix diff --git a/modules/misc/xdg.nix b/modules/misc/xdg.nix index 2b331dfa..76d926ab 100644 --- a/modules/misc/xdg.nix +++ b/modules/misc/xdg.nix @@ -15,7 +15,7 @@ let defaultConfigHome = "${config.home.homeDirectory}/.config"; defaultDataHome = "${config.home.homeDirectory}/.local/share"; - getXdgDir = name: fallback: + getEnvFallback = name: fallback: let value = builtins.getEnv name; in if value != "" then value else fallback; @@ -26,6 +26,7 @@ in { cacheHome = mkOption { type = types.path; defaultText = "~/.cache"; + apply = toString; description = '' Absolute path to directory holding application caches. ''; @@ -43,6 +44,7 @@ in { configHome = mkOption { type = types.path; defaultText = "~/.config"; + apply = toString; description = '' Absolute path to directory holding application configurations. ''; @@ -60,6 +62,7 @@ in { dataHome = mkOption { type = types.path; defaultText = "~/.local/share"; + apply = toString; description = '' Absolute path to directory holding application data. ''; @@ -81,9 +84,11 @@ in { # Legacy non-deterministic setup. (mkIf (!cfg.enable && versionOlder config.home.stateVersion "20.09") { - xdg.cacheHome = getXdgDir "XDG_CACHE_HOME" defaultCacheHome; - xdg.configHome = getXdgDir "XDG_CONFIG_HOME" defaultConfigHome; - xdg.dataHome = getXdgDir "XDG_DATA_HOME" defaultDataHome; + xdg.cacheHome = + mkDefault (getEnvFallback "XDG_CACHE_HOME" defaultCacheHome); + xdg.configHome = + mkDefault (getEnvFallback "XDG_CONFIG_HOME" defaultConfigHome); + xdg.dataHome = mkDefault (getEnvFallback "XDG_DATA_HOME" defaultDataHome); }) # "Modern" deterministic setup. @@ -95,13 +100,11 @@ in { { home.file = mkMerge [ - (mapAttrs' - (name: file: nameValuePair "${config.xdg.configHome}/${name}" file) + (mapAttrs' (name: file: nameValuePair "${cfg.configHome}/${name}" file) cfg.configFile) - (mapAttrs' - (name: file: nameValuePair "${config.xdg.dataHome}/${name}" file) + (mapAttrs' (name: file: nameValuePair "${cfg.dataHome}/${name}" file) cfg.dataFile) - { "${config.xdg.cacheHome}/.keep".text = ""; } + { "${cfg.cacheHome}/.keep".text = ""; } ]; } ]; diff --git a/tests/modules/misc/xdg/default.nix b/tests/modules/misc/xdg/default.nix index b637cd1b..e3104dd9 100644 --- a/tests/modules/misc/xdg/default.nix +++ b/tests/modules/misc/xdg/default.nix @@ -1,6 +1,6 @@ { xdg-mime-apps-basics = ./mime-apps-basics.nix; - xdg-file-attr-names = ./file-attr-names.nix; xdg-system-dirs = ./system-dirs.nix; xdg-desktop-entries = ./desktop-entries.nix; + xdg-file-gen = ./file-gen.nix; } diff --git a/tests/modules/misc/xdg/file-attr-names.nix b/tests/modules/misc/xdg/file-attr-names.nix deleted file mode 100644 index 0aa8fcff..00000000 --- a/tests/modules/misc/xdg/file-attr-names.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ config, lib, pkgs, ... }: - -with lib; - -{ - config = { - xdg.configFile.test.text = "config"; - xdg.dataFile.test.text = "data"; - home.file.test.text = "home"; - - nmt.script = '' - assertFileExists home-files/.config/test - assertFileExists home-files/.local/share/test - assertFileExists home-files/test - assertFileContent \ - home-files/.config/test \ - ${builtins.toFile "test" "config"} - assertFileContent \ - home-files/.local/share/test \ - ${builtins.toFile "test" "data"} - assertFileContent \ - home-files/test \ - ${builtins.toFile "test" "home"} - ''; - }; -} diff --git a/tests/modules/misc/xdg/file-gen.nix b/tests/modules/misc/xdg/file-gen.nix new file mode 100644 index 00000000..bf7bb339 --- /dev/null +++ b/tests/modules/misc/xdg/file-gen.nix @@ -0,0 +1,30 @@ +{ config, lib, pkgs, ... }: + +with lib; + +{ + config = { + xdg.configHome = /. + "${config.home.homeDirectory}/.dummy-config"; + xdg.dataHome = /. + "${config.home.homeDirectory}/.dummy-data"; + xdg.cacheHome = /. + "${config.home.homeDirectory}/.dummy-cache"; + + xdg.configFile.test.text = "config"; + xdg.dataFile.test.text = "data"; + home.file."${config.xdg.cacheHome}/test".text = "cache"; + + nmt.script = '' + assertFileExists home-files/.dummy-config/test + assertFileExists home-files/.dummy-cache/test + assertFileExists home-files/.dummy-data/test + assertFileContent \ + home-files/.dummy-config/test \ + ${builtins.toFile "test" "config"} + assertFileContent \ + home-files/.dummy-data/test \ + ${builtins.toFile "test" "data"} + assertFileContent \ + home-files/.dummy-cache/test \ + ${builtins.toFile "test" "cache"} + ''; + }; +}