From fb27326bbcc9ee5cce20f6ea85662a8e855d2278 Mon Sep 17 00:00:00 2001 From: Duc Nghiem-Xuan Date: Thu, 29 May 2025 14:54:55 +0900 Subject: [PATCH 1/2] programs/direnv: fix silent option --- modules/programs/direnv.nix | 54 +++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/modules/programs/direnv.nix b/modules/programs/direnv.nix index 533fc8e..fa8c63b 100644 --- a/modules/programs/direnv.nix +++ b/modules/programs/direnv.nix @@ -5,12 +5,12 @@ ... }: let cfg = config.programs.direnv; + format = pkgs.formats.toml {}; in { meta.maintainers = [ lib.maintainers.mattpolzin or "mattpolzin" ]; options.programs.direnv = { - enable = lib.mkEnableOption '' direnv integration. Takes care of both installation and setting up the sourcing of the shell. Additionally enables nix-direnv @@ -54,11 +54,32 @@ in { package = lib.mkPackageOption pkgs "nix-direnv" {}; }; + + settings = lib.mkOption { + inherit (format) type; + default = {}; + example = lib.literalExpression '' + { + global = { + log_format = "-"; + log_filter = "^$"; + }; + } + ''; + description = '' + Direnv configuration. Refer to {manpage}`direnv.toml(1)`. + ''; + }; }; config = lib.mkIf cfg.enable { - programs = { + direnv.settings = lib.mkIf cfg.silent { + global = { + log_format = lib.mkDefault "-"; + log_filter = lib.mkDefault "^$"; + }; + }; zsh.interactiveShellInit = '' if ${lib.boolToString cfg.loadInNixShell} || printenv PATH | grep -vqc '/nix/store'; then eval "$(${lib.getExe cfg.package} hook zsh)" @@ -82,25 +103,24 @@ 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 = [ + (pkgs.symlinkJoin { + inherit (cfg.package) name; + paths = [cfg.package]; + # direnv has a fish library which automatically sources direnv for some reason + # I don't see any harm removing this if we're sourcing it with fish.interactiveShellInit + postBuild = '' + rm -rf "$out/share/fish" + ''; + }) + ]; variables = { DIRENV_CONFIG = "/etc/direnv"; - DIRENV_LOG_FORMAT = lib.mkIf cfg.silent ""; }; - etc = { + "direnv/direnv.toml".source = lib.mkIf (cfg.settings != {}) ( + format.generate "direnv.toml" cfg.settings + ); "direnv/direnvrc".text = '' ${lib.optionalString cfg.nix-direnv.enable '' #Load nix-direnv From daf8e22831c197ee52db43aac266d5a8c3d20e38 Mon Sep 17 00:00:00 2001 From: Duc Nghiem-Xuan Date: Fri, 6 Jun 2025 15:49:37 +0900 Subject: [PATCH 2/2] programs/direnv: add finalPackage readonly option --- modules/programs/direnv.nix | 41 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/modules/programs/direnv.nix b/modules/programs/direnv.nix index fa8c63b..41ab8cd 100644 --- a/modules/programs/direnv.nix +++ b/modules/programs/direnv.nix @@ -19,6 +19,12 @@ in { package = lib.mkPackageOption pkgs "direnv" {}; + finalPackage = lib.mkOption { + type = lib.types.package; + readOnly = true; + description = "The wrapped direnv package."; + }; + direnvrcExtra = lib.mkOption { type = lib.types.lines; default = ""; @@ -74,15 +80,26 @@ in { config = lib.mkIf cfg.enable { programs = { - direnv.settings = lib.mkIf cfg.silent { - global = { - log_format = lib.mkDefault "-"; - log_filter = lib.mkDefault "^$"; + direnv = { + finalPackage = pkgs.symlinkJoin { + inherit (cfg.package) name; + paths = [cfg.package]; + # direnv has a fish library which automatically sources direnv for some reason + postBuild = '' + rm -rf "$out/share/fish" + ''; + meta.mainProgram = "direnv"; + }; + settings = lib.mkIf cfg.silent { + global = { + log_format = lib.mkDefault "-"; + log_filter = lib.mkDefault "^$"; + }; }; }; zsh.interactiveShellInit = '' if ${lib.boolToString cfg.loadInNixShell} || printenv PATH | grep -vqc '/nix/store'; then - eval "$(${lib.getExe cfg.package} hook zsh)" + eval "$(${lib.getExe cfg.finalPackage} hook zsh)" fi ''; @@ -90,29 +107,21 @@ in { #$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)" + eval "$(${lib.getExe cfg.finalPackage} hook bash)" fi ''; fish.interactiveShellInit = '' if ${lib.boolToString cfg.loadInNixShell}; or printenv PATH | grep -vqc '/nix/store'; - ${lib.getExe cfg.package} hook fish | source + ${lib.getExe cfg.finalPackage} hook fish | source end ''; }; environment = { systemPackages = [ - (pkgs.symlinkJoin { - inherit (cfg.package) name; - paths = [cfg.package]; - # direnv has a fish library which automatically sources direnv for some reason - # I don't see any harm removing this if we're sourcing it with fish.interactiveShellInit - postBuild = '' - rm -rf "$out/share/fish" - ''; - }) + cfg.finalPackage ]; variables = { DIRENV_CONFIG = "/etc/direnv";