summary refs log tree commit diff
path: root/nixos/modules/programs
diff options
context:
space:
mode:
authorPol Dellaiera <pol.dellaiera@protonmail.com>2023-07-12 16:42:40 +0200
committerGitHub <noreply@github.com>2023-07-12 16:42:40 +0200
commitf3d31474178b8f13f18e45f2d307035e6c85bae3 (patch)
tree3be2fd33e3d922628aaa5910eca1149056a130fe /nixos/modules/programs
parentbf5f8aa26248bd0eb79b07ed67de5e8f5378cd32 (diff)
parent194a3a7d97d3d533e9ce52df77b0673d75bfe07f (diff)
downloadnixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.tar
nixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.tar.gz
nixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.tar.bz2
nixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.tar.lz
nixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.tar.xz
nixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.tar.zst
nixpkgs-f3d31474178b8f13f18e45f2d307035e6c85bae3.zip
Merge pull request #241528 from Gerg-L/nixos/direnvrc
nixos/direnv: init
Diffstat (limited to 'nixos/modules/programs')
-rw-r--r--nixos/modules/programs/direnv.nix147
1 files changed, 147 insertions, 0 deletions
diff --git a/nixos/modules/programs/direnv.nix b/nixos/modules/programs/direnv.nix
new file mode 100644
index 00000000000..53717fae11a
--- /dev/null
+++ b/nixos/modules/programs/direnv.nix
@@ -0,0 +1,147 @@
+{
+  lib,
+  config,
+  pkgs,
+  ...
+}: let
+  cfg = config.programs.direnv;
+in {
+  options.programs.direnv = {
+
+    enable = lib.mkEnableOption (lib.mdDoc ''
+      direnv integration. Takes care of both installation and
+      setting up the sourcing of the shell. Additionally enables nix-direnv
+      integration. Note that you need to logout and login for this change to apply.
+    '');
+
+    package = lib.mkPackageOptionMD pkgs "direnv" {};
+
+    direnvrcExtra = lib.mkOption {
+      type = lib.types.lines;
+      default = "";
+      example = ''
+        export FOO="foo"
+        echo "loaded direnv!"
+      '';
+      description = lib.mdDoc ''
+        Extra lines to append to the sourced direnvrc
+      '';
+    };
+
+    silent = lib.mkEnableOption (lib.mdDoc ''
+      the hiding of direnv logging
+    '');
+
+    persistDerivations =
+      (lib.mkEnableOption (lib.mdDoc ''
+        setting keep-derivations and keep-outputs to true
+        to prevent shells from getting garbage collected
+      ''))
+      // {
+        default = true;
+      };
+
+    loadInNixShell =
+      lib.mkEnableOption (lib.mdDoc ''
+        loading direnv in `nix-shell` `nix shell` or `nix develop`
+      '')
+      // {
+        default = true;
+      };
+
+    nix-direnv = {
+      enable =
+        (lib.mkEnableOption (lib.mdDoc ''
+          a faster, persistent implementation of use_nix and use_flake, to replace the built-in one
+        ''))
+        // {
+          default = true;
+        };
+
+      package = lib.mkPackageOptionMD pkgs "nix-direnv" {};
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+
+    programs = {
+      zsh.interactiveShellInit = ''
+        if ${lib.boolToString cfg.loadInNixShell} || printenv PATH | grep -vqc '/nix/store'; then
+         eval "$(${lib.getExe cfg.package} hook zsh)"
+        fi
+      '';
+
+      #$NIX_GCROOT for "nix develop" https://github.com/NixOS/nix/blob/6db66ebfc55769edd0c6bc70fcbd76246d4d26e0/src/nix/develop.cc#L530
+      #$IN_NIX_SHELL for "nix-shell"
+      bash.interactiveShellInit = ''
+        if ${lib.boolToString cfg.loadInNixShell} || [ -z "$IN_NIX_SHELL$NIX_GCROOT$(printenv PATH | grep '/nix/store')" ] ; then
+         eval "$(${lib.getExe cfg.package} hook bash)"
+        fi
+      '';
+
+      fish.interactiveShellInit = ''
+        if ${lib.boolToString cfg.loadInNixShell};
+        or printenv PATH | grep -vqc '/nix/store';
+         ${lib.getExe cfg.package} hook fish | source
+        end
+      '';
+    };
+
+    nix.settings = lib.mkIf cfg.persistDerivations {
+      keep-outputs = true;
+      keep-derivations = true;
+    };
+
+    environment = {
+      systemPackages =
+        if cfg.loadInNixShell then [cfg.package]
+        else [
+          #direnv has a fish library which sources direnv for some reason
+          (cfg.package.overrideAttrs (old: {
+            installPhase =
+              (old.installPhase or "")
+              + ''
+                rm -rf $out/share/fish
+              '';
+          }))
+        ];
+
+      variables = {
+        DIRENV_CONFIG = "/etc/direnv";
+        DIRENV_LOG_FORMAT = lib.mkIf cfg.silent "";
+      };
+
+      etc = {
+        "direnv/direnvrc".text = ''
+          ${lib.optionalString cfg.nix-direnv.enable ''
+            #Load nix-direnv
+            source ${cfg.nix-direnv.package}/share/nix-direnv/direnvrc
+          ''}
+
+           #Load direnvrcExtra
+           ${cfg.direnvrcExtra}
+
+           #Load user-configuration if present (~/.direnvrc or ~/.config/direnv/direnvrc)
+           direnv_config_dir_home="''${DIRENV_CONFIG_HOME:-''${XDG_CONFIG_HOME:-$HOME/.config}/direnv}"
+           if [[ -f $direnv_config_dir_home/direnvrc ]]; then
+             source "$direnv_config_dir_home/direnvrc" >&2
+           elif [[ -f $HOME/.direnvrc ]]; then
+             source "$HOME/.direnvrc" >&2
+           fi
+
+           unset direnv_config_dir_home
+        '';
+
+        "direnv/lib/zz-user.sh".text = ''
+          direnv_config_dir_home="''${DIRENV_CONFIG_HOME:-''${XDG_CONFIG_HOME:-$HOME/.config}/direnv}"
+
+          for lib in "$direnv_config_dir_home/lib/"*.sh; do
+            source "$lib"
+          done
+
+          unset direnv_config_dir_home
+        '';
+      };
+    };
+  };
+}