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.
This commit is contained in:
Oliver Davies 2025-04-29 09:41:20 +01:00
parent f668d95f74
commit 1c861aa1b5
5 changed files with 137 additions and 0 deletions

View file

@ -68,6 +68,21 @@
};
};
programs.dev-commit = {
enable = true;
repoPaths =
let
personal = "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/personal";
in
[
"${personal}/nix-config"
"${personal}/opentofu-dns"
];
schedule.enable = true;
};
xdg.configFile."pam-gnupg".text = ''
098EE055DAD2B9CB68154C6759DD38292D2273B6
1E21B58D69FFEFAD077F152A50FEA938A3413F50

View file

@ -1,6 +1,7 @@
{
imports = [
./bluetuith.nix
./dev-commit.nix
./direnv.nix
./fzf.nix
./git.nix

View file

@ -0,0 +1,94 @@
{
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.";
};
};
};
}

View file

@ -8,6 +8,7 @@ in
{
backup-websites = callPackage ./backup-websites.nix { };
build-glove80 = callPackage ./build-glove80.nix { };
dev-commit = callPackage ./dev-commit.nix { };
displayselect = callPackage ./displayselect { };
notes = callPackage ./notes { };
passmenu-otp = callPackage ./passmenu-otp.nix { };

26
pkgs/dev-commit.nix Normal file
View file

@ -0,0 +1,26 @@
{ pkgs, ... }:
pkgs.writeShellApplication {
name = "dev-commit";
runtimeInputs = with pkgs; [
coreutils
git
openssh
];
text = ''
IFS=':' read -ra repos <<< "$DEV_COMMIT_PATHS"
for repo in "''${repos[@]}"; do
echo "Processing $repo"
pushd "$repo"
git add .
git commit -m "Automated dev commit" || true
git push
popd
done
'';
}