{ lib, utils, config, pkgs, ... }: let inherit (lib) mkOption mkEnableOption types; cfg = config.bagel.services.git-gc-preserve; enabledServices = lib.filterAttrs (_: gcConfig: gcConfig.enable) cfg; in { options.bagel.services.git-gc-preserve = mkOption { default = { }; description = "Repositories that should be garbage collected"; type = types.attrsOf (types.submodule { options = { enable = mkEnableOption "git-gc-preserve"; user = mkOption { type = types.str; default = "git"; description = "The user which will run the garbage collection script"; example = "forgejo"; }; group = mkOption { type = types.str; default = "git"; description = "The group which will run the garbage collection script"; example = "forgejo"; }; repoPath = mkOption { type = types.path; description = "The path to the git repository that should be garbage collected"; example = "/var/lib/gerrit/git/nixpkgs"; }; timeoutSec = mkOption { type = types.str; default = "1h"; description = "Garbage collection Systemd unit timeout"; example = "infinity"; }; timerConfig = mkOption { type = types.attrsOf utils.systemdUtils.unitOptions.unitOption; default = { OnCalendar = "daily"; }; description = '' When to run the git-gc-preserve. See {manpage}`systemd.timer(5)` for details. ''; example = { OnCalendar = "00:05"; RandomizedDelaySec = "5h"; Persistent = true; }; }; }; }); }; config = { systemd.services = let mkGCService = name: gcConfig: { name = "git-gc-preserve-${name}"; value = { description = "Git-GC-Preserve Service - ${name}"; path = [ pkgs.util-linux ]; serviceConfig = { WorkingDirectory = gcConfig.repoPath; Type = "oneshot"; User = gcConfig.user; Group = gcConfig.group; ExecStart = lib.getExe pkgs.git-gc-preserve; TimeoutSec = gcConfig.timeoutSec; }; }; }; mkServices = lib.mapAttrs' mkGCService; in mkServices enabledServices; systemd.timers = let mkGCTimer = name: gcConfig: { name = "git-gc-preserve-${name}"; value = { wantedBy = [ "timers.target" ]; after = [ "multi-user.target" ]; timerConfig = gcConfig.timerConfig; }; }; mkTimer = lib.mapAttrs' mkGCTimer; in mkTimer enabledServices; }; }