1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-12-02 15:11:03 +01:00
home-manager/modules/programs/zsh/lib.nix
Kristopher James Kent (kjkent) 21399deff2 zsh: improve dotDir handling
Previously, `config.programs.zsh.dotDir` prepended strings with `$HOME`.
This caused issues like nix-community#5100, where `$HOME` is
inconsistently resolved in time for the evaluation of the option. The handling
of this variable is also inconsistent with how paths are handled elsewhere,
including within the same module, where `config.programs.zsh.history.path`
does not mutate the supplied string.

To preserve backwards compatibility, this change prepends
`config.home.homeDirectory` to relative paths, while assigning absolute paths
unchanged. Tests for both cases are added.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
2025-07-25 13:15:29 -05:00

42 lines
1.4 KiB
Nix

{ config, lib, ... }:
let
cfg = config.programs.zsh;
in
rec {
homeDir = config.home.homeDirectory;
# escapes for shell and cleans trailing slashes that can mess with test regex
cleanPathStr = pathStr: lib.escapeShellArg (lib.removeSuffix "/" pathStr);
# strips home directory prefix from absolute path.
mkRelPathStr =
pathStr:
# is already a relative path
if (!lib.hasPrefix "/" pathStr) then
cleanPathStr pathStr
# is an absolute path within home dir
else if (lib.hasPrefix homeDir pathStr) then
cleanPathStr (lib.removePrefix "${homeDir}/" pathStr)
# is an absolute path not in home dir
else
throw ''
Attempted to convert an absolute path not within home directory to a
home-relative path.
Conversion attempted on:
${pathStr}
...which does not start with:
${homeDir}
'';
# given a relative (or unknown) path, returns absolute by prepending home dir
# if path doesn't begin with "/"
mkAbsPathStr =
pathStr: cleanPathStr ((lib.optionalString (!lib.hasPrefix "/" pathStr) "${homeDir}/") + pathStr);
dotDirAbs = mkAbsPathStr cfg.dotDir;
dotDirRel = mkRelPathStr cfg.dotDir;
# If dotDir is default (i.e., the user's home dir) plugins are stored in
# ~/.zsh/plugins -- otherwise, in `programs.zsh.dotDir`/plugins
pluginsDir = dotDirAbs + (lib.optionalString (homeDir == dotDirAbs) "/.zsh") + "/plugins";
}