]> git.scottworley.com Git - nix-profile-gc/commitdiff
Manage profiles in users' $HOME/.local/state/nix/profiles/ master
authorScott Worley <scottworley@scottworley.com>
Fri, 10 Apr 2026 07:40:46 +0000 (00:40 -0700)
committerScott Worley <scottworley@scottworley.com>
Fri, 10 Apr 2026 07:40:46 +0000 (00:40 -0700)
Newer versions of nix keep profiles here instead of in /nix/var/nix/profiles/per-user

This is initially off by default.  Later it will be on by default.

modules/profile-gc.nix

index 6963264ae29d6133623241e49e7a75315fb49ce6..e2f0e3ddfdde276072829f0abdc69f84f637ee21 100644 (file)
@@ -22,10 +22,23 @@ let
     parsed=$(systemd-analyze timespan ${escapeShellArg duration} | awk '$1 == "μs:" { print $2 }')
     echo "$parsed" > "$out"
   '';
     parsed=$(systemd-analyze timespan ${escapeShellArg duration} | awk '$1 == "μs:" { print $2 }')
     echo "$parsed" > "$out"
   '';
+  gather_home_profiles = lib.optionalString cfg.manageHomeProfiles ''
+    while read -r home_dir;do
+      home_profile_dir="$home_dir/.local/state/nix/profiles"
+      if [[ -d "$home_profile_dir" ]];then
+        home_profile_dirs+=( "$home_profile_dir" )
+      fi
+    done < <(${pkgs.coreutils}/bin/cut -d: -f6 /etc/passwd | ${pkgs.coreutils}/bin/sort -u)
+  '';
 in {
   options = {
     nix.profile-gc = {
       enable = lib.mkEnableOption "Automatic profile garbage collection";
 in {
   options = {
     nix.profile-gc = {
       enable = lib.mkEnableOption "Automatic profile garbage collection";
+      manageHomeProfiles = lib.mkOption {
+        description = "Manage profiles in users' $HOME/.local/state/nix/profiles/";
+        type = lib.types.bool;
+        default = false;  # Will flip to true later
+      };
       dryRun = lib.mkOption {
         description = "Say what would have been deleted rather than actually deleting profiles";
         type = lib.types.bool;
       dryRun = lib.mkOption {
         description = "Say what would have been deleted rather than actually deleting profiles";
         type = lib.types.bool;
@@ -160,6 +173,9 @@ in {
         verbose_topn ${cfg.logdir}/active-boot   "" ${escapeShellArg cfg.keepLastActiveBoot  }
       )
 
         verbose_topn ${cfg.logdir}/active-boot   "" ${escapeShellArg cfg.keepLastActiveBoot  }
       )
 
+      home_profile_dirs=()
+      ${gather_home_profiles}
+
       now=$(${pkgs.coreutils}/bin/date +%s)
       age_threshold="$(< ${parse-duration cfg.keepLatest})"
       while read -r profile;do
       now=$(${pkgs.coreutils}/bin/date +%s)
       age_threshold="$(< ${parse-duration cfg.keepLatest})"
       while read -r profile;do
@@ -209,7 +225,7 @@ in {
             rm "$p"
           ''}
         done
             rm "$p"
           ''}
         done
-      done < <(${pkgs.findutils}/bin/find "''${NIX_STATE_DIR:-/nix/var/nix}/profiles/" -type l -not -name '*[0-9]-link')
+      done < <(${pkgs.findutils}/bin/find "''${NIX_STATE_DIR:-/nix/var/nix}/profiles/" "''${home_profile_dirs[@]}" -type l -not -name '*[0-9]-link')
     '';
     systemd.timers.profile-gc-log-active = {
       wantedBy = [ "timers.target" ];
     '';
     systemd.timers.profile-gc-log-active = {
       wantedBy = [ "timers.target" ];
@@ -221,10 +237,13 @@ in {
         "Log the active profiles for gc collection policy evaluation";
       serviceConfig.Type = "oneshot";
       script = ''
         "Log the active profiles for gc collection policy evaluation";
       serviceConfig.Type = "oneshot";
       script = ''
+        home_profile_dirs=()
+        ${gather_home_profiles}
+
         ${pkgs.coreutils}/bin/mkdir -p ${cfg.logdir}
         ${pkgs.coreutils}/bin/readlink /run/current-system >> ${cfg.logdir}/active-system
         ${pkgs.coreutils}/bin/readlink /run/booted-system  >> ${cfg.logdir}/active-boot
         ${pkgs.coreutils}/bin/mkdir -p ${cfg.logdir}
         ${pkgs.coreutils}/bin/readlink /run/current-system >> ${cfg.logdir}/active-system
         ${pkgs.coreutils}/bin/readlink /run/booted-system  >> ${cfg.logdir}/active-boot
-        ${pkgs.findutils}/bin/find ''${NIX_STATE_DIR:-/nix/var/nix}/profiles/ \
+        ${pkgs.findutils}/bin/find ''${NIX_STATE_DIR:-/nix/var/nix}/profiles/ "''${home_profile_dirs[@]}" \
           -type l -not -name '*[0-9]-link' \
           -exec ${pkgs.stdenv.shell} -c '
             for f;do
           -type l -not -name '*[0-9]-link' \
           -exec ${pkgs.stdenv.shell} -c '
             for f;do