# SPDX-FileCopyrightText: 2018-2023 Simon Bruder # # SPDX-License-Identifier: AGPL-3.0-or-later { config, lib, pkgs, ... }: { programs.git = { enable = true; package = pkgs.gitFull; userName = "Simon Bruder"; userEmail = "simon@sbruder.de"; signing = { key = config.programs.gpg.settings.default-key; signByDefault = true; }; extraConfig = { # Make LTeX not check anything below this. # I often use git commit -v, which adds a full diff that should not be checked. commit.template = toString (pkgs.writeText "git-commit-template" '' # LTeX: enabled=false''); core.quotepath = "off"; pull.ff = "only"; merge = { ff = "only"; }; diff = { age = { # This uses the de facto default key location with no ability to # specify another key. # If decryption fails (e.g. due to a lack of the right private key, # rage’s error message will be displayed instead of the file’s # contents. textconv = toString (pkgs.writeShellScript "git-age-textconv" '' ${pkgs.rage}/bin/rage -d -i ${config.xdg.configHome}/age/keys.txt "$@" 2>&1 || true ''); }; sops.textconv = "${pkgs.sops}/bin/sops -d"; }; sendemail = { confirm = "auto"; smtpserver = "vueko.sbruder.de"; smtpuser = "simon@sbruder.de"; smtpencryption = "tls"; smtpserverport = 587; }; credential = { helper = "!${pkgs.pass-git-helper}/bin/pass-git-helper $@"; }; }; ignores = [ "*.swp" ".ccls-cache" ".direnv" "Session.vim" ]; lfs.enable = true; delta = { enable = true; options = { line-numbers = "true"; side-by-side = "true"; features = "decorations"; syntax-theme = "base16"; blame-code-style = "syntax"; decorations = { commit-decoration-style = "bold yellow box ul"; file-style = "bold yellow ul"; file-decoration-style = "none"; }; }; }; aliases = { ls = "log --stat"; }; includes = map (condition: { inherit condition; contents = { user.email = "simon.bruder@mailbox.tu-dresden.de"; }; }) [ "gitdir:~/Documents/uni/" "gitdir:~/projects/uni/" ]; }; programs.zsh.shellAliases = let defaultBranch = "\${\${\$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null)##refs/remotes/origin/}:-master}"; in { ga = "git add"; gap = "git add --patch"; gc = "git commit"; gco = "git checkout"; gcp = "git cherry-pick"; gcv = "git commit --verbose"; gcam = "git commit --amend"; gd = "git diff"; gdc = "git diff --cached"; gfom = "git fetch origin ${defaultBranch}"; gl = "git log"; glp = "git log --patch"; gls = "git log --stat"; gp = "git push"; grb = "git rebase"; grbc = "git rebase --continue"; grbi = "git rebase -i"; grbias = "git rebase -i --autosquash"; grbim = "git rebase -i ${defaultBranch}"; grbm = "git rebase ${defaultBranch}"; grbom = "git rebase origin/${defaultBranch}"; grs = "git restore"; grss = "git restore --staged"; gs = "git switch"; gsc = "git switch -c"; gsm = "git switch ${defaultBranch}"; gst = "git status"; }; xdg.configFile = { "pass-git-helper/git-pass-mapping.ini".text = lib.generators.toINI { } { "vueko.sbruder.de:587".target = "sbruder.de/mail"; }; }; home.packages = with pkgs; [ gitAndTools.pre-commit # pre-commit hook helper ]; }