{ lib, pkgs, config, ... }: with lib; let cfg = config.programs.git; in { options.programs.git = { profiles = mkOption { type = types.attrsOf ( types.submodule ( { name, config, ... }: { options = { name = mkOption { type = types.str; }; email = mkOption { type = types.str; }; signingKey = mkOption { type = types.str; }; dirs = mkOption { type = types.listOf types.str; }; }; } ) ); }; defaultProfile = mkOption { type = types.str; }; }; config = let inherit (cfg) profiles; in { programs.git = { # fix/workaround for https://github.com/NixOS/nixpkgs/issues/169193 settings = { safe.directory = "/etc/nixos"; user = { inherit (profiles."${cfg.defaultProfile}") name email; }; }; signing = { key = profiles."${cfg.defaultProfile}".signingKey; }; includes = flatten ( mapAttrsToList ( name: profile: map (dir: { condition = "gitdir:${dir}"; contents.user = { inherit (profile) name email signingKey; }; }) profile.dirs ) profiles ); }; }; }