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

Revert "tmpfiles: migrate to an RFC42-style option"

This reverts commit 090aa14e5d.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
Austin Horstman 2025-11-05 12:19:54 -06:00
parent 06aeeed62f
commit af119feb17
9 changed files with 31 additions and 247 deletions

View file

@ -9,125 +9,6 @@ let
cfg = config.systemd.user.tmpfiles; cfg = config.systemd.user.tmpfiles;
ruleSubmodule = lib.types.submodule (
{ name, ... }:
{
options.type = lib.mkOption {
type = lib.types.str;
readOnly = true;
default = name;
defaultText = "tmpfiles-type";
example = "d";
description = ''
The type of operation to perform on the file.
The type consists of a single letter and optionally one or more
modifier characters.
Please see the upstream documentation for the available types and
more details: {manpage}`tmpfiles.d(5)`
'';
};
options.mode = lib.mkOption {
type = lib.types.str;
default = "-";
example = "0755";
description = ''
The file access mode to use when creating this file or directory.
'';
};
options.user = lib.mkOption {
type = lib.types.str;
default = "-";
example = "root";
description = ''
The user of the file.
This may either be a numeric ID or a user/group name.
If omitted or when set to `"-"`, the user and group of the user who
invokes systemd-tmpfiles is used.
'';
};
options.group = lib.mkOption {
type = lib.types.str;
default = "-";
example = "root";
description = ''
The group of the file.
This may either be a numeric ID or a user/group name.
If omitted or when set to `"-"`, the user and group of the user who
invokes systemd-tmpfiles is used.
'';
};
options.age = lib.mkOption {
type = lib.types.str;
default = "-";
example = "10d";
description = ''
Delete a file when it reaches a certain age.
If a file or directory is older than the current time minus the age
field, it is deleted.
If set to `"-"`, no automatic clean-up is done.
'';
};
options.argument = lib.mkOption {
type = lib.types.str;
default = "";
example = "";
description = ''
An argument whose meaning depends on the type of operation.
Please see the upstream documentation for the meaning of this
parameter in different situations: {manpage}`tmpfiles.d(5)`
'';
};
}
);
modulePrefix = [
"systemd"
"user"
"tmpfiles"
"settings"
];
mkFileName = configName: "user-tmpfiles.d/home-manager-${configName}.conf";
mkConfigFile =
name: rules:
let
escapeArgument = lib.strings.escapeC [
"\t"
"\n"
"\r"
" "
"\\"
];
mkRule = path: rule: ''
'${rule.type}' '${path}' '${rule.mode}' '${rule.user}' '${rule.group}' '${rule.age}' ${escapeArgument rule.argument}
'';
in
{
text = ''
# This file was generated by Home Manager and should not be modified.
# Please change the option '${lib.showAttrPath (modulePrefix ++ [ name ])}' instead.
${lib.pipe rules [
(lib.mapAttrs (_path: lib.attrValues))
(lib.mapAttrsToList (path: map (mkRule path)))
lib.flatten
lib.concatStrings
]}
'';
onChange = ''
run ${pkgs.systemd}/bin/systemd-tmpfiles --user --remove --create ''${DRY_RUN:+--dry-run} '${mkFileName name}'
'';
};
in in
{ {
meta.maintainers = with lib.maintainers; [ meta.maintainers = with lib.maintainers; [
@ -135,70 +16,34 @@ in
dawidsowa dawidsowa
]; ];
imports = [ options.systemd.user.tmpfiles.rules = lib.mkOption {
(lib.mkRemovedOptionModule [ "systemd" "user" "tmpfiles" "rules" ] '' type = lib.types.listOf lib.types.str;
It has been replaced by 'systemd.user.tmpfiles.settings'. default = [ ];
'') example = [ "L /home/user/Documents - - - - /mnt/data/Documents" ];
];
options.systemd.user.tmpfiles.settings = lib.mkOption {
description = '' description = ''
Declare systemd-tmpfiles rules to create, delete, and clean up volatile Rules for creating and cleaning up temporary files
and temporary files and directories. automatically. See
{manpage}`tmpfiles.d(5)`
Even though the service is called `*tmp*files` you can also create for the exact format.
persistent files.
''; '';
example = {
cache."%C".d = {
mode = "0755";
user = "alice";
group = "alice";
age = "4 weeks";
};
};
default = { };
type =
let
attrsWith' = placeholder: elemType: lib.types.attrsWith { inherit elemType placeholder; };
nonEmptyAttrsWith' =
placeholder: elemType:
let
attrs = lib.types.addCheck (attrsWith' placeholder elemType) (s: s != { });
in
attrs
// {
name = "nonEmptyAttrsOf";
description = "non-empty ${attrs.description}";
emptyValue = { }; # no .value attribute, meaning there is not empty value
substSubModules = m: nonEmptyAttrsWith' placeholder (elemType.substSubModules m);
};
in
attrsWith' "config-name" (
nonEmptyAttrsWith' "path" (nonEmptyAttrsWith' "tmpfiles-type" ruleSubmodule)
);
}; };
config = lib.mkIf (cfg.settings != { }) { config = lib.mkIf (cfg.rules != [ ]) {
assertions = [ assertions = [
(lib.hm.assertions.assertPlatform "systemd.user.tmpfiles" pkgs lib.platforms.linux) (lib.hm.assertions.assertPlatform "systemd.user.tmpfiles" pkgs lib.platforms.linux)
]; ];
warnings = lib.flatten (
lib.mapAttrsToListRecursive (
path: value:
lib.optional
(lib.last path == "argument" && lib.match ''.*\\([nrt]|x[0-9A-Fa-f]{2}).*'' value != null)
''
The '${lib.showAttrPath (modulePrefix ++ path)}' option
appears to contain escape sequences, which will be escaped again.
Unescape them if this is not intended. The assigned string is:
"${value}"
''
) cfg.settings
);
xdg.configFile = { xdg.configFile = {
"user-tmpfiles.d/home-manager.conf" = {
text = ''
# This file is created automatically and should not be modified.
# Please change the option systemd.user.tmpfiles.rules instead.
${lib.concatStringsSep "\n" cfg.rules}
'';
onChange = ''
run ${pkgs.systemd}/bin/systemd-tmpfiles --user --remove --create ''${DRY_RUN:+--dry-run}
'';
};
"systemd/user/basic.target.wants/systemd-tmpfiles-setup.service".source = "systemd/user/basic.target.wants/systemd-tmpfiles-setup.service".source =
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-setup.service"; "${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-setup.service";
"systemd/user/systemd-tmpfiles-setup.service".source = "systemd/user/systemd-tmpfiles-setup.service".source =
@ -207,9 +52,6 @@ in
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-clean.timer"; "${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-clean.timer";
"systemd/user/systemd-tmpfiles-clean.service".source = "systemd/user/systemd-tmpfiles-clean.service".source =
"${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-clean.service"; "${pkgs.systemd}/example/systemd/user/systemd-tmpfiles-clean.service";
} };
// lib.mapAttrs' (
name: rules: lib.nameValuePair (mkFileName name) (mkConfigFile name rules)
) cfg.settings;
}; };
} }

