diff options
Diffstat (limited to 'fleet/modules/declarative-git.nix')
-rw-r--r-- | fleet/modules/declarative-git.nix | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/fleet/modules/declarative-git.nix b/fleet/modules/declarative-git.nix new file mode 100644 index 0000000..ac4bd15 --- /dev/null +++ b/fleet/modules/declarative-git.nix @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: V <v@unfathomable.blue> +# SPDX-License-Identifier: OSL-3.0 + +# TODO(V): Make the option descriptions not be terrible. + +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.declarative.git; + + repoOpts = { name, config, ... }: { + options = { + description = mkOption { + description = "Description of the repository."; + type = types.str; + # Git defaults to "Unnamed repository; edit this file 'description' to name the repository." + # CGit defaults to "[no description]" + default = "Unnamed repository; edit this file 'description' to name the repository."; + }; + + config = mkOption { + description = "Git configuration for the repository."; + type = types.attrs; # TODO(V): be more precise + default = {}; + }; + + hooks = mkOption { + description = "Git hooks for the repository."; + type = with types; attrsOf (listOf path); + default = {}; + }; + }; + }; +in { + options.declarative.git = { + repositories = mkOption { + description = "Repositories to manage declaratively."; + type = types.attrsOf (types.submodule repoOpts); + default = {}; + }; + + hooks = mkOption { + description = "Git hooks to apply to all declarative repositories."; + type = with types; attrsOf (listOf path); + default = {}; + }; + }; + + config.systemd.tmpfiles.packages = mapAttrsToList (name: config: + pkgs.declarative-git-repository { + path = "/var/lib/git/${name}"; + inherit (config) description config; + hooks = zipAttrsWith (_: concatLists) [ cfg.hooks config.hooks ]; + user = "git"; + group = "git"; + }) cfg.repositories; +} |