nix-config/modules/home-manager/cli/dev-commit.nix
Oliver Davies 1c861aa1b5 Add dev-commit
Add `dev-commit`, a script based on f00f31c649/env/.local/scripts/dev-commit
that is meant to be a fallback to commit and push any missed changes
that should be kept.

This is not intended to be a substitute for making manual commits and
writing detailed commit messages.

The script uses an environment variable for the list of project
directories, which is set within a Home Manager module that also creates
a systemd service and timer to run the command automatically - similar
to a cron job.

Adding this should prevent occasional issues, such as missing the
firewall configuration for my homelab which was removed accidentally and
stopped my reverse proxies for services such as Jellyfin and Immich from
running.
2025-04-29 13:37:20 +01:00

94 lines
2 KiB
Nix

{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.programs.dev-commit;
repoPaths = concatStringsSep ":" cfg.repoPaths;
in
{
options.programs.dev-commit = {
enable = mkEnableOption "Enable dev-commit";
repoPaths = mkOption {
default = [ ];
description = "A list of repository paths that should have automated commits";
type = types.listOf types.path;
};
schedule = mkOption {
type = types.submodule {
options = {
enable = mkEnableOption "Enable automated dev commits with systemd";
time = mkOption {
description = ''
Time expression for when to run the dev-commit job.
This uses systemd's `OnCalendar` syntax.
Examples:
- "hourly" (once every hour)
- "daily" (once per day at midnight)
- "Mon *-*-01 12:00:00" (every Monday at 12:00 PM)
See `man systemd.time` for full syntax reference.
'';
default = "hourly";
type = types.str;
};
};
};
default = {
enable = false;
time = "hourly";
};
};
};
config = mkIf cfg.enable {
home = {
packages = [
pkgs.dev-commit
];
sessionVariables.DEV_COMMIT_PATHS = repoPaths;
};
systemd.user = mkIf cfg.schedule.enable {
services.dev-commit = {
Install.WantedBy = [ "default.target" ];
Service = {
Environment = [
"DEV_COMMIT_PATHS=${repoPaths}"
];
ExecStart = "${lib.getExe pkgs.dev-commit}";
Type = "oneshot";
};
Unit.Description = "dev-commit";
};
timers.dev-commit = {
Install.WantedBy = [ "timers.target" ];
Timer = {
OnCalendar = cfg.schedule.time;
Persistent = true;
Unit = "dev-commit.service";
};
Unit.Description = "Runs automated development commits in select project repositories.";
};
};
};
}