View file

@ -36,12 +36,14 @@ in
# Use `systemd-tmpfiles` since glab requires its configuration file to have # Use `systemd-tmpfiles` since glab requires its configuration file to have
# mode 0600. # mode 0600.
systemd.user.tmpfiles.settings.glab = lib.mkIf (cfg.settings != { }) { systemd.user.tmpfiles.rules =
"${config.xdg.configHome}/glab-cli/config.yml" = { let
"C+".argument = yaml.generate "glab-config" cfg.settings; target = "${config.xdg.configHome}/glab-cli/config.yml";
z.mode = "0600"; in
}; lib.mkIf (cfg.settings != { }) [
}; "C+ ${target} - - - - ${yaml.generate "glab-config" cfg.settings}"
"z ${target} 0600"
];
xdg.configFile."glab-cli/aliases.yml" = lib.mkIf (cfg.aliases != { }) { xdg.configFile."glab-cli/aliases.yml" = lib.mkIf (cfg.aliases != { }) {
source = yaml.generate "glab-aliases" cfg.aliases; source = yaml.generate "glab-aliases" cfg.aliases;

View file

@ -203,7 +203,6 @@ import nmtSrc {
./modules/misc/numlock ./modules/misc/numlock
./modules/misc/pam ./modules/misc/pam
./modules/misc/qt ./modules/misc/qt
./modules/misc/tmpfiles
./modules/misc/xdg/linux.nix ./modules/misc/xdg/linux.nix
./modules/misc/xsession ./modules/misc/xsession
./modules/systemd ./modules/systemd

View file

@ -28,12 +28,9 @@ in
uid = 1000; uid = 1000;
}; };
systemd.tmpfiles.settings.age."/home/alice/age-key".f = { systemd.tmpfiles.rules = [
mode = "400"; "f /home/alice/age-key 400 alice users - ${ageKey}"
user = "alice"; ];
group = "users";
argument = ageKey;
};
home-manager.users.alice = home-manager.users.alice =
{ config, ... }: { config, ... }:

View file

@ -1,24 +0,0 @@
{
imports = [ ./common-stubs.nix ];
systemd.user.tmpfiles.settings = {
cache."%C".d.age = "4 weeks";
myTool."%h/.config/myTool.conf"."f+" = {
mode = "0644";
user = "alice";
group = "users";
argument = "my unescaped config";
};
};
nmt.script = ''
cacheRulesFile=home-files/.config/user-tmpfiles.d/home-manager-cache.conf
assertFileExists $cacheRulesFile
assertFileRegex $cacheRulesFile "^'d' '%C' '-' '-' '-' '4 weeks' $"
myToolRulesFile=home-files/.config/user-tmpfiles.d/home-manager-myTool.conf
assertFileExists $myToolRulesFile
assertFileRegex $myToolRulesFile \
"^'f+' '%h/.config/myTool.conf' '0644' 'alice' 'users' '-' my\\\\x20unescaped\\\\x20config$"
'';
}

View file

@ -1,3 +0,0 @@
{
test.stubs.systemd.outPath = null;
}

View file

@ -1,6 +0,0 @@
{
tmpfiles-no-rules = ./no-rules.nix;
tmpfiles-basic-rules = ./basic-rules.nix;
tmpfiles-escaped-argument-warning = ./escaped-argument-warning.nix;
}

View file

@ -1,14 +0,0 @@
{
imports = [ ./common-stubs.nix ];
systemd.user.tmpfiles.settings.foo.path.f.argument = "my\\x20unescaped\\x20config";
test.asserts.warnings.expected = [
''
The 'systemd.user.tmpfiles.settings.foo.path.f.argument' option
appears to contain escape sequences, which will be escaped again.
Unescape them if this is not intended. The assigned string is:
"my\x20unescaped\x20config"
''
];
}

View file

@ -1,9 +0,0 @@
{
imports = [ ./common-stubs.nix ];
systemd.user.tmpfiles.settings = { };
nmt.script = ''
assertPathNotExists home-files/.config/user-tmpfiles.d/
'';
}