{ config , lib , ... }: with lib; let cfg = config.my.programs.git; in { options.my.programs.git = { enable = mkEnableOption "git"; signing = mkOption { default = false; type = types.bool; example = true; }; identity = { name = mkOption { default = "Moritz Böhme"; type = types.str; }; email = mkOption { default = "mail@moritzboeh.me"; type = types.str; }; }; }; config = mkIf cfg.enable { my.shell.abbreviations = { g = "git"; gC = "git clone"; gF = "git pull"; gS = "git switch"; ga = "git add"; gap = "git add --patch"; gb = "git branch"; gc = "git commit"; gco = "git checkout"; gd = "git diff"; gds = "git diff --staged"; gf = "git fetch"; gp = "git push"; gr = "git restore"; grm = "git rm --cached"; grp = "git restore --patch"; grps = "git restore --patch --staged"; grs = "git restore --staged"; gs = "git status"; }; home-manager.users.moritz = { programs.git = { enable = true; userName = cfg.identity.name; userEmail = cfg.identity.email; extraConfig = { commit.verbose = true; diff.algorithm = "histogram"; fetch.fsckobjects = true; init.defaultBranch = "main"; merge.conflictstyle = "zdiff3"; push.autoSetupRemote = true; receive.fsckObjects = true; transfer.fsckobjects = true; }; signing = mkIf cfg.signing { key = "0x970C6E89EB0547A9"; signByDefault = true; }; lfs.enable = true; delta.enable = true; }; }; programs.git.enable = true; }; }