-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
Showing
9 changed files
with
192 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
''; | ||
}; | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
]); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{ lieer = ./lieer.nix; } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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} | ||
''; | ||
}; | ||
} |