Skip to content

Commit

Permalink
mu: run initialization command when personal addresses change
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
VojtechStep committed Nov 18, 2024
1 parent f3a2ff6 commit 83b89fa
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
30 changes: 20 additions & 10 deletions modules/programs/mu.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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
# List of personal email addresses to register, sorted in natural order
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 naturalSort (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 {
Expand Down Expand Up @@ -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=$(run ${muExe} info store | ${
getExe pkgs.gawk
} '/personal-address/{print $4}' | sort | paste -sd ' ')
if [[ ! -d "${dbLocation}" || ! "$MU_SORTED_ADDRS" = "${
concatStringsSep " " sortedAddresses
}" ]]; then
run ${muExe} init ${maildirOption} ${myAddresses} $VERBOSE_ARG;
fi
'';
};
Expand Down
4 changes: 2 additions & 2 deletions tests/modules/programs/mu/basic-configuration.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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;'
'';
}

0 comments on commit 83b89fa

Please sign in to comment.