Fix type of various `sessionVariables` options

Unfortunately, using `attrsOf` is not possible since it results in too
eager evaluation. In particular, the

    home.sessionVariables = {
      FOO = "Hello";
      BAR = "${config.home.sessionVariables.FOO} World!";
    };

example will cause an infinite recursion.

This commit restores the option type of

- `home.sessionVariables`,
- `pam.sessionVariables`,
- `programs.bash.sessionVariables`, and
- `programs.zsh.sessionVariables`

to `attrs`. It also adds test cases for the above options to avoid
regressions.

Fixes #659
This commit is contained in:
Robert Helgesson 2019-04-27 00:21:18 +02:00
parent c5f230e682
commit b6e613c771
No known key found for this signature in database
GPG Key ID: 36BDAA14C2797E89
16 changed files with 133 additions and 13 deletions

View File

@ -149,7 +149,7 @@ in
home.sessionVariables = mkOption {
default = {};
type = with types; attrsOf (either int str);
type = types.attrs;
example = { EDITOR = "emacs"; GS_OPTIONS = "-sPAPERSIZE=a4"; };
description = ''
Environment variables to always set at login.
@ -167,19 +167,19 @@ in
variable may have a runtime dependency on another session
variable. In particular code like
<programlisting language="nix">
home.sessionVariables = {
FOO = "Hello";
BAR = "$FOO World!";
};
home.sessionVariables = {
FOO = "Hello";
BAR = "$FOO World!";
};
</programlisting>
may not work as expected. If you need to reference another
session variable, then do so inside Nix instead. The above
example then becomes
<programlisting language="nix">
home.sessionVariables = {
FOO = "Hello";
BAR = "''${config.home.sessionVariables.FOO} World!";
};
home.sessionVariables = {
FOO = "Hello";
BAR = "''${config.home.sessionVariables.FOO} World!";
};
</programlisting>
'';
};

View File

@ -14,7 +14,7 @@ in
options = {
pam.sessionVariables = mkOption {
default = {};
type = with types; attrsOf (either int str);
type = types.attrs;
example = { EDITOR = "vim"; };
description = ''
Environment variables that will be set for the PAM session.

View File

@ -72,7 +72,7 @@ in
sessionVariables = mkOption {
default = {};
type = with types; attrsOf (either int str);
type = types.attrs;
example = { MAILCHECK = 30; };
description = ''
Environment variables that will be set for the Bash session.

View File

@ -202,7 +202,7 @@ in
sessionVariables = mkOption {
default = {};
type = with types; attrsOf (either int str);
type = types.attrs;
example = { MAILCHECK = 30; };
description = "Environment variables that will be set for zsh session.";
};

View File

@ -31,8 +31,12 @@ import nmt {
{
i3-keybindings = ./modules/services/window-managers/i3-keybindings.nix;
}
// import ./modules/misc/pam
// import ./modules/systemd
)
// import ./modules/home-environment
// import ./modules/programs/bash
// import ./modules/programs/ssh
// import ./modules/programs/tmux;
// import ./modules/programs/tmux
// import ./modules/programs/zsh;
}

View File

@ -0,0 +1,3 @@
{
home-session-variables = ./session-variables.nix;
}

View File

@ -0,0 +1,6 @@
# Only source this once.
if [ -n "$__HM_SESS_VARS_SOURCED" ]; then return; fi
export __HM_SESS_VARS_SOURCED=1
export V1="v1"
export V2="v2-v1"

View File

@ -0,0 +1,19 @@
{ config, lib, ... }:
with lib;
{
config = {
home.sessionVariables = {
V1 = "v1";
V2 = "v2-${config.home.sessionVariables.V1}";
};
nmt.script = ''
assertFileExists home-path/etc/profile.d/hm-session-vars.sh
assertFileContent \
home-path/etc/profile.d/hm-session-vars.sh \
${./session-variables-expected.txt}
'';
};
}

View File

@ -0,0 +1,3 @@
{
pam-session-variables = ./session-variables.nix;
}

View File

@ -0,0 +1,2 @@
V1 OVERRIDE="v1"
V2 OVERRIDE="v2-v1"

View File

@ -0,0 +1,19 @@
{ config, lib, ... }:
with lib;
{
config = {
pam.sessionVariables = {
V1 = "v1";
V2 = "v2-${config.pam.sessionVariables.V1}";
};
nmt.script = ''
assertFileExists home-files/.pam_environment
assertFileContent \
home-files/.pam_environment \
${./session-variables-expected.txt}
'';
};
}

View File

@ -0,0 +1,3 @@
{
bash-session-variables = ./session-variables.nix;
}

View File

@ -0,0 +1,8 @@
# -*- mode: sh -*-
. "@homeDirectory@/.nix-profile/etc/profile.d/hm-session-vars.sh"
export V1="v1"
export V2="v2-v1"

View File

@ -0,0 +1,28 @@
{ config, lib, pkgs, ... }:
with lib;
{
config = {
programs.bash = {
enable = true;
sessionVariables = {
V1 = "v1";
V2 = "v2-${config.programs.bash.sessionVariables.V1}";
};
};
nmt.script = ''
assertFileExists home-files/.profile
assertFileContent \
home-files/.profile \
${
pkgs.substituteAll {
src = ./session-variables-expected.txt;
inherit (config.home) homeDirectory;
}
}
'';
};
}

View File

@ -0,0 +1,3 @@
{
zsh-session-variables = ./session-variables.nix;
}

View File

@ -0,0 +1,22 @@
{ config, lib, ... }:
with lib;
{
config = {
programs.zsh = {
enable = true;
sessionVariables = {
V1 = "v1";
V2 = "v2-${config.programs.zsh.sessionVariables.V1}";
};
};
nmt.script = ''
assertFileExists home-files/.zshrc
assertFileRegex home-files/.zshrc 'export V1="v1"'
assertFileRegex home-files/.zshrc 'export V2="v2-v1"'
'';
};
}