From 72f4d849fe995ee514d324b4fee267001b965d51 Mon Sep 17 00:00:00 2001 From: punkfairie Date: Sat, 16 Nov 2024 17:12:58 -0800 Subject: [PATCH] feat(home): Git --- homes/x86_64-linux/marley@nyx/default.nix | 1 + modules/home/programs/git/aliases.nix | 175 +++++++++ modules/home/programs/git/default.nix | 291 +++++++++++++++ old/home/programs/git.nix | 436 ---------------------- 4 files changed, 467 insertions(+), 436 deletions(-) create mode 100644 modules/home/programs/git/aliases.nix create mode 100644 modules/home/programs/git/default.nix delete mode 100644 old/home/programs/git.nix diff --git a/homes/x86_64-linux/marley@nyx/default.nix b/homes/x86_64-linux/marley@nyx/default.nix index bf1a19d..197b704 100644 --- a/homes/x86_64-linux/marley@nyx/default.nix +++ b/homes/x86_64-linux/marley@nyx/default.nix @@ -25,6 +25,7 @@ in fish = enabled; fzf = enabled; gh = enabled; + git = enabled; journalctl = enabled; neo = enabled; systemctl = enabled; diff --git a/modules/home/programs/git/aliases.nix b/modules/home/programs/git/aliases.nix new file mode 100644 index 0000000..ebbd710 --- /dev/null +++ b/modules/home/programs/git/aliases.nix @@ -0,0 +1,175 @@ +{ + lib, + config, + namespace, + ... +}: +let + inherit (lib) mkIf; + + cfg = config.${namespace}.programs.git; +in +{ + config = mkIf cfg.enable { + + # █████╗ ██╗ ██╗ █████╗ ███████╗███████╗███████╗ + # ██╔══██╗██║ ██║██╔══██╗██╔════╝██╔════╝██╔════╝ + # ███████║██║ ██║███████║███████╗█████╗ ███████╗ + # ██╔══██║██║ ██║██╔══██║╚════██║██╔══╝ ╚════██║ + # ██║ ██║███████╗██║██║ ██║███████║███████╗███████║ + # ╚═╝ ╚═╝╚══════╝╚═╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ + + programs.git.aliases = + let + fish_fns = config.programs.fish.functions; + in + { + ### Staging ### + + a = "add"; + aa = "add --all"; + + # Interactively stage parts of a file. + apa = "add --patch"; + + da = "diff"; + das = "diff --staged"; + daw = "diff --word-diff"; # Show diff by word. + dasw = "diff --staged --word-diff"; + + d = "!f() { git diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; + ds = "!f() { git diff --staged \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; + dw = "!f() { git diff --word-diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; + dsw = "!f() { git diff --staged --word-diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; + + st = "status --short --branch"; + stu = "status --short --branch --untracked-files"; + stl = "status"; + + ### Committing ### + + c = "commit"; + ce = "commit --amend"; + cen = "commit --amend --no-edit --no-verify"; + ca = "!git add --alll && git commit"; + cae = "!git add --all && git commit --amend"; + caen = "!git add --all && git commit --amend --no-edit --no-verify"; + cfu = "commit --fixup"; + + rev = "revert"; + + ### Working Dir & Index Manipulation ### + + co = "checkout"; + + rt = "reset"; + + rts = "reset --soft"; # undo commits & stage their changes + + rs = "restore --worktree"; # revert local changes + rst = "restore --staged"; # unstage things + rsa = "restore --worktree --staged"; + + rss = "restore --worktree --source"; # specify a commit to revert to + rsts = "restore --staged --source"; + rsas = "restore --worktree --staged --source"; + + rmc = "rm --cached"; # leave worktree copy alone + + sta = "stash push"; + stam = "stash push --message"; + staa = "stash push --include-untracted"; + staam = "stash push --include-untracted --message"; + + stap = "stash pop"; + stal = "stash list"; + stas = "stash show --text"; + + cl = "clean -force"; # remove untracked & unignored files + cldr = "clean --dry-run"; + + ### Branches ### + + b = "branch"; + cb = "checkout -b"; + cm = lib.mkIf (fish_fns ? git_main_branch) "!git checkout $(git_main_branch)"; + cd = lib.mkIf (fish_fns ? git_develop_branch) "!git checkout $(git_develop_branch)"; + + m = "merge"; + mtl = "mergetool --no-prompt"; + ma = "merge --abort"; + + cp = "cherry-pick"; + cpa = "cherry-pick --abort"; + cpc = "cherry-pick --continue"; + cpq = "cherry-pick --quit"; + + ### Remotes ### + + p = "push"; + pv = "push --verbose"; + pdr = "push --dry-run"; + pf = "push --force-with-lease --force-if-includes"; + pfv = "push --verbose --force-with-lease --force-if-includes"; + pff = "push --force"; + pffv = "push --verbose --force"; + + f = "fetch"; + fa = "fetch --all --prune"; + + pl = "pull"; + plr = "pull --rebase"; + + sub = "submodule"; + subu = "submodule update --init --recursive"; + + r = "remote"; + rv = "remote --verbose"; + ra = "remote add"; + rrm = "remote remove"; + rmv = "remote rename"; + rset = "remote set-url"; + rup = "remote update"; + + ### Logs ### + + # Current branch. + l = "log --pretty=lc --graph"; + lo = "log --pretty=lo --graph --date=human"; + ls = "log --pretty=lo --graph --date=human --simplify-by-decoration"; + lf = "log --pretty=lf --graph"; + ld = "log --pretty=lf --graph --cc --stat"; + lp = "log --pretty=lf --graph --cc --patch"; + + lr = "log -5 --pretty=lc --graph"; + lro = "log -5 --pretty=lo --graph --date=human"; + lrs = "log -5 --pretty=lo --graph --date=human --simplify-by-decoration"; + lrf = "log -5 --pretty=lf --graph"; + lrd = "log -5 --pretty=lf --graph --cc --stat"; + lrp = "log -5 --pretty=lf --graph --cc --patch"; + + # All branches on all remotes. + la = "log --pretty=lc --graph --all"; + lao = "log --pretty=lo --graph --all --date=human"; + las = "log --pretty=lo --graph --all --date=human --simplify-by-decoration"; + laf = "log --pretty=lf --graph --all"; + lad = "log --pretty=lf --graph --all --cc --stat"; + lap = "log --pretty=lf --graph --all --cc --patch"; + + lar = "log -5 --pretty=lc --graph --all"; + laro = "log -5 --pretty=lo --graph --all --date=human"; + lars = "log -5 --pretty=lo --graph --all --date=human --simplify-by-decoration"; + larf = "log -5 --pretty=lf --graph --all"; + lard = "log -5 --pretty=lf --graph --all --cc --stat"; + larp = "log -5 --pretty=lf --graph --all --cc --patch"; + + ### Shortcuts ### + + nevermind = "!git reset --hard head && git clean -df"; + + open = lib.mkIf (config.programs.fish.enable && (fish_fns ? git_open)) "!fish -c git_open"; + + chash = "!git log --oneline | gum filter --height 10 | cut -d' ' -f1 | cb &>/dev/null"; + }; + }; +} diff --git a/modules/home/programs/git/default.nix b/modules/home/programs/git/default.nix new file mode 100644 index 0000000..bfd8cca --- /dev/null +++ b/modules/home/programs/git/default.nix @@ -0,0 +1,291 @@ +{ + lib, + config, + namespace, + pkgs, + ... +}: +let + inherit (lib) mkIf; + inherit (lib.${namespace}) mkEnableModule; + + cfg = config.${namespace}.programs.git; +in +{ + options = mkEnableModule "programs.git"; + + config = mkIf cfg.enable { + imports = [ + ./aliases.nix + ]; + + home.packages = with pkgs; [ + gum + clipboard-jh + ]; + + # ██████╗ ██╗████████╗ + # ██╔════╝ ██║╚══██╔══╝ + # ██║ ███╗██║ ██║ + # ██║ ██║██║ ██║ + # ╚██████╔╝██║ ██║ + # ╚═════╝ ╚═╝ ╚═╝ + + programs.git = { + enable = true; + + userName = "punkfairie"; + userEmail = "marley@punkfairie.net"; + + signing = { + signByDefault = true; + key = null; + }; + + lfs.enable = true; + + ignores = [ + "tags*" + "gems.tags" + ]; + + attributes = [ + # Auto-normalize line endings. + "* text=auto" + + "*.png binary" + "*.jpg binary" + "*.jpeg binary" + "*.bmp binary" + ]; + + # ██████╗ ███████╗██╗ ████████╗ █████╗ + # ██╔══██╗██╔════╝██║ ╚══██╔══╝██╔══██╗ + # ██║ ██║█████╗ ██║ ██║ ███████║ + # ██║ ██║██╔══╝ ██║ ██║ ██╔══██║ + # ██████╔╝███████╗███████╗██║ ██║ ██║ + # ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ + + # delta = { + # enable = true; + # + # options = { + # navigate = true; + # # TODO: Add to rose-pine-nix + # syntax-theme = "${theme.colors.base}"; + # features = "mellow-barbet"; + # true-color = "always"; + # hyperlinks = true; + # }; + # }; + + # ██████╗ ██╗███████╗███████╗████████╗ █████╗ ███████╗████████╗██╗ ██████╗ + # ██╔══██╗██║██╔════╝██╔════╝╚══██╔══╝██╔══██╗██╔════╝╚══██╔══╝██║██╔════╝ + # ██║ ██║██║█████╗ █████╗ ██║ ███████║███████╗ ██║ ██║██║ + # ██║ ██║██║██╔══╝ ██╔══╝ ██║ ██╔══██║╚════██║ ██║ ██║██║ + # ██████╔╝██║██║ ██║ ██║ ██║ ██║███████║ ██║ ██║╚██████╗ + # ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ + + difftastic = { + enable = true; + }; + + # ██████╗ ██████╗ ███╗ ██╗███████╗██╗ ██████╗ + # ██╔════╝██╔═══██╗████╗ ██║██╔════╝██║██╔════╝ + # ██║ ██║ ██║██╔██╗ ██║█████╗ ██║██║ ███╗ + # ██║ ██║ ██║██║╚██╗██║██╔══╝ ██║██║ ██║ + # ╚██████╗╚██████╔╝██║ ╚████║██║ ██║╚██████╔╝ + # ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ + + extraConfig = { + core = { + # Whitespace types to treat as errors. + # blank-at-eol: looks for spaces at EOL. + # -blank-at-eof: allows blank lines at EOF. + # space-before-tab: looks for spaces immediately before tabs at the + # beginning of the line. + whitespace = "blank-at-eol,-blank-at-eof,space-before-tab"; + + # Prevent showing files whose names contain non-ASCII symbols as + # unversioned. + precomposeunicode = false; + + # Speed up commands involving untracked files such as `git status`. + untrackedCache = true; + }; + + # Do not guess the user's identity. + user.useConfigOnly = true; + + color.diff = "always"; + + pretty = { + lo = "tformat:%C(auto)%h%C(reset)%C(auto)%d%C(reset) %s %C(italic blue)%ad%C(reset) %C(241)%aN%C(reset)"; + lc = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n"; + lt = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n%w(0,7,7)%+(trailers:only,unfold)"; + lf = "format:%C(auto)%h%C(reset)%C(auto)%d%C(reset) %C(italic 239)[P: %p] [T: %t]%C(reset)%n%C(white)Author:%C(reset) %aN %C(241)<%aE>%C(reset)%n %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%n%C(white)Commit:%C(reset) %cN %C(241)<%cE>%C(reset) %C(italic 239)[GPG: %G?% GK]%C(reset)%n %C(italic blue)%cd%C(reset) %C(italic cyan)(%cr)%C(reset)%w(0,4,4)%n%n%C(bold)%s%C(reset)%n%n%-b%n%n%-N%n"; + rlo = "tformat:%C(auto)%h%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset)%C(auto)%d%C(reset) %gs %C(italic blue)%ad%C(reset) %C(241)%aN%C(reset)"; + rlc = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n %C(white)⤷%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset) %gs %C(241)- %gN <%gE>%C(reset)%n"; + rlt = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n %C(white)⤷%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset) %gs %C(241)- %gN <%gE>%C(reset)%n%w(0,7,7)%+(trailers:only,unfold)"; + rlf = "format:%C(auto)%h%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset)%C(auto)%d%C(reset) %C(italic 239)[P: %p] [T: %t]%C(reset)%n%C(white)Author:%C(reset) %aN %C(241)<%aE>%C(reset)%n %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%n%C(white)Commit:%C(reset) %cN %C(241)<%cE>%C(reset) %C(italic 239)[GPG: %G?% GK]%C(reset)%n %C(italic blue)%cd%C(reset) %C(italic cyan)(%cr)%C(reset)%n%C(white)Reflog:%C(reset) %gN %C(241)<%gE>%C(reset)%n %C(italic)%gs%C(reset)%w(0,4,4)%n%n%C(bold)%s%C(reset)%n%n%-b%n%n%-N%n"; + }; + + init.defaultBranch = "main"; + + status.showstash = true; + + push = { + autoSetupRemote = true; + + # Push tags automatically. + followTags = true; + }; + + rebase.autosquash = true; + + merge = { + # Use nvim for merging, specifically the view showing LOCAL, MERGED, + # REMOTE. + tool = "nvimdiff2"; + + # Include summaries of merged commits in merge commit messages. + log = true; + + # delta. + conflictstyle = "diff3"; + }; + + mergetool = { + keepBackup = false; + hideResolved = true; + }; + + diff = { + # Detect when files are copied as well as renamed. + renames = "copies"; + + # delta + colorMoved = "default"; + }; + + # Fix whitespace errors when applying a patch, as specified in + # core.whitespace. + apply.whitespace = "fix"; + + branch = { + # Show most recently changed branches first. + sort = "-committerdate"; + + autoSetupMerge = "simple"; + }; + + credential.helper = "store"; + }; + + # ███╗ ███╗██╗███████╗ ██████╗ + # ████╗ ████║██║██╔════╝██╔════╝ + # ██╔████╔██║██║███████╗██║ + # ██║╚██╔╝██║██║╚════██║██║ + # ██║ ╚═╝ ██║██║███████║╚██████╗ + # ╚═╝ ╚═╝╚═╝╚══════╝ ╚═════╝ + + home.shellAbbrs = { + g = "git"; + }; + + programs.fish.functions = lib.mkIf config.programs.fish.enable { + git_develop_branch = # fish + '' + command git rev-parse --git-dir &>/dev/null || return + set -l branch + + for branch in dev devel develop development + if command git show-ref -q --verify refs/heads/$branch + echo $branch + return 0 + end + end + + echo develop + return 1 + ''; + + git_main_branch = # fish + '' + command git rev-parse --git-dir &>/dev/null || return + set -l ref + + for ref in + refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,master} + if command git show-ref -q --verify $ref + echo (basename $ref) + return 0 + end + end + + echo main + return 1 + ''; + + git_current_branch = # fish + '' + set -l ref (git symbolic-ref --quiet HEAD 2>/dev/null) + set -l ret $status + + if [ $ret -ne 0 ] + [ $ret -eq 128 ] && return # no git repo + set ref (git rev-parse --short HEAD 2>/dev/null) || return + end + + echo (string replace "refs/heads/" "" $ref) + ''; + + git_open = # fish + '' + set -f origin "$(git remote get-url origin)" + + switch "$origin" + case "*github*" + if command -v gh &>/dev/null + gh repo view --web &>/dev/null + else + set_color red + echo "[ERROR] Install gh-cli to open Github repos." >&2 + set_color normal + return 1 + end + case "https://*" + open '$origin' >/dev/null & + case "*" + set_color red + printf "[ERROR] Unrecognized origin %s" "$origin" >&2 + return 1 + end + ''; + }; + }; + }; +} + +# ███╗ ██╗ ██████╗ ████████╗███████╗███████╗ +# ████╗ ██║██╔═══██╗╚══██╔══╝██╔════╝██╔════╝ +# ██╔██╗ ██║██║ ██║ ██║ █████╗ ███████╗ +# ██║╚██╗██║██║ ██║ ██║ ██╔══╝ ╚════██║ +# ██║ ╚████║╚██████╔╝ ██║ ███████╗███████║ +# ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚══════╝╚══════╝ + +# PATH VALUES: +# :/ - all files within the root of the working tree, so all files in the +# repo, a la git add's --all option. + +# A note on reset, restore, and revert, paraphrased from `man git`, plus my +# own on `rm`: +# +# revert - make a new commit that reverts a previous commit. +# restore - undo uncommitted changes in the working tree. +# reset - update the branch and change commit history. +# rm - same as system rm; remove files, either from git's knowledge, the +# working directory, or both. +# +# These are not a description of the *possible* uses, rather a narrowing of +# the *intended* uses. diff --git a/old/home/programs/git.nix b/old/home/programs/git.nix deleted file mode 100644 index e101065..0000000 --- a/old/home/programs/git.nix +++ /dev/null @@ -1,436 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: -{ - home.packages = with pkgs; [ - gum - clipboard-jh - ]; - - # ██████╗ ██╗████████╗ - # ██╔════╝ ██║╚══██╔══╝ - # ██║ ███╗██║ ██║ - # ██║ ██║██║ ██║ - # ╚██████╔╝██║ ██║ - # ╚═════╝ ╚═╝ ╚═╝ - - programs.git = { - enable = true; - - userName = "punkfairie"; - userEmail = "marley@punkfairie.net"; - - signing = { - signByDefault = true; - key = null; - }; - - lfs.enable = true; - - ignores = [ - "tags*" - "gems.tags" - ]; - - attributes = [ - # Auto-normalize line endings. - "* text=auto" - - "*.png binary" - "*.jpg binary" - "*.jpeg binary" - "*.bmp binary" - ]; - - # ██████╗ ███████╗██╗ ████████╗ █████╗ - # ██╔══██╗██╔════╝██║ ╚══██╔══╝██╔══██╗ - # ██║ ██║█████╗ ██║ ██║ ███████║ - # ██║ ██║██╔══╝ ██║ ██║ ██╔══██║ - # ██████╔╝███████╗███████╗██║ ██║ ██║ - # ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ - - # delta = { - # enable = true; - # - # options = { - # navigate = true; - # # TODO: Add to rose-pine-nix - # syntax-theme = "rose-pine"; - # features = "mellow-barbet"; - # true-color = "always"; - # hyperlinks = true; - # }; - # }; - - # ██████╗ ██╗███████╗███████╗████████╗ █████╗ ███████╗████████╗██╗ ██████╗ - # ██╔══██╗██║██╔════╝██╔════╝╚══██╔══╝██╔══██╗██╔════╝╚══██╔══╝██║██╔════╝ - # ██║ ██║██║█████╗ █████╗ ██║ ███████║███████╗ ██║ ██║██║ - # ██║ ██║██║██╔══╝ ██╔══╝ ██║ ██╔══██║╚════██║ ██║ ██║██║ - # ██████╔╝██║██║ ██║ ██║ ██║ ██║███████║ ██║ ██║╚██████╗ - # ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ - - difftastic = { - enable = true; - }; - - # ██████╗ ██████╗ ███╗ ██╗███████╗██╗ ██████╗ - # ██╔════╝██╔═══██╗████╗ ██║██╔════╝██║██╔════╝ - # ██║ ██║ ██║██╔██╗ ██║█████╗ ██║██║ ███╗ - # ██║ ██║ ██║██║╚██╗██║██╔══╝ ██║██║ ██║ - # ╚██████╗╚██████╔╝██║ ╚████║██║ ██║╚██████╔╝ - # ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ - - extraConfig = { - core = { - # Whitespace types to treat as errors. - # blank-at-eol: looks for spaces at EOL. - # -blank-at-eof: allows blank lines at EOF. - # space-before-tab: looks for spaces immediately before tabs at the - # beginning of the line. - whitespace = "blank-at-eol,-blank-at-eof,space-before-tab"; - - # Prevent showing files whose names contain non-ASCII symbols as - # unversioned. - precomposeunicode = false; - - # Speed up commands involving untracked files such as `git status`. - untrackedCache = true; - }; - - # Do not guess the user's identity. - user.useConfigOnly = true; - - color.diff = "always"; - - pretty = { - lo = "tformat:%C(auto)%h%C(reset)%C(auto)%d%C(reset) %s %C(italic blue)%ad%C(reset) %C(241)%aN%C(reset)"; - lc = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n"; - lt = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n%w(0,7,7)%+(trailers:only,unfold)"; - lf = "format:%C(auto)%h%C(reset)%C(auto)%d%C(reset) %C(italic 239)[P: %p] [T: %t]%C(reset)%n%C(white)Author:%C(reset) %aN %C(241)<%aE>%C(reset)%n %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%n%C(white)Commit:%C(reset) %cN %C(241)<%cE>%C(reset) %C(italic 239)[GPG: %G?% GK]%C(reset)%n %C(italic blue)%cd%C(reset) %C(italic cyan)(%cr)%C(reset)%w(0,4,4)%n%n%C(bold)%s%C(reset)%n%n%-b%n%n%-N%n"; - rlo = "tformat:%C(auto)%h%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset)%C(auto)%d%C(reset) %gs %C(italic blue)%ad%C(reset) %C(241)%aN%C(reset)"; - rlc = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n %C(white)⤷%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset) %gs %C(241)- %gN <%gE>%C(reset)%n"; - rlt = "format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n %C(white)⤷%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset) %gs %C(241)- %gN <%gE>%C(reset)%n%w(0,7,7)%+(trailers:only,unfold)"; - rlf = "format:%C(auto)%h%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset)%C(auto)%d%C(reset) %C(italic 239)[P: %p] [T: %t]%C(reset)%n%C(white)Author:%C(reset) %aN %C(241)<%aE>%C(reset)%n %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%n%C(white)Commit:%C(reset) %cN %C(241)<%cE>%C(reset) %C(italic 239)[GPG: %G?% GK]%C(reset)%n %C(italic blue)%cd%C(reset) %C(italic cyan)(%cr)%C(reset)%n%C(white)Reflog:%C(reset) %gN %C(241)<%gE>%C(reset)%n %C(italic)%gs%C(reset)%w(0,4,4)%n%n%C(bold)%s%C(reset)%n%n%-b%n%n%-N%n"; - }; - - init.defaultBranch = "main"; - - status.showstash = true; - - push = { - autoSetupRemote = true; - - # Push tags automatically. - followTags = true; - }; - - rebase.autosquash = true; - - merge = { - # Use nvim for merging, specifically the view showing LOCAL, MERGED, - # REMOTE. - tool = "nvimdiff2"; - - # Include summaries of merged commits in merge commit messages. - log = true; - - # delta. - conflictstyle = "diff3"; - }; - - mergetool = { - keepBackup = false; - hideResolved = true; - }; - - diff = { - # Detect when files are copied as well as renamed. - renames = "copies"; - - # delta - colorMoved = "default"; - }; - - # Fix whitespace errors when applying a patch, as specified in - # core.whitespace. - apply.whitespace = "fix"; - - branch = { - # Show most recently changed branches first. - sort = "-committerdate"; - - autoSetupMerge = "simple"; - }; - - credential.helper = "store"; - }; - - # █████╗ ██╗ ██╗ █████╗ ███████╗███████╗███████╗ - # ██╔══██╗██║ ██║██╔══██╗██╔════╝██╔════╝██╔════╝ - # ███████║██║ ██║███████║███████╗█████╗ ███████╗ - # ██╔══██║██║ ██║██╔══██║╚════██║██╔══╝ ╚════██║ - # ██║ ██║███████╗██║██║ ██║███████║███████╗███████║ - # ╚═╝ ╚═╝╚══════╝╚═╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ - - aliases = - let - fish_fns = config.programs.fish.functions; - in - { - ### Staging ### - - a = "add"; - aa = "add --all"; - - # Interactively stage parts of a file. - apa = "add --patch"; - - da = "diff"; - das = "diff --staged"; - daw = "diff --word-diff"; # Show diff by word. - dasw = "diff --staged --word-diff"; - - d = "!f() { git diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; - ds = "!f() { git diff --staged \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; - dw = "!f() { git diff --word-diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; - dsw = "!f() { git diff --staged --word-diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f"; - - st = "status --short --branch"; - stu = "status --short --branch --untracked-files"; - stl = "status"; - - ### Committing ### - - c = "commit"; - ce = "commit --amend"; - cen = "commit --amend --no-edit --no-verify"; - ca = "!git add --alll && git commit"; - cae = "!git add --all && git commit --amend"; - caen = "!git add --all && git commit --amend --no-edit --no-verify"; - cfu = "commit --fixup"; - - rev = "revert"; - - ### Working Dir & Index Manipulation ### - - co = "checkout"; - - rt = "reset"; - - rts = "reset --soft"; # undo commits & stage their changes - - rs = "restore --worktree"; # revert local changes - rst = "restore --staged"; # unstage things - rsa = "restore --worktree --staged"; - - rss = "restore --worktree --source"; # specify a commit to revert to - rsts = "restore --staged --source"; - rsas = "restore --worktree --staged --source"; - - rmc = "rm --cached"; # leave worktree copy alone - - sta = "stash push"; - stam = "stash push --message"; - staa = "stash push --include-untracted"; - staam = "stash push --include-untracted --message"; - - stap = "stash pop"; - stal = "stash list"; - stas = "stash show --text"; - - cl = "clean -force"; # remove untracked & unignored files - cldr = "clean --dry-run"; - - ### Branches ### - - b = "branch"; - cb = "checkout -b"; - cm = lib.mkIf (fish_fns ? git_main_branch) "!git checkout $(git_main_branch)"; - cd = lib.mkIf (fish_fns ? git_develop_branch) "!git checkout $(git_develop_branch)"; - - m = "merge"; - mtl = "mergetool --no-prompt"; - ma = "merge --abort"; - - cp = "cherry-pick"; - cpa = "cherry-pick --abort"; - cpc = "cherry-pick --continue"; - cpq = "cherry-pick --quit"; - - ### Remotes ### - - p = "push"; - pv = "push --verbose"; - pdr = "push --dry-run"; - pf = "push --force-with-lease --force-if-includes"; - pfv = "push --verbose --force-with-lease --force-if-includes"; - pff = "push --force"; - pffv = "push --verbose --force"; - - f = "fetch"; - fa = "fetch --all --prune"; - - pl = "pull"; - plr = "pull --rebase"; - - sub = "submodule"; - subu = "submodule update --init --recursive"; - - r = "remote"; - rv = "remote --verbose"; - ra = "remote add"; - rrm = "remote remove"; - rmv = "remote rename"; - rset = "remote set-url"; - rup = "remote update"; - - ### Logs ### - - # Current branch. - l = "log --pretty=lc --graph"; - lo = "log --pretty=lo --graph --date=human"; - ls = "log --pretty=lo --graph --date=human --simplify-by-decoration"; - lf = "log --pretty=lf --graph"; - ld = "log --pretty=lf --graph --cc --stat"; - lp = "log --pretty=lf --graph --cc --patch"; - - lr = "log -5 --pretty=lc --graph"; - lro = "log -5 --pretty=lo --graph --date=human"; - lrs = "log -5 --pretty=lo --graph --date=human --simplify-by-decoration"; - lrf = "log -5 --pretty=lf --graph"; - lrd = "log -5 --pretty=lf --graph --cc --stat"; - lrp = "log -5 --pretty=lf --graph --cc --patch"; - - # All branches on all remotes. - la = "log --pretty=lc --graph --all"; - lao = "log --pretty=lo --graph --all --date=human"; - las = "log --pretty=lo --graph --all --date=human --simplify-by-decoration"; - laf = "log --pretty=lf --graph --all"; - lad = "log --pretty=lf --graph --all --cc --stat"; - lap = "log --pretty=lf --graph --all --cc --patch"; - - lar = "log -5 --pretty=lc --graph --all"; - laro = "log -5 --pretty=lo --graph --all --date=human"; - lars = "log -5 --pretty=lo --graph --all --date=human --simplify-by-decoration"; - larf = "log -5 --pretty=lf --graph --all"; - lard = "log -5 --pretty=lf --graph --all --cc --stat"; - larp = "log -5 --pretty=lf --graph --all --cc --patch"; - - ### Shortcuts ### - - nevermind = "!git reset --hard head && git clean -df"; - - open = lib.mkIf (config.programs.fish.enable && (fish_fns ? git_open)) "!fish -c git_open"; - - chash = "!git log --oneline | gum filter --height 10 | cut -d' ' -f1 | cb &>/dev/null"; - }; - }; - - # ███╗ ███╗██╗███████╗ ██████╗ - # ████╗ ████║██║██╔════╝██╔════╝ - # ██╔████╔██║██║███████╗██║ - # ██║╚██╔╝██║██║╚════██║██║ - # ██║ ╚═╝ ██║██║███████║╚██████╗ - # ╚═╝ ╚═╝╚═╝╚══════╝ ╚═════╝ - - home.shellAbbrs = { - g = "git"; - }; - - programs.fish.functions = lib.mkIf config.programs.fish.enable { - git_develop_branch = # fish - '' - command git rev-parse --git-dir &>/dev/null || return - set -l branch - - for branch in dev devel develop development - if command git show-ref -q --verify refs/heads/$branch - echo $branch - return 0 - end - end - - echo develop - return 1 - ''; - - git_main_branch = # fish - '' - command git rev-parse --git-dir &>/dev/null || return - set -l ref - - for ref in - refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,master} - if command git show-ref -q --verify $ref - echo (basename $ref) - return 0 - end - end - - echo main - return 1 - ''; - - git_current_branch = # fish - '' - set -l ref (git symbolic-ref --quiet HEAD 2>/dev/null) - set -l ret $status - - if [ $ret -ne 0 ] - [ $ret -eq 128 ] && return # no git repo - set ref (git rev-parse --short HEAD 2>/dev/null) || return - end - - echo (string replace "refs/heads/" "" $ref) - ''; - - git_open = # fish - '' - set -f origin "$(git remote get-url origin)" - - switch "$origin" - case "*github*" - if command -v gh &>/dev/null - gh repo view --web &>/dev/null - else - set_color red - echo "[ERROR] Install gh-cli to open Github repos." >&2 - set_color normal - return 1 - end - case "https://*" - open '$origin' >/dev/null & - case "*" - set_color red - printf "[ERROR] Unrecognized origin %s" "$origin" >&2 - return 1 - end - ''; - }; -} - -# ███╗ ██╗ ██████╗ ████████╗███████╗███████╗ -# ████╗ ██║██╔═══██╗╚══██╔══╝██╔════╝██╔════╝ -# ██╔██╗ ██║██║ ██║ ██║ █████╗ ███████╗ -# ██║╚██╗██║██║ ██║ ██║ ██╔══╝ ╚════██║ -# ██║ ╚████║╚██████╔╝ ██║ ███████╗███████║ -# ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚══════╝╚══════╝ - -# PATH VALUES: -# :/ - all files within the root of the working tree, so all files in the -# repo, a la git add's --all option. - -# A note on reset, restore, and revert, paraphrased from `man git`, plus my -# own on `rm`: -# -# revert - make a new commit that reverts a previous commit. -# restore - undo uncommitted changes in the working tree. -# reset - update the branch and change commit history. -# rm - same as system rm; remove files, either from git's knowledge, the -# working directory, or both. -# -# These are not a description of the *possible* uses, rather a narrowing of -# the *intended* uses.