|
5 | 5 | ... |
6 | 6 | }: let |
7 | 7 | cfg = config.programs.direnv; |
| 8 | + format = pkgs.formats.toml {}; |
8 | 9 | in { |
9 | 10 | meta.maintainers = [ |
10 | 11 | lib.maintainers.mattpolzin or "mattpolzin" |
11 | 12 | ]; |
12 | 13 | options.programs.direnv = { |
13 | | - |
14 | 14 | enable = lib.mkEnableOption '' |
15 | 15 | direnv integration. Takes care of both installation and |
16 | 16 | setting up the sourcing of the shell. Additionally enables nix-direnv |
|
19 | 19 |
|
20 | 20 | package = lib.mkPackageOption pkgs "direnv" {}; |
21 | 21 |
|
| 22 | + finalPackage = lib.mkOption { |
| 23 | + type = lib.types.package; |
| 24 | + readOnly = true; |
| 25 | + description = "The wrapped direnv package."; |
| 26 | + }; |
| 27 | + |
22 | 28 | direnvrcExtra = lib.mkOption { |
23 | 29 | type = lib.types.lines; |
24 | 30 | default = ""; |
|
54 | 60 |
|
55 | 61 | package = lib.mkPackageOption pkgs "nix-direnv" {}; |
56 | 62 | }; |
| 63 | + |
| 64 | + settings = lib.mkOption { |
| 65 | + inherit (format) type; |
| 66 | + default = {}; |
| 67 | + example = lib.literalExpression '' |
| 68 | + { |
| 69 | + global = { |
| 70 | + log_format = "-"; |
| 71 | + log_filter = "^$"; |
| 72 | + }; |
| 73 | + } |
| 74 | + ''; |
| 75 | + description = '' |
| 76 | + Direnv configuration. Refer to {manpage}`direnv.toml(1)`. |
| 77 | + ''; |
| 78 | + }; |
57 | 79 | }; |
58 | 80 |
|
59 | 81 | config = lib.mkIf cfg.enable { |
60 | | - |
61 | 82 | programs = { |
| 83 | + direnv = { |
| 84 | + finalPackage = pkgs.symlinkJoin { |
| 85 | + inherit (cfg.package) name; |
| 86 | + paths = [cfg.package]; |
| 87 | + # direnv has a fish library which automatically sources direnv for some reason |
| 88 | + postBuild = '' |
| 89 | + rm -rf "$out/share/fish" |
| 90 | + ''; |
| 91 | + meta.mainProgram = "direnv"; |
| 92 | + }; |
| 93 | + settings = lib.mkIf cfg.silent { |
| 94 | + global = { |
| 95 | + log_format = lib.mkDefault "-"; |
| 96 | + log_filter = lib.mkDefault "^$"; |
| 97 | + }; |
| 98 | + }; |
| 99 | + }; |
62 | 100 | zsh.interactiveShellInit = '' |
63 | 101 | if ${lib.boolToString cfg.loadInNixShell} || printenv PATH | grep -vqc '/nix/store'; then |
64 | | - eval "$(${lib.getExe cfg.package} hook zsh)" |
| 102 | + eval "$(${lib.getExe cfg.finalPackage} hook zsh)" |
65 | 103 | fi |
66 | 104 | ''; |
67 | 105 |
|
68 | 106 | #$NIX_GCROOT for "nix develop" https://github.com/NixOS/nix/blob/6db66ebfc55769edd0c6bc70fcbd76246d4d26e0/src/nix/develop.cc#L530 |
69 | 107 | #$IN_NIX_SHELL for "nix-shell" |
70 | 108 | bash.interactiveShellInit = '' |
71 | 109 | if ${lib.boolToString cfg.loadInNixShell} || [ -z "$IN_NIX_SHELL$NIX_GCROOT$(printenv PATH | grep '/nix/store')" ] ; then |
72 | | - eval "$(${lib.getExe cfg.package} hook bash)" |
| 110 | + eval "$(${lib.getExe cfg.finalPackage} hook bash)" |
73 | 111 | fi |
74 | 112 | ''; |
75 | 113 |
|
76 | 114 | fish.interactiveShellInit = '' |
77 | 115 | if ${lib.boolToString cfg.loadInNixShell}; |
78 | 116 | or printenv PATH | grep -vqc '/nix/store'; |
79 | | - ${lib.getExe cfg.package} hook fish | source |
| 117 | + ${lib.getExe cfg.finalPackage} hook fish | source |
80 | 118 | end |
81 | 119 | ''; |
82 | 120 | }; |
83 | 121 |
|
84 | 122 | environment = { |
85 | | - systemPackages = |
86 | | - if cfg.loadInNixShell then [cfg.package] |
87 | | - else [ |
88 | | - #direnv has a fish library which sources direnv for some reason |
89 | | - (cfg.package.overrideAttrs (old: { |
90 | | - installPhase = |
91 | | - (old.installPhase or "") |
92 | | - + '' |
93 | | - rm -rf $out/share/fish |
94 | | - ''; |
95 | | - })) |
96 | | - ]; |
97 | | - |
| 123 | + systemPackages = [ |
| 124 | + cfg.finalPackage |
| 125 | + ]; |
98 | 126 | variables = { |
99 | 127 | DIRENV_CONFIG = "/etc/direnv"; |
100 | | - DIRENV_LOG_FORMAT = lib.mkIf cfg.silent ""; |
101 | 128 | }; |
102 | | - |
103 | 129 | etc = { |
| 130 | + "direnv/direnv.toml".source = lib.mkIf (cfg.settings != {}) ( |
| 131 | + format.generate "direnv.toml" cfg.settings |
| 132 | + ); |
104 | 133 | "direnv/direnvrc".text = '' |
105 | 134 | ${lib.optionalString cfg.nix-direnv.enable '' |
106 | 135 | #Load nix-direnv |
|
0 commit comments