# SPDX-FileCopyrightText: V # 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; }