{ lib, config, pkgs, ... }: let cfg = config.my.home.git; sshPub = builtins.fromTOML (builtins.readFile ../../configs/ssh-pubkeys.toml); in { options.my.home.git = with lib; { enable = mkEnableOption "git configuration"; }; config = lib.mkIf cfg.enable { home.file.".ssh/allowed_signers".text = lib.concatMapStrings (x: "franck@fcuny.net ${x}\n") (with sshPub; [ aptos work git ykey-laptop ]); programs.git = { enable = true; aliases = { s = "status --short --branch"; amend = "commit --amend --no-edit"; }; signing = { key = "key::${sshPub.ykey-laptop}"; signByDefault = true; }; extraConfig = { core.whitespace = "trailing-space,space-before-tab"; color.ui = "true"; gpg = { format = "ssh"; ssh.allowedSignersFile = "~/.ssh/allowed_signers"; }; # abort if the remote branch does not match the local one push.default = "simple"; init.defaultBranch = "main"; pull.rebase = true; rebase = { # Automatically create a temporary stash entry before the # operation begins, and apply it after the operation ends. autoStash = true; # Print a warning if some commits are removed missingCommitsCheck = "warn"; }; branch.autosetuprebase = "remote"; branch.sort = "authordate"; commit.template = "${config.xdg.dataHome}/git/commit.template"; }; userName = "Franck Cuny"; userEmail = "franck@fcuny.net"; extraConfig = { "credential \"https://github.com\"" = { username = "fcuny"; }; "credential \"https://git.fcuny.net\"" = { username = "fcuny"; }; }; ignores = [ (builtins.readFile ./gitignore) ]; }; xdg.dataFile."git/commit.template" = { source = ./commit.template; }; home.packages = with pkgs; [ tools.git-blame-stats gitAndTools.pre-commit ]; }; }