{ config , lib , pkgs , ... }: 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 = { ga = "git add"; gap = "git add --patch"; gr = "git restore"; grp = "git restore --patch"; gb = "git branch"; gc = "git commit"; gco = "git checkout"; gd = "git diff"; gds = "git diff --staged"; gp = "git push"; gf = "git fetch"; gF = "git pull"; gs = "git status"; }; home-manager.users.moritz = { programs.git = { enable = true; userName = cfg.identity.name; userEmail = cfg.identity.email; extraConfig = { init.defaultBranch = "main"; merge.conflictstyle = "zdiff3"; diff.external = getExe pkgs.difftastic; }; signing = mkIf cfg.signing { key = "0x970C6E89EB0547A9"; signByDefault = true; }; lfs.enable = true; }; }; programs.git = { enable = true; config.safe.directory = "/home/moritz/.dotfiles"; }; }; }