From e826a6ce03dcee02ba2696e169dbb18711f73917 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Thu, 4 Jun 2020 16:10:32 +0200 Subject: nixos/dovecot2: refactor mailboxes option Specifying mailboxes as a list isn't a good approach since this makes it impossible to override values. For backwards-compatibility, it's still possible to declare a list of mailboxes, but a deprecation warning will be shown. --- nixos/doc/manual/release-notes/rl-2009.xml | 23 +++++++++++++++++++++++ nixos/modules/services/mail/dovecot.nix | 24 ++++++++++++++++++++---- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/nixos/doc/manual/release-notes/rl-2009.xml b/nixos/doc/manual/release-notes/rl-2009.xml index d1eecd65085c..900b1103f2b1 100644 --- a/nixos/doc/manual/release-notes/rl-2009.xml +++ b/nixos/doc/manual/release-notes/rl-2009.xml @@ -614,6 +614,29 @@ systemd.services.nginx.serviceConfig.ReadWritePaths = [ "/var/www" ]; queued on the kernel side of the netlink socket. + + + Specifying mailboxes in the dovecot2 module + as a list is deprecated and will break eval in 21.03. Instead, an attribute-set should be specified where the name + should be the key of the attribute. + + + This means that a configuration like this +{ + services.dovecot2.mailboxes = [ + { name = "Junk"; + auto = "create"; + } + ]; +} + should now look like this: +{ + services.dovecot2.mailboxes = { + Junk.auto = "create"; + }; +} + + diff --git a/nixos/modules/services/mail/dovecot.nix b/nixos/modules/services/mail/dovecot.nix index ee797f9c42f1..51cbcbf1cbc8 100644 --- a/nixos/modules/services/mail/dovecot.nix +++ b/nixos/modules/services/mail/dovecot.nix @@ -134,8 +134,9 @@ let mailboxes = { ... }: { options = { name = mkOption { - type = types.strMatching ''[^"]+''; + type = types.nullOr (types.strMatching ''[^"]+''); example = "Spam"; + default = null; description = "The name of the mailbox."; }; auto = mkOption { @@ -334,9 +335,24 @@ in }; mailboxes = mkOption { - type = types.listOf (types.submodule mailboxes); - default = []; - example = [ { name = "Spam"; specialUse = "Junk"; auto = "create"; } ]; + type = with types; let m = submodule mailboxes; in either (listOf m) (attrsOf m); + default = {}; + apply = x: + if isList x then warn "Declaring `services.dovecot2.mailboxes' as a list is deprecated and will break eval in 21.03!" x + else mapAttrsToList (name: value: + if value.name != null + then throw '' + When specifying dovecot2 mailboxes as attributes, declaring + a `name'-attribute is prohibited! The name ${value.name} should + be the attribute key! + '' + else value // { inherit name; } + ) x; + example = literalExample '' + { + Spam = { specialUse = "Junk"; auto = "create"; }; + } + ''; description = "Configure mailboxes and auto create or subscribe them."; }; -- cgit 1.4.1