dotfiles

My PC Dotfiles & Website

modules/apps/git/git.nix (5658B)


  1## 'git' Configuration ##
  2{config, ...}: let
  3  inherit (config.flake) files;
  4in {
  5  flake.modules = {
  6    nixos.git = {
  7      config,
  8      lib,
  9      pkgs,
 10      ...
 11    }: {
 12      options.apps.git.package = lib.mkOption {
 13        description = "System 'git' package";
 14        type = lib.types.package;
 15        default = pkgs.gitFull;
 16      };
 17
 18      config = {
 19        # Utilities
 20        environment.systemPackages = with pkgs; [
 21          config.apps.git.package
 22          git-crypt
 23          git-lfs
 24          gh
 25          tig
 26          treefmt
 27        ];
 28      };
 29    };
 30
 31    homeManager.git = {
 32      config,
 33      lib,
 34      ...
 35    }: let
 36      cfg = config.credentials;
 37    in {
 38      assertions = [
 39        {
 40          assertion = cfg.mail != "";
 41          message = "User Mail ID must be set";
 42        }
 43      ];
 44
 45      home = {
 46        persist.directories = [
 47          ".git-hooks"
 48          ".config/gh"
 49        ];
 50
 51        # Hooks
 52        file = lib.mapAttrs' (
 53          name: _:
 54            lib.nameValuePair ".git-hooks/${name}" {
 55              text = builtins.readFile "${files.git.hooks}/${name}";
 56              executable = true;
 57            }
 58        ) (builtins.readDir files.git.hooks);
 59      };
 60
 61      # GitHub CLI
 62      programs = {
 63        gh = {
 64          enable = true;
 65          gitCredentialHelper.enable = true;
 66          settings = {
 67            prompt = "enabled";
 68            git_protocol = "https";
 69            aliases = rec {
 70              a = "alias list";
 71              b = "browse";
 72              cfg = "config";
 73              ci = "run";
 74              co = "${p} checkout";
 75              g = "gpg-key";
 76              i = "issue";
 77              ic = "${i} close";
 78              is = "${i} status";
 79              iv = "${i} view";
 80              p = "pr";
 81              pm = "${p} merge";
 82              pv = "${p} view";
 83              r = "repo";
 84              rd = "${rl} download";
 85              rl = "release";
 86              rv = "${rl} view";
 87              s = "secret";
 88              w = "workflow";
 89            };
 90          };
 91        };
 92
 93        # Pager
 94        delta = {
 95          enable = true;
 96          enableGitIntegration = true;
 97          options = {
 98            line-numbers = true;
 99            theme = lib.mkDefault "Monokai Extended";
100            conflictstyle = "diff3";
101          };
102        };
103
104        ## 'git' Settings
105        git = {
106          enable = true;
107          lfs.enable = true;
108
109          signing = {
110            format = "openpgp";
111            signByDefault = lib.mkIf (cfg.key != "") true;
112            key = lib.mkIf (cfg.key != "") (builtins.substring 24 30 cfg.key);
113          };
114
115          # Globally Ignored Files
116          ignores = [
117            "*~*"
118            "*.bak"
119            ".direnv"
120            "result"
121            "result-*"
122          ];
123
124          settings = {
125            color.ui = "auto";
126            core.hooksPath = "~/.git-hooks";
127            credential.helper = lib.mkDefault ["libsecret"];
128            diff.colorMoved = "default";
129            init.defaultBranch = "main";
130            pull.rebase = "true";
131            safe.directory = files.path.system;
132
133            # User Identity
134            user.name = cfg.name;
135            user.email = cfg.mail;
136            github.user = cfg.name;
137
138            # Command Aliases
139            alias = rec {
140              a = "add";
141              ad = "${a} -A .";
142              ai = "${a} -i";
143              ap = "${a} -p";
144              b = "branch";
145              bc = "${b} --show-current";
146              bd = "${b} -D";
147              backup = "!CURRENT=$(git ${bc}) && git ${st} && git ${co} -B backup && git ${st} apply && git ${ad} && git ${cam} \"backup\" && git ${pf} $1 && git ${co} $CURRENT && git ${stp} && git ${bd} backup && :";
148              cfg = "config";
149              ci = "commit -v";
150              cam = "${ci} -am";
151              cia = "${ci} -a";
152              cmx = "log -1 --format=%B";
153              co = "checkout";
154              cp = "cherry-pick";
155              cpp = "!CURRENT=$(git ${bc}) && git ${st} && git ${co} -B $2 $3 && git ${cp} $1 && git ${pf} $4 && git ${co} $CURRENT && git ${stp} && :";
156              d = "diff";
157              df = "${d} HEAD";
158              dx = "${d} --color-words";
159              dc = "${d} --cached";
160              dcx = "${dc} --color-words";
161              l = "log --graph --decorate --abbrev-commit";
162              l1 = "${l} --pretty=oneline --all";
163              lf = "log -p --follow";
164              lg = "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit --date=relative --branches";
165              ll = "${l} -p";
166              m = "merge";
167              ms = "${m} --squash";
168              p = "push";
169              pf = "${p} --force";
170              pl = "!git pull && git fetch -p";
171              pt = "${p} --tag";
172              pu = "${p} --set-upstream";
173              rb = "rebase";
174              record = ''!f() { (git ${a} -p -- "$@" && git ${ci}) || git ${r}; }; f'';
175              ro = "restore";
176              r = "reset";
177              rs = "${r} --soft";
178              rh = "${r} --hard";
179              rsh = "${rs} HEAD^";
180              s = "!git --no-pager status";
181              sm = "submodule";
182              st = "stash";
183              std = "${st} drop";
184              sti = "${st} --keep-index";
185              stp = "${st} pop";
186              sync = "${pf} --mirror";
187              t = "tag";
188              td = "!git ${t} -d $1 && git ${p} origin :$1 && :";
189              tl = "${t} -l";
190            };
191          };
192        };
193      };
194    };
195  };
196}