Skip to content

Commit

Permalink
nh: add module
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnRTitor authored and rycee committed Oct 20, 2024
1 parent 122f705 commit 892a644
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 0 deletions.
12 changes: 12 additions & 0 deletions modules/misc/news.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1789,6 +1789,18 @@ in {
cmus is a small, fast and powerful console music player.
'';
}

{
time = "2024-10-20T07:53:54+00:00";
condition = hostPlatform.isLinux;
message = ''
A new module is available: 'programs.nh'.
nh is yet another Nix CLI helper. Adding functionality on top of the
existing solutions, like nixos-rebuild, home-manager cli or nix
itself.
'';
}
];
};
}
1 change: 1 addition & 0 deletions modules/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ let
./programs/neovide.nix
./programs/neovim.nix
./programs/newsboat.nix
./programs/nh.nix
./programs/nheko.nix
./programs/nix-index.nix
./programs/nnn.nix
Expand Down
94 changes: 94 additions & 0 deletions modules/programs/nh.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
{ config, osConfig, lib, pkgs, ... }:

let

cfg = config.programs.nh;

in {
meta.maintainers = with lib.maintainers; [ johnrtitor ];

options.programs.nh = {
enable = lib.mkEnableOption "nh, yet another Nix CLI helper";

package = lib.mkPackageOption pkgs "nh" { };

flake = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
description = ''
The path that will be used for the {env}`FLAKE` environment variable.
{env}`FLAKE` is used by nh as the default flake for performing actions,
like {command}`nh os switch`.
'';
};

clean = {
enable = lib.mkEnableOption ''
periodic garbage collection for user profile and nix store with nh clean
user'';

dates = lib.mkOption {
type = lib.types.singleLineStr;
default = "weekly";
description = ''
How often cleanup is performed.
The format is described in {manpage}`systemd.time(7)`.
'';
};

extraArgs = lib.mkOption {
type = lib.types.singleLineStr;
default = "";
example = "--keep 5 --keep-since 3d";
description = ''
Options given to nh clean when the service is run automatically.
See `nh clean all --help` for more information.
'';
};
};
};

config = {
warnings = lib.optionals (!(cfg.clean.enable -> !osConfig.nix.gc.automatic))
[
"programs.nh.clean.enable and nix.gc.automatic (system-wide in configuration.nix) are both enabled. Please use one or the other to avoid conflict."
];

assertions = [{
assertion = (cfg.flake != null) -> !(lib.hasSuffix ".nix" cfg.flake);
message = "nh.flake must be a directory, not a nix file";
}];

home = lib.mkIf cfg.enable {
packages = [ cfg.package ];
sessionVariables = lib.mkIf (cfg.flake != null) { FLAKE = cfg.flake; };
};

systemd.user = lib.mkIf cfg.clean.enable {
services.nh-clean = {
Unit.Description = "Nh clean (user)";

Service = {
Type = "oneshot";
ExecStart =
"exec ${lib.getExe cfg.package} clean user ${cfg.clean.extraArgs}";
Environment = "PATH=$PATH:${config.nix.package}";
};
};

timers.nh-clean = {
Unit.Description = "Run nh clean";

Timer = {
OnCalendar = cfg.clean.dates;
Persistent = true;
};

Install.WantedBy = [ "timers.target" ];
};
};
};
}

0 comments on commit 892a644

Please sign in to comment.