Merge pull request #330498 from Gerg-L/direnv

This commit is contained in:
Franz Pletz 2024-07-28 12:17:16 +02:00 committed by GitHub
commit ba4b2978e8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3,9 +3,18 @@
config,
pkgs,
...
}: let
}:
let
cfg = config.programs.direnv;
in {
enabledOption =
x:
lib.mkEnableOption x
// {
default = true;
example = false;
};
in
{
options.programs.direnv = {
enable = lib.mkEnableOption ''
@ -14,7 +23,17 @@ in {
integration. Note that you need to logout and login for this change to apply
'';
package = lib.mkPackageOption pkgs "direnv" {};
package = lib.mkPackageOption pkgs "direnv" { };
enableBashIntegration = enabledOption ''
Bash integration
'';
enableZshIntegration = enabledOption ''
Zsh integration
'';
enableFishIntegration = enabledOption ''
Fish integration
'';
direnvrcExtra = lib.mkOption {
type = lib.types.lines;
@ -32,22 +51,14 @@ in {
the hiding of direnv logging
'';
loadInNixShell =
lib.mkEnableOption ''
loading direnv in `nix-shell` `nix shell` or `nix develop`
''
// {
default = true;
};
loadInNixShell = enabledOption ''
loading direnv in `nix-shell` `nix shell` or `nix develop`
'';
nix-direnv = {
enable =
(lib.mkEnableOption ''
a faster, persistent implementation of use_nix and use_flake, to replace the built-in one
'')
// {
default = true;
};
enable = enabledOption ''
a faster, persistent implementation of use_nix and use_flake, to replace the builtin one
'';
package = lib.mkOption {
default = pkgs.nix-direnv.override { nix = config.nix.package; };
@ -60,14 +71,10 @@ in {
};
};
imports = [
(lib.mkRemovedOptionModule ["programs" "direnv" "persistDerivations"] "persistDerivations was removed as it is no longer necessary")
];
config = lib.mkIf cfg.enable {
programs = {
zsh.interactiveShellInit = ''
zsh.interactiveShellInit = lib.mkIf cfg.enableZshIntegration ''
if ${lib.boolToString cfg.loadInNixShell} || printenv PATH | grep -vqc '/nix/store'; then
eval "$(${lib.getExe cfg.package} hook zsh)"
fi
@ -75,13 +82,13 @@ in {
#$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 = ''
bash.interactiveShellInit = lib.mkIf cfg.enableBashIntegration ''
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 = ''
fish.interactiveShellInit = lib.mkIf cfg.enableFishIntegration ''
if ${lib.boolToString cfg.loadInNixShell};
or printenv PATH | grep -vqc '/nix/store';
${lib.getExe cfg.package} hook fish | source
@ -90,18 +97,17 @@ in {
};
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
'';
}))
];
systemPackages = [
# direnv has a fish library which automatically sources direnv for some reason
# I don't see any harm in doing this if we're sourcing it with fish.interactiveShellInit
(pkgs.symlinkJoin {
inherit (cfg.package) name;
paths = [ cfg.package ];
postBuild = ''
rm -rf $out/share/fish
'';
})
];
variables = {
DIRENV_CONFIG = "/etc/direnv";
@ -141,4 +147,5 @@ in {
};
};
};
meta.maintainers = with lib.maintainers; [ gerg-l ];
}