From 30151dd65db1857c3d622ff3b2ed5e6d4dc30237 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 10 Aug 2026 01:03:14 +0200 Subject: [PATCH 1/2] gh: have home manager manage gh's config file Have ~/.config/gh/config.yml being managed by home manger. This change also comes along with moving `home/git/default.nix` to `home/git/git.nix`, allowing to introduce `home/git/gh.nix` and potentially future git-related programs (e.g. glab). Additionally, `programs.git.settings` had to be refactored to an attribute set (instead of an ordered list of individual attribute sets being merged). This is due to the fact, that gh interacts with git's config and does assume the config is always of type attribute set. --- home/git/default.nix | 180 +--------------------------------- home/git/gh.nix | 38 +++++++ home/git/git.nix | 161 ++++++++++++++++++++++++++++++ hosts/common/users/rtucek.nix | 14 ++- 4 files changed, 209 insertions(+), 184 deletions(-) create mode 100644 home/git/gh.nix create mode 100644 home/git/git.nix diff --git a/home/git/default.nix b/home/git/default.nix index 06c731b..44e7942 100644 --- a/home/git/default.nix +++ b/home/git/default.nix @@ -1,178 +1,6 @@ -{ pkgs, lib, ... }: { - programs.git = - let - bash = "${lib.getExe pkgs.bash}"; - delta = "${lib.getExe pkgs.delta}"; - diff = "${lib.getBin pkgs.diffutils}/bin/diff"; - git = "${lib.getExe pkgs.git}"; - grep = "${lib.getExe pkgs.gnugrep}"; - head = "${lib.getBin pkgs.coreutils-full}/bin/head"; - nvim = "${lib.getExe pkgs.neovim}"; - sed = "${lib.getExe pkgs.gnused}"; - in - { - enable = true; - package = pkgs.gitFull; - - ignores = [ - "/.idea/" - "*.sublime-project" - "*.sublime-workspace" - "*.swp" - "*~" - ".DS_Store" - ".tags" - ".tags.lock" - ".tags.temp" - "/.tmuxinator.yml" - "Session.vim" - ]; - - maintenance.enable = true; - - # # To be set by the importer - # signing = { - # format = "openpgp"; - # key = "0x49593BD010DE4723"; - # signByDefault = true; - # }; - - settings = [ - { - core = { - autocrlf = "input"; - editor = "nvim"; - pager = delta; - }; - } - # # To be set by the importer - # { - # user = { - # name = "Rudolf Tucek"; - # email = "tucek.rudolf@gmail.com"; - # }; - # } - { - alias = { - fork-point = "!${bash} -c '${diff} -u <(${git} rev-list --first-parent \"\${1:-master}\") <(${git} rev-list --first-parent \"\${2:-HEAD}\") | ${sed} -ne \"s/^ //p\" | ${head} -1' -"; - lg = "lg1"; - lg1 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --branches --remotes --tags"; - lg2 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --all"; - patch = "!${git} --no-pager diff --no-color"; - permission-reset = "!${git} diff -p -R | ${grep} -E \"^(diff|(old|new) mode)\" | ${git} apply"; - }; - } - { - commit = { - verbose = true; - cleanup = "scissors"; - }; - } - { - tag = { - forceSignAnnotated = true; - }; - } - { - format = { - coverFromDescription = "auto"; - coverLetter = "auto"; - signOff = "true"; - }; - } - { - fetch = { - prune = true; - }; - } - { - prune = { - rebase = "merges"; - }; - } - { - pull = { - rebase = "merges"; - }; - } - { - push = { - default = "simple"; - }; - } - { - rebase = { - autoStash = true; - }; - } - { - merge = { - autoStash = true; - conflictstyle = "diff3"; - ff = false; - log = true; - tool = "nvimdiff"; - }; - } - { - mergetool = { - prompt = true; - }; - } - { - "mergetool \"nvimdiff\"" = { - cmd = "${nvim} -d $BASE $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J'"; - }; - } - { - color = { - ui = true; - }; - } - { - diff = { - colorMoved = "default"; - renames = "copies"; - tool = "nvimdiff"; - }; - } - { - difftool = { - prompt = true; - }; - } - { - "difftool \"nvimdiff\"" = { - cmd = "${nvim} -d $LOCAL $REMOTE -c '$wincmd w' -c 'wincmd L'"; - }; - } - { - delta = { - color-only = true; - hunk-header-style = "syntax"; - line-numbers = true; - minus-style = "syntax \"#3f0001\""; - # side-by-side = true; - syntax-theme = "Monokai Extended"; - whitespace-error-style = "normal"; - }; - } - { - interactive = { - diffFilter = "${delta} --color-only --hunk-header-style raw"; - }; - } - { - "color \"diff\"" = { - commit = "yellow bold"; - frag = "magenta bold"; - meta = "11"; - new = "green bold"; - old = "red bold"; - # whitespace = "red reverse"; - }; - } - ]; - }; + imports = [ + ./git.nix + ./gh.nix + ]; } diff --git a/home/git/gh.nix b/home/git/gh.nix new file mode 100644 index 0000000..ab1a140 --- /dev/null +++ b/home/git/gh.nix @@ -0,0 +1,38 @@ +{ + pkgs, + lib, + config, + ... +}: +{ + home.packages = [ + pkgs.gh + ]; + + programs.gh = { + enable = true; + + settings = + let + brave = "${lib.getExe pkgs.brave}"; + less = "${lib.getExe pkgs.less}"; + nvim = "${config.programs.nixvim.build.package}/bin/nvim"; + in + { + version = 1; + git_protocol = "ssh"; + editor = nvim; + prompt = "enabled"; + prefer_editor_prompt = "enabled"; + pager = less; + # http_unix_socket = ""; + browser = brave; + color_labels = "enabled"; + accessible_colors = "disabled"; + accessible_prompter = "disabled"; + spinner = "enabled"; + }; + + gitCredentialHelper.enable = false; + }; +} diff --git a/home/git/git.nix b/home/git/git.nix new file mode 100644 index 0000000..aed8546 --- /dev/null +++ b/home/git/git.nix @@ -0,0 +1,161 @@ +{ + pkgs, + lib, + config, + ... +}: +{ + programs.git = + let + bash = "${lib.getExe pkgs.bash}"; + delta = "${lib.getExe pkgs.delta}"; + diff = "${lib.getBin pkgs.diffutils}/bin/diff"; + git = "${lib.getExe pkgs.git}"; + grep = "${lib.getExe pkgs.gnugrep}"; + head = "${lib.getBin pkgs.coreutils-full}/bin/head"; + nvim = "${config.programs.nixvim.build.package}/bin/nvim"; + sed = "${lib.getExe pkgs.gnused}"; + in + { + enable = true; + package = pkgs.gitFull; + + ignores = [ + "/.idea/" + "*.sublime-project" + "*.sublime-workspace" + "*.swp" + "*~" + ".DS_Store" + ".tags" + ".tags.lock" + ".tags.temp" + "/.tmuxinator.yml" + "Session.vim" + ]; + + maintenance.enable = true; + + # # To be set by the importer + # signing = { + # format = "openpgp"; + # key = "0x49593BD010DE4723"; + # signByDefault = true; + # }; + + settings = { + # To be set by the importer + # user = { + # name = "Rudolf Tucek"; + # email = "tucek.rudolf@gmail.com"; + # }; + + core = { + autocrlf = "input"; + editor = nvim; + pager = delta; + }; + + alias = { + fork-point = "!${bash} -c '${diff} -u <(${git} rev-list --first-parent \"\${1:-master}\") <(${git} rev-list --first-parent \"\${2:-HEAD}\") | ${sed} -ne \"s/^ //p\" | ${head} -1' -"; + lg = "lg1"; + lg1 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --branches --remotes --tags"; + lg2 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --all"; + patch = "!${git} --no-pager diff --no-color"; + permission-reset = "!${git} diff -p -R | ${grep} -E \"^(diff|(old|new) mode)\" | ${git} apply"; + }; + + commit = { + verbose = true; + cleanup = "scissors"; + }; + + tag = { + forceSignAnnotated = true; + }; + + format = { + coverFromDescription = "auto"; + coverLetter = "auto"; + signOff = "true"; + }; + + fetch = { + prune = true; + }; + + prune = { + rebase = "merges"; + }; + + pull = { + rebase = "merges"; + }; + + push = { + default = "simple"; + }; + + rebase = { + autoStash = true; + }; + + merge = { + autoStash = true; + conflictstyle = "diff3"; + ff = false; + log = true; + tool = "nvimdiff"; + }; + + mergetool = { + prompt = true; + }; + + "mergetool \"nvimdiff\"" = { + cmd = "${nvim} -d $BASE $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J'"; + }; + + color = { + ui = true; + }; + + diff = { + colorMoved = "default"; + renames = "copies"; + tool = "nvimdiff"; + }; + + difftool = { + prompt = true; + }; + + "difftool \"nvimdiff\"" = { + cmd = "${nvim} -d $LOCAL $REMOTE -c '$wincmd w' -c 'wincmd L'"; + }; + + delta = { + color-only = true; + hunk-header-style = "syntax"; + line-numbers = true; + minus-style = "syntax \"#3f0001\""; + # side-by-side = true; + syntax-theme = "Monokai Extended"; + whitespace-error-style = "normal"; + }; + + interactive = { + diffFilter = "${delta} --color-only --hunk-header-style raw"; + }; + + "color \"diff\"" = { + commit = "yellow bold"; + frag = "magenta bold"; + meta = "11"; + new = "green bold"; + old = "red bold"; + # whitespace = "red reverse"; + }; + }; + }; +} diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix index 1268ead..9d87cc8 100644 --- a/hosts/common/users/rtucek.nix +++ b/hosts/common/users/rtucek.nix @@ -83,14 +83,12 @@ in programs = { git = { - settings = [ - { - user = { - name = "Rudolf Tucek"; - email = "tucek.rudolf@gmail.com"; - }; - } - ]; + settings = { + user = { + name = "Rudolf Tucek"; + email = "tucek.rudolf@gmail.com"; + }; + }; signing = { format = "openpgp"; From 4a2d4a0fac23f8f62c14a68a19d0154dd46dc713 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 10 Aug 2026 01:06:00 +0200 Subject: [PATCH 2/2] Remove duplicate gh installation --- home/tools/dev.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/home/tools/dev.nix b/home/tools/dev.nix index fa3b754..073cbee 100644 --- a/home/tools/dev.nix +++ b/home/tools/dev.nix @@ -2,7 +2,6 @@ { home.packages = [ # Git tools - pkgs.gh pkgs.glab # Common tools