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.
This commit is contained in:
polykernel 2021-09-12 22:44:58 -04:00 committed by Robert Helgesson
parent 371576cdc2
commit 7cb118c9d2
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
4 changed files with 43 additions and 36 deletions

View file

@ -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 = ""; }
];
}
];

View file

@ -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;
}

View file

@ -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"}
'';
};
}

View file

@ -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"}
'';
};
}