mirror of
https://github.com/nix-community/home-manager.git
synced 2025-12-02 15:11:03 +01:00
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>
42 lines
1.4 KiB
Nix
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";
|
|
}
|