1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

home-manager-auto-expire: init

This commit introduces a new service that expires old Home-Manager
generations.
This commit is contained in:
Thiago Kenji Okada 2023-09-12 17:25:31 +01:00 committed by Austin Horstman
parent 938e802b70
commit 28242a60d3
5 changed files with 121 additions and 0 deletions

View file

@ -340,6 +340,7 @@ let
./services/gpg-agent.nix
./services/grobi.nix
./services/gromit-mpx.nix
./services/home-manager-auto-expire.nix
./services/home-manager-auto-upgrade.nix
./services/hound.nix
./services/hypridle.nix

View file

@ -0,0 +1,100 @@
{ config, lib, pkgs, ... }:
let
cfg = config.services.home-manager.autoExpire;
homeManagerPackage = pkgs.callPackage ../../home-manager {
path = config.programs.home-manager.path;
};
in {
meta.maintainers = [ lib.maintainers.thiagokokada ];
options = {
services.home-manager.autoExpire = {
enable = lib.mkEnableOption ''
the Home Manager expire service that periodically expire your
old Home Manager generations'';
timestamp = lib.mkOption {
type = lib.types.str;
default = "-30 days";
example = "-7 days";
description = ''
Remove generations older than `TIMESTAMP` where `TIMESTAMP` is
interpreted as in the -d argument of the date tool.
'';
};
frequency = lib.mkOption {
type = lib.types.str;
default = "monthly";
example = "weekly";
description = ''
The interval at which the Home Manager auto expire is run.
This value is passed to the systemd timer configuration
as the `OnCalendar` option.
The format is described in {manpage}`systemd.time(7)`.
'';
};
store = {
cleanup = lib.mkEnableOption ''
to cleanup Nix store when the Home Manager expire service runs.
It will use `nix-collect-garbage` to cleanup the store,
removing all unreachable store objects from the current user
(i.e.: not only the expired Home Manager generations).
This may not be what you want, this is why this option is disabled
by default'';
options = lib.mkOption {
type = lib.types.str;
description = ''
Options given to `nix-collection-garbage` when the service runs.
'';
default = "";
example = "--delete-older-than 30d";
};
};
};
};
config = lib.mkIf cfg.enable {
assertions = [
(lib.hm.assertions.assertPlatform "services.home-manager.autoExpire" pkgs
lib.platforms.linux)
];
systemd.user = {
timers.home-manager-auto-expire = {
Unit.Description = "Home Manager expire generations timer";
Install.WantedBy = [ "timers.target" ];
Timer = {
OnCalendar = cfg.frequency;
Unit = "home-manager-auto-expire.service";
Persistent = true;
};
};
services.home-manager-auto-expire = {
Unit.Description = "Home Manager expire generations";
Service.ExecStart = toString
(pkgs.writeShellScript "home-manager-auto-expire" (''
echo "Expire old Home Manager generations"
${homeManagerPackage}/bin/home-manager expire-generations '${cfg.timestamp}'
'' + lib.optionalString cfg.store.cleanup ''
echo "Clean-up Nix store"
${pkgs.nix}/bin/nix-collect-garbage ${cfg.store.options}
''));
};
};
};
}

View file

@ -514,6 +514,7 @@ in import nmtSrc {
./modules/services/git-sync
./modules/services/glance
./modules/services/gromit-mpx
./modules/services/home-manager-auto-expire
./modules/services/home-manager-auto-upgrade
./modules/services/hypridle
./modules/services/hyprpaper

View file

@ -0,0 +1,18 @@
{
config = {
services.home-manager.autoExpire = {
enable = true;
timestamp = "-7 days";
frequency = "00:00";
cleanup.store = true;
};
nmt.script = ''
serviceFile=home-files/.config/systemd/user/home-manager-auto-expire.service
assertFileExists $serviceFile
timerFile=home-files/.config/systemd/user/home-manager-auto-expire.timer
assertFileExists $timerFile
'';
};
}

View file

@ -0,0 +1 @@
{ home-manager-auto-expire-basic-configuration = ./basic-configuration.nix; }