{ pkgs, lib, config, ... }: { config = lib.mkIf config.programs.git.enable { home.packages = [ (pkgs.writeShellApplication { name = "git-sync"; text = (lib.strings.concatLines (map (r: '' echo "===== ${r.path}" if [ ! -d "${r.path}" ] then ${pkgs.git}/bin/git clone "${r.uri}" "${r.path}" else ( cd "${r.path}" ${pkgs.git}/bin/git --no-optional-locks diff --quiet || echo "Repository is dirty!" ${pkgs.git}/bin/git pull || true # Only push if there's something to push. Also prevents from trying to push on repos where we don't have rights. (${pkgs.git}/bin/git --no-optional-locks status --porcelain -b --ignore-submodules | grep ' \[ahead [0-9]\+\]' && ${pkgs.git}/bin/git push) || true ) fi '') (lib.attrsets.attrValues config.services.git-sync.repositories) ) ); }) ]; programs.git = { package = pkgs.gitFull; aliases = { "git" = "!exec git"; # In case I write one too many git }; ignores = [ "*.swp" "*.swo" "*.ycm_extra_conf.py" "tags" ".mypy_cache" ]; delta = { enable = true; options = { line-numbers = true; syntax-theme = "base16"; }; }; # Also tried difftastic, and while I like the default theme it's a bit # less configurable lfs.enable = true; userEmail = lib.mkDefault "geoffrey@frogeye.fr"; userName = lib.mkDefault "Geoffrey Frogeye"; extraConfig = { core = { editor = "nvim"; }; push = { default = "matching"; }; pull = { ff = "only"; }; } // lib.optionalAttrs config.frogeye.desktop.xorg { diff.tool = "meld"; difftool.prompt = false; "difftool \"meld\"".cmd = "${pkgs.meld}/bin/meld \"$LOCAL\" \"$REMOTE\""; # This escapes quotes, which isn't the case in the original, hoping this isn't an issue. }; }; services = { git-sync = { enable = false; # The real thing syncs too quickly and asks for passphrase, which is annoying # So for now it's just a way to park config which will be reused by git-sync-* commands repositories = { dotfiles = { path = "${config.xdg.configHome}/dotfiles"; uri = lib.mkDefault "https://git.frogeye.fr/geoffrey/dotfiles.git"; }; }; }; }; }; }