290 lines
12 KiB
Nix
290 lines
12 KiB
Nix
{
|
|
lib,
|
|
config,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib) mkEnableOption mkIf;
|
|
|
|
cfg = config.marleyos.programs.git;
|
|
in
|
|
{
|
|
options.marleyos.programs.git.enable = mkEnableOption "git";
|
|
|
|
imports = [
|
|
./aliases.nix
|
|
];
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
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 = "${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.
|