diff --git a/flake.nix b/flake.nix index 68b7120..cc3d9c5 100644 --- a/flake.nix +++ b/flake.nix @@ -159,6 +159,7 @@ colors = ./home/modules/colors.nix; direnv-auto-prune = ./home/modules/programs/direnv/auto-prune.nix; downloads-sorter = ./home/modules/services/downloads-sorter.nix; + git-maintenance-repo-detector = ./home/modules/programs/git/maintenance-repo-detector.nix; gpg = ./home/modules/programs/gpg; mpd-auto-updater = ./home/modules/services/mpd.nix; neovim-auto-clean-swapfiles = ./home/modules/programs/neovim/auto-clean-swapfiles.nix; diff --git a/home/modules/programs/git/maintenance-repo-detector.nix b/home/modules/programs/git/maintenance-repo-detector.nix new file mode 100644 index 0000000..92f0a94 --- /dev/null +++ b/home/modules/programs/git/maintenance-repo-detector.nix @@ -0,0 +1,64 @@ +{ config, pkgs, lib, ... }: +let + cfg = config.programs.git.maintenance.repository-detector; +in +{ + options.programs.git.maintenance.repository-detector = { + enable = lib.mkEnableOption "automatic detection of git repositories to run maintenace tasks on"; + + directories = lib.mkOption { + type = lib.types.listOf lib.types.path; + default = [ ]; + example = lib.literalExpression '' + [ + "''${config.home.homeDirectory}/Projects" + ] + ''; + description = "Directories to search for git repositories to run maintenance tasks on."; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = config.programs.git.maintenance.enable; + message = "programs.git.maintenance.repository-detector.enable requires programs.git.maintenance.enable to work"; + } + # TODO: merge the predefined repositories with the ones discovered by the repository detector. + { + assertion = config.programs.git.maintenance.repositories == [ ]; + message = "programs.git.maintenance.repository-detector.enable will override any manually configured repositories"; + } + ]; + + systemd.user.services."git-maintenance@".Service = { + RuntimeDirectory = "git-maintenance@%i"; + + ExecStartPre = let + script = pkgs.writeShellApplication { + name = "discover-git-maintenance-repos"; + runtimeInputs = [ config.programs.git.package pkgs.coreutils ]; + text = '' + echo "[maintenance]" > "$1" + + shopt -s nullglob + for repoLocation in ${lib.escapeShellArgs cfg.directories}; do + for repo in "$repoLocation"/*/.git; do + if [ -f "$repo/config" ] && [ "$(git config get -f "$repo/config" maintenance.skip)" == true ]; then + echo "Skipping $repo because maintenance.skip is set to true" >&2 + else + echo "Found git repository at $repo" >&2 + echo "repo = $(realpath "''${repo%"/.git"}")" >> "$1" + fi + done + done + ''; + }; + in "${lib.getExe script} '%t/git-maintenance@%i/repos.conf'"; + + ExecStart = lib.mkForce '' + "${lib.getExe config.programs.git.package}" -c include.path="%t/git-maintenance@%i/repos.conf" for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=%i + ''; + }; + }; +} diff --git a/home/programs/git/default.nix b/home/programs/git/default.nix index 7bd8e7d..4c78b50 100644 --- a/home/programs/git/default.nix +++ b/home/programs/git/default.nix @@ -24,7 +24,17 @@ lib.mkIf cfg.enable { signByDefault = true; }; - maintenance.enable = true; + maintenance = { + enable = true; + repository-detector = { + enable = true; + directories = [ + "${config.home.homeDirectory}/git" + "${config.home.homeDirectory}/work" + "${config.home.homeDirectory}/pvv" + ]; + }; + }; lfs.enable = true; @@ -288,37 +298,6 @@ lib.mkIf cfg.enable { }) ]; - systemd.user.services."git-maintenance@".Service = lib.mkIf cfg.maintenance.enable { - ExecStartPre = let - repoDirs = lib.escapeShellArgs [ - "${config.home.homeDirectory}/git" - "${config.home.homeDirectory}/work" - "${config.home.homeDirectory}/pvv" - ]; - - script = pkgs.writeShellApplication { - name = "discover-git-maintenance-repos"; - text = '' - { - echo "[maintenance]" - for repoLocation in ${repoDirs}; do - for repo in "$repoLocation"/*/.git; do - if [ "$(git config get -f "$repo/config" maintenance.skip)" != true ]; then - echo "repo = $('${pkgs.coreutils}/bin/realpath' "''${repo%"/.git"}")" - fi - done - done - } > "$1" - ''; - }; - in "${lib.getExe script} %t/maintenance-repos"; - - ExecStart = lib.mkForce '' - "${lib.getExe cfg.package}" -c include.path="%t/maintenance-repos" for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=%i - ''; - }; - - home.packages = [ (pkgs.writeShellApplication { name = "git-tcommit";