Skip to content

Commit

Permalink
programs.lieer: add module
Browse files Browse the repository at this point in the history
Add 'programs.lieer', a tool for synchronizing a Gmail account with a
local maildir and notmuch database. Per-account configuration lives in
'accounts.email.accounts.<name>.lieer'.
  • Loading branch information
tadfisher authored and rycee committed Mar 7, 2020
1 parent 0056a5a commit 60a939b
Show file tree
Hide file tree
Showing 9 changed files with 192 additions and 0 deletions.
1 change: 1 addition & 0 deletions modules/accounts/email.nix
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ in
(import ../programs/alot-accounts.nix pkgs)
(import ../programs/astroid-accounts.nix)
(import ../programs/getmail-accounts.nix)
(import ../programs/lieer-accounts.nix)
(import ../programs/mbsync-accounts.nix)
(import ../programs/msmtp-accounts.nix)
(import ../programs/neomutt-accounts.nix)
Expand Down
7 changes: 7 additions & 0 deletions modules/misc/news.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1366,6 +1366,13 @@ in
https://rycee.gitlab.io/home-manager/#sec-install-nixos-module
'';
}

{
time = "2020-03-07T14:12:50+00:00";
message = ''
A new module is available: 'programs.lieer'.
'';
}
];
};
}
1 change: 1 addition & 0 deletions modules/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ let
(loadModule ./programs/htop.nix { })
(loadModule ./programs/info.nix { })
(loadModule ./programs/irssi.nix { })
(loadModule ./programs/lieer.nix { })
(loadModule ./programs/jq.nix { })
(loadModule ./programs/kakoune.nix { })
(loadModule ./programs/keychain.nix { })
Expand Down
69 changes: 69 additions & 0 deletions modules/programs/lieer-accounts.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{ lib, ... }:

with lib;

{
options.lieer = {
enable = mkEnableOption "lieer Gmail synchronization for notmuch";

timeout = mkOption {
type = types.ints.unsigned;
default = 0;
description = ''
HTTP timeout in seconds. 0 means forever or system timeout.
'';
};

replaceSlashWithDot = mkOption {
type = types.bool;
default = false;
description = ''
Replace '/' with '.' in Gmail labels.
'';
};

dropNonExistingLabels = mkOption {
type = types.bool;
default = false;
description = ''
Allow missing labels on the Gmail side to be dropped.
'';
};

ignoreTagsLocal = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
Set custom tags to ignore when syncing from local to
remote (after translations).
'';
};

ignoreTagsRemote = mkOption {
type = types.listOf types.str;
default = [
"CATEGORY_FORUMS"
"CATEGORY_PROMOTIONS"
"CATEGORY_UPDATES"
"CATEGORY_SOCIAL"
"CATEGORY_PERSONAL"
];
description = ''
Set custom tags to ignore when syncing from remote to
local (before translations).
'';
};

notmuchSetupWarning = mkOption {
type = types.bool;
default = true;
description = ''
Warn if Notmuch is not also enabled for this account.
</para><para>
This can safely be disabled if <command>notmuch init</command>
has been used to configure this account outside of Home
Manager.
'';
};
};
}
89 changes: 89 additions & 0 deletions modules/programs/lieer.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{ config, lib, pkgs, ... }:

with lib;

let
cfg = config.programs.lieer;

lieerAccounts =
filter (a: a.lieer.enable) (attrValues config.accounts.email.accounts);

nonGmailAccounts =
map (a: a.name) (filter (a: a.flavor != "gmail.com") lieerAccounts);

nonGmailConfigHelp =
map (name: ''accounts.email.accounts.${name}.flavor = "gmail.com";'')
nonGmailAccounts;

missingNotmuchAccounts = map (a: a.name)
(filter (a: !a.notmuch.enable && a.lieer.notmuchSetupWarning)
lieerAccounts);

notmuchConfigHelp =
map (name: "accounts.email.accounts.${name}.notmuch.enable = true;")
missingNotmuchAccounts;

configFile = account: {
name = "${account.maildir.absPath}/.gmailieer.json";
value = {
text = builtins.toJSON {
inherit (account.lieer) timeout;
account = account.address;
replace_slash_with_dot = account.lieer.replaceSlashWithDot;
drop_non_existing_label = account.lieer.dropNonExistingLabels;
ignore_tags = account.lieer.ignoreTagsLocal;
ignore_remote_labels = account.lieer.ignoreTagsRemote;
} + "\n";
};
};

in {
meta.maintainers = [ maintainers.tadfisher ];

options = {
programs.lieer.enable =
mkEnableOption "lieer Gmail synchronization for notmuch";
};

config = mkIf cfg.enable (mkMerge [
(mkIf (missingNotmuchAccounts != [ ]) {
warnings = [''
lieer is enabled for the following email accounts, but notmuch is not:
${concatStringsSep "\n " missingNotmuchAccounts}
Notmuch can be enabled with:
${concatStringsSep "\n " notmuchConfigHelp}
If you have configured notmuch outside of Home Manager, you can suppress this
warning with:
programs.lieer.notmuchSetupWarning = false;
''];
})

{
assertions = [{
assertion = nonGmailAccounts == [ ];
message = ''
lieer is enabled for non-Gmail accounts:
${concatStringsSep "\n " nonGmailAccounts}
If these accounts are actually Gmail accounts, you can
fix this error with:
${concatStringsSep "\n " nonGmailConfigHelp}
'';
}];

home.packages = [ pkgs.gmailieer ];

# Notmuch should ignore non-mail files created by lieer.
programs.notmuch.new.ignore = [ "/.*[.](json|lock|bak)$/" ];

home.file = listToAttrs (map configFile lieerAccounts);
}
]);
}
1 change: 1 addition & 0 deletions tests/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import nmt {
./modules/programs/fish
./modules/programs/git
./modules/programs/gpg
./modules/programs/lieer
./modules/programs/mbsync
./modules/programs/neomutt
./modules/programs/newsboat
Expand Down
1 change: 1 addition & 0 deletions tests/modules/programs/lieer/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ lieer = ./lieer.nix; }
1 change: 1 addition & 0 deletions tests/modules/programs/lieer/lieer-expected.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"account":"[email protected]","drop_non_existing_label":false,"ignore_remote_labels":["CATEGORY_FORUMS","CATEGORY_PROMOTIONS","CATEGORY_UPDATES","CATEGORY_SOCIAL","CATEGORY_PERSONAL"],"ignore_tags":[],"replace_slash_with_dot":false,"timeout":0}
22 changes: 22 additions & 0 deletions tests/modules/programs/lieer/lieer.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{ config, lib, pkgs, ... }:

with lib;

{
imports = [ ../../accounts/email-test-accounts.nix ];

config = {
home.username = "hm-user";
home.homeDirectory = "/home/hm-user";

programs.lieer.enable = true;

accounts.email.accounts = { "[email protected]".lieer.enable = true; };

nmt.script = ''
assertFileExists home-files/Mail/[email protected]/.gmailieer.json
assertFileContent home-files/Mail/[email protected]/.gmailieer.json \
${./lieer-expected.json}
'';
};
}

0 comments on commit 60a939b

Please sign in to comment.