home/git: move maintenance repo detector config to separate module
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user