vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / programs / nh.nix
blobc42fb2fc724a75547e2537bb1f5199e8b86c0119
1 { config
2 , lib
3 , pkgs
4 , ...
5 }:
6 let
7   cfg = config.programs.nh;
8 in
10   meta.maintainers = [ lib.maintainers.viperML ];
12   options.programs.nh = {
13     enable = lib.mkEnableOption "nh, yet another Nix CLI helper";
15     package = lib.mkPackageOption pkgs "nh" { };
17     flake = lib.mkOption {
18       type = lib.types.nullOr lib.types.path;
19       default = null;
20       description = ''
21         The path that will be used for the `FLAKE` environment variable.
23         `FLAKE` is used by nh as the default flake for performing actions, like `nh os switch`.
24       '';
25     };
27     clean = {
28       enable = lib.mkEnableOption "periodic garbage collection with nh clean all";
30       dates = lib.mkOption {
31         type = lib.types.singleLineStr;
32         default = "weekly";
33         description = ''
34           How often cleanup is performed. Passed to systemd.time
36           The format is described in
37           {manpage}`systemd.time(7)`.
38         '';
39       };
41       extraArgs = lib.mkOption {
42         type = lib.types.singleLineStr;
43         default = "";
44         example = "--keep 5 --keep-since 3d";
45         description = ''
46           Options given to nh clean when the service is run automatically.
48           See `nh clean all --help` for more information.
49         '';
50       };
51     };
52   };
54   config = {
55     warnings =
56       if (!(cfg.clean.enable -> !config.nix.gc.automatic)) then [
57         "programs.nh.clean.enable and nix.gc.automatic are both enabled. Please use one or the other to avoid conflict."
58       ] else [ ];
60     assertions = [
61       # Not strictly required but probably a good assertion to have
62       {
63         assertion = cfg.clean.enable -> cfg.enable;
64         message = "programs.nh.clean.enable requires programs.nh.enable";
65       }
67       {
68         assertion = (cfg.flake != null) -> !(lib.hasSuffix ".nix" cfg.flake);
69         message = "nh.flake must be a directory, not a nix file";
70       }
71     ];
73     environment = lib.mkIf cfg.enable {
74       systemPackages = [ cfg.package ];
75       variables = lib.mkIf (cfg.flake != null) {
76         FLAKE = cfg.flake;
77       };
78     };
80     systemd = lib.mkIf cfg.clean.enable {
81       services.nh-clean = {
82         description = "Nh clean";
83         script = "exec ${lib.getExe cfg.package} clean all ${cfg.clean.extraArgs}";
84         startAt = cfg.clean.dates;
85         path = [ config.nix.package ];
86         serviceConfig.Type = "oneshot";
87       };
89       timers.nh-clean = {
90         timerConfig = {
91           Persistent = true;
92         };
93       };
94     };
95   };