Skip to content

Commit

Permalink
Merge pull request #294923 from viperML/nh-module
Browse files Browse the repository at this point in the history
nixos/nh: init
  • Loading branch information
eclairevoyant authored Apr 15, 2024
2 parents ae10a6d + 1d84c76 commit 3947220
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 0 deletions.
2 changes: 2 additions & 0 deletions nixos/doc/manual/release-notes/rl-2405.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m

- binfmt option for AppImage-run to support running [AppImage](https://appimage.org/)'s seamlessly on NixOS.. Available as [programs.appimage.binfmt](#opt-programs.appimage.binfmt).

- [nh](https://github.com/viperML/nh), yet another Nix CLI helper. Available as [programs.nh](#opt-programs.nh.enable).

- [ALVR](https://github.com/alvr-org/alvr), a VR desktop streamer. Available as [programs.alvr](#opt-programs.alvr.enable)

- [RustDesk](https://rustdesk.com), a full-featured open source remote control alternative for self-hosting and security with minimal configuration. Alternative to TeamViewer.
Expand Down
1 change: 1 addition & 0 deletions nixos/modules/module-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@
./programs/neovim.nix
./programs/nethoscope.nix
./programs/nexttrace.nix
./programs/nh.nix
./programs/nix-index.nix
./programs/nix-ld.nix
./programs/nm-applet.nix
Expand Down
96 changes: 96 additions & 0 deletions nixos/modules/programs/nh.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
{ config
, lib
, pkgs
, ...
}:
let
cfg = config.programs.nh;
in
{
meta.maintainers = [ lib.maintainers.viperML ];

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 `FLAKE` environment variable.
`FLAKE` is used by nh as the default flake for performing actions, like `nh os switch`.
'';
};

clean = {
enable = lib.mkEnableOption "periodic garbage collection with nh clean all";

dates = lib.mkOption {
type = lib.types.singleLineStr;
default = "weekly";
description = ''
How often cleanup is performed. Passed to systemd.time
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 =
if (!(cfg.clean.enable -> !config.nix.gc.automatic)) then [
"programs.nh.clean.enable and nix.gc.automatic are both enabled. Please use one or the other to avoid conflict."
] else [ ];

assertions = [
# Not strictly required but probably a good assertion to have
{
assertion = cfg.clean.enable -> cfg.enable;
message = "programs.nh.clean.enable requires programs.nh.enable";
}

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

environment = lib.mkIf cfg.enable {
systemPackages = [ cfg.package ];
variables = lib.mkIf (cfg.flake != null) {
FLAKE = cfg.flake;
};
};

systemd = lib.mkIf cfg.clean.enable {
services.nh-clean = {
description = "Nh clean";
script = "exec ${lib.getExe cfg.package} clean all ${cfg.clean.extraArgs}";
startAt = cfg.clean.dates;
path = [ config.nix.package ];
serviceConfig.Type = "oneshot";
};

timers.nh-clean = {
timerConfig = {
Persistent = true;
};
};
};
};
}

0 comments on commit 3947220

Please sign in to comment.