vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / programs / direnv.nix
blobf127e959ef01bce25f931734c0472c1333cfdb6c
2   lib,
3   config,
4   pkgs,
5   ...
6 }:
7 let
8   cfg = config.programs.direnv;
9   enabledOption =
10     x:
11     lib.mkEnableOption x
12     // {
13       default = true;
14       example = false;
15     };
18   options.programs.direnv = {
20     enable = lib.mkEnableOption ''
21       direnv integration. Takes care of both installation and
22       setting up the sourcing of the shell. Additionally enables nix-direnv
23       integration. Note that you need to logout and login for this change to apply
24     '';
26     package = lib.mkPackageOption pkgs "direnv" { };
28     enableBashIntegration = enabledOption ''
29       Bash integration
30     '';
31     enableZshIntegration = enabledOption ''
32       Zsh integration
33     '';
34     enableFishIntegration = enabledOption ''
35       Fish integration
36     '';
38     direnvrcExtra = lib.mkOption {
39       type = lib.types.lines;
40       default = "";
41       example = ''
42         export FOO="foo"
43         echo "loaded direnv!"
44       '';
45       description = ''
46         Extra lines to append to the sourced direnvrc
47       '';
48     };
50     silent = lib.mkEnableOption ''
51       the hiding of direnv logging
52     '';
54     loadInNixShell = enabledOption ''
55       loading direnv in `nix-shell` `nix shell` or `nix develop`
56     '';
58     nix-direnv = {
59       enable = enabledOption ''
60         a faster, persistent implementation of use_nix and use_flake, to replace the builtin one
61       '';
63       package = lib.mkOption {
64         default = pkgs.nix-direnv.override { nix = config.nix.package; };
65         defaultText = "pkgs.nix-direnv";
66         type = lib.types.package;
67         description = ''
68           The nix-direnv package to use
69         '';
70       };
71     };
72   };
74   config = lib.mkIf cfg.enable {
76     programs = {
77       zsh.interactiveShellInit = lib.mkIf cfg.enableZshIntegration ''
78         if ${lib.boolToString cfg.loadInNixShell} || printenv PATH | grep -vqc '/nix/store'; then
79          eval "$(${lib.getExe cfg.package} hook zsh)"
80         fi
81       '';
83       #$NIX_GCROOT for "nix develop" https://github.com/NixOS/nix/blob/6db66ebfc55769edd0c6bc70fcbd76246d4d26e0/src/nix/develop.cc#L530
84       #$IN_NIX_SHELL for "nix-shell"
85       bash.interactiveShellInit = lib.mkIf cfg.enableBashIntegration ''
86         if ${lib.boolToString cfg.loadInNixShell} || [ -z "$IN_NIX_SHELL$NIX_GCROOT$(printenv PATH | grep '/nix/store')" ] ; then
87          eval "$(${lib.getExe cfg.package} hook bash)"
88         fi
89       '';
91       fish.interactiveShellInit = lib.mkIf cfg.enableFishIntegration ''
92         if ${lib.boolToString cfg.loadInNixShell};
93         or printenv PATH | grep -vqc '/nix/store';
94          ${lib.getExe cfg.package} hook fish | source
95         end
96       '';
97     };
99     environment = {
100       systemPackages = [
101         # direnv has a fish library which automatically sources direnv for some reason
102         # I don't see any harm in doing this if we're sourcing it with fish.interactiveShellInit
103         (pkgs.symlinkJoin {
104           inherit (cfg.package) name;
105           paths = [ cfg.package ];
106           postBuild = ''
107             rm -rf $out/share/fish
108           '';
109         })
110       ];
112       variables = {
113         DIRENV_CONFIG = "/etc/direnv";
114         DIRENV_LOG_FORMAT = lib.mkIf cfg.silent "";
115       };
117       etc = {
118         "direnv/direnvrc".text = ''
119           ${lib.optionalString cfg.nix-direnv.enable ''
120             #Load nix-direnv
121             source ${cfg.nix-direnv.package}/share/nix-direnv/direnvrc
122           ''}
124            #Load direnvrcExtra
125            ${cfg.direnvrcExtra}
127            #Load user-configuration if present (~/.direnvrc or ~/.config/direnv/direnvrc)
128            direnv_config_dir_home="''${DIRENV_CONFIG_HOME:-''${XDG_CONFIG_HOME:-$HOME/.config}/direnv}"
129            if [[ -f $direnv_config_dir_home/direnvrc ]]; then
130              source "$direnv_config_dir_home/direnvrc" >&2
131            elif [[ -f $HOME/.direnvrc ]]; then
132              source "$HOME/.direnvrc" >&2
133            fi
135            unset direnv_config_dir_home
136         '';
138         "direnv/lib/zz-user.sh".text = ''
139           direnv_config_dir_home="''${DIRENV_CONFIG_HOME:-''${XDG_CONFIG_HOME:-$HOME/.config}/direnv}"
141           for lib in "$direnv_config_dir_home/lib/"*.sh; do
142             source "$lib"
143           done
145           unset direnv_config_dir_home
146         '';
147       };
148     };
149   };
150   meta.maintainers = with lib.maintainers; [ gerg-l ];