From cab44ac044c9a1a89996a81a1e69c5e9ca5c1959 Mon Sep 17 00:00:00 2001 From: VojtechStep Date: Mon, 18 Nov 2024 17:35:56 +0100 Subject: [PATCH] mu: run initialization command when personal addresses change When the user changes which addresses mu should consider 'personal', mu's store should be reinitialized. After this change, the activation script parses the previously configured list of addresses and compares it with the new one. If they differ, it runs the init command even when the store has already been initialized. --- modules/programs/mu.nix | 30 ++++++++++++------- .../programs/mu/basic-configuration.nix | 4 +-- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/modules/programs/mu.nix b/modules/programs/mu.nix index 4d051d4daef0..ffadc460b043 100644 --- a/modules/programs/mu.nix +++ b/modules/programs/mu.nix @@ -9,17 +9,22 @@ let # Used to generate command line arguments that mu can operate with. genCmdMaildir = path: "--maildir=" + path; - # Takes the list of accounts with mu.enable = true, and generates a - # command-line flag for initializing the mu database. - myAddresses = let + # Sorted list of personal email addresses to register + sortedAddresses = let # Set of email account sets where mu.enable = true. muAccounts = filter (a: a.mu.enable) (attrValues config.accounts.email.accounts); addrs = map (a: a.address) muAccounts; # Construct list of lists containing email aliases, and flatten aliases = flatten (map (a: a.aliases) muAccounts); - # Prefix --my-address= to each account's address AND all defined aliases - addMyAddress = map (addr: "--my-address=" + addr) (addrs ++ aliases); + # Sort the list + in sort lessThan (addrs ++ aliases); + + # Takes the list of accounts with mu.enable = true, and generates a + # command-line flag for initializing the mu database. + myAddresses = let + # Prefix --my-address= to each account's address and all defined aliases + addMyAddress = map (addr: "--my-address=" + addr) sortedAddresses; in concatStringsSep " " addMyAddress; in { @@ -49,14 +54,19 @@ in { home.activation.runMuInit = let maildirOption = genCmdMaildir config.accounts.email.maildirBasePath; dbLocation = config.xdg.cacheHome + "/mu"; + muExe = getExe cfg.package; in hm.dag.entryAfter [ "writeBoundary" ] '' - # If the database directory exists, then `mu init` should NOT be run. + # If the database directory exists and registered personal addresses remain the same, + # then `mu init` should NOT be run. # In theory, mu is the only thing that creates that directory, and it is # only created during the initial index. - if [[ ! -d "${dbLocation}" ]]; then - run ${ - getExe cfg.package - } init ${maildirOption} ${myAddresses} $VERBOSE_ARG; + MU_SORTED_ADDRS=$(${muExe} info store | ${ + getExe pkgs.gawk + } '/personal-address/{print $4}' | LC_ALL=C sort | paste -sd ' ') + if [[ ! -d "${dbLocation}" || ! "$MU_SORTED_ADDRS" = "${ + concatStringsSep " " sortedAddresses + }" ]]; then + run ${muExe} init ${maildirOption} ${myAddresses} $VERBOSE_ARG; fi ''; }; diff --git a/tests/modules/programs/mu/basic-configuration.nix b/tests/modules/programs/mu/basic-configuration.nix index 93e870da63c1..edca63a7076a 100644 --- a/tests/modules/programs/mu/basic-configuration.nix +++ b/tests/modules/programs/mu/basic-configuration.nix @@ -16,9 +16,9 @@ nmt.script = '' assertFileContains activate \ - 'if [[ ! -d "/home/hm-user/.cache/mu" ]]; then' + 'if [[ ! -d "/home/hm-user/.cache/mu" || ! "$MU_SORTED_ADDRS" = "foo@example.com hm@example.com" ]]; then' assertFileContains activate \ - 'run @mu@/bin/mu init --maildir=/home/hm-user/Mail --my-address=hm@example.com --my-address=foo@example.com $VERBOSE_ARG;' + 'run @mu@/bin/mu init --maildir=/home/hm-user/Mail --my-address=foo@example.com --my-address=hm@example.com $VERBOSE_ARG;' ''; }