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

View file

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

View file

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

View file

@ -202,7 +202,7 @@ in
sessionVariables = mkOption { sessionVariables = mkOption {
default = {}; default = {};
type = with types; attrsOf (either int str); type = types.attrs;
example = { MAILCHECK = 30; }; example = { MAILCHECK = 30; };
description = "Environment variables that will be set for zsh session."; 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; i3-keybindings = ./modules/services/window-managers/i3-keybindings.nix;
} }
// import ./modules/misc/pam
// import ./modules/systemd // import ./modules/systemd
) )
// import ./modules/home-environment
// import ./modules/programs/bash
// import ./modules/programs/ssh // 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"'
'';
};
}