mirror of
https://github.com/nix-community/home-manager
synced 2024-11-05 10:49:44 +01:00
9f9e277b60
These (and the `*MD` functions apart from `literalMD`) are now no-ops in nixpkgs and serve no purpose other than to add additional noise and potentially mislead people into thinking unmarked DocBook documentation will still be accepted. Note that if backporting changes including documentation to 23.05, the `mdDoc` calls will need to be re-added. To reproduce this commit, run: $ NIX_PATH=nixpkgs=flake:nixpkgs/e7e69199f0372364a6106a1e735f68604f4c5a25 \ nix shell nixpkgs#coreutils \ -c find . -name '*.nix' \ -exec nix run -- github:emilazy/nix-doc-munge/98dadf1f77351c2ba5dcb709a2a171d655f15099 \ --strip {} + $ ./format
293 lines
7.6 KiB
Nix
293 lines
7.6 KiB
Nix
{ 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;
|
|
|
|
settingsFormat = pkgs.formats.json { };
|
|
|
|
configFile = account: {
|
|
name = "${account.maildir.absPath}/.gmailieer.json";
|
|
value.source = settingsFormat.generate "lieer-${account.address}.json"
|
|
({ account = account.address; } // account.lieer.settings);
|
|
};
|
|
|
|
settingsOpts = {
|
|
drop_non_existing_label = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
Allow missing labels on the Gmail side to be dropped.
|
|
'';
|
|
};
|
|
|
|
file_extension = mkOption {
|
|
type = types.str;
|
|
default = "";
|
|
example = "mbox";
|
|
description = ''
|
|
Extension to include in local file names, which can be useful
|
|
for indexing with third-party programs.
|
|
'';
|
|
};
|
|
|
|
ignore_empty_history = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
Work around a Gmail API quirk where an empty change history
|
|
is sometimes returned.
|
|
|
|
See this
|
|
[GitHub issue](https://github.com/gauteh/lieer/issues/120)
|
|
for more details.
|
|
'';
|
|
};
|
|
|
|
ignore_remote_labels = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [
|
|
"CATEGORY_FORUMS"
|
|
"CATEGORY_PROMOTIONS"
|
|
"CATEGORY_UPDATES"
|
|
"CATEGORY_SOCIAL"
|
|
"CATEGORY_PERSONAL"
|
|
];
|
|
description = ''
|
|
Set Gmail labels to ignore when syncing from remote labels to
|
|
local tags (before translations).
|
|
'';
|
|
};
|
|
|
|
ignore_tags = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ ];
|
|
description = ''
|
|
Set labels to ignore when syncing from local tags to
|
|
remote labels (after translations).
|
|
'';
|
|
};
|
|
|
|
local_trash_tag = mkOption {
|
|
type = types.str;
|
|
default = "trash";
|
|
description = ''
|
|
Local tag to which the remote Gmail 'TRASH' label is translated.
|
|
'';
|
|
};
|
|
|
|
remove_local_messages = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
Remove local messages that have been deleted on the remote.
|
|
'';
|
|
};
|
|
|
|
replace_slash_with_dot = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
Replace '/' with '.' in Gmail labels.
|
|
'';
|
|
};
|
|
|
|
timeout = mkOption {
|
|
type = types.ints.unsigned;
|
|
default = 600;
|
|
description = ''
|
|
HTTP timeout in seconds. 0 means forever or system timeout.
|
|
'';
|
|
};
|
|
};
|
|
|
|
syncOpts = {
|
|
enable = mkEnableOption "lieer synchronization service";
|
|
|
|
frequency = mkOption {
|
|
type = types.str;
|
|
default = "*:0/5";
|
|
description = ''
|
|
How often to synchronize the account.
|
|
|
|
This value is passed to the systemd timer configuration as the
|
|
onCalendar option. See
|
|
{manpage}`systemd.time(7)`
|
|
for more information about the format.
|
|
'';
|
|
};
|
|
};
|
|
|
|
lieerOpts = {
|
|
enable = mkEnableOption "lieer Gmail synchronization for notmuch";
|
|
|
|
notmuchSetupWarning = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
Warn if Notmuch is not also enabled for this account.
|
|
|
|
This can safely be disabled if {command}`notmuch init`
|
|
has been used to configure this account outside of Home
|
|
Manager.
|
|
'';
|
|
};
|
|
|
|
settings = mkOption {
|
|
type = types.submodule {
|
|
freeformType = settingsFormat.type;
|
|
options = settingsOpts;
|
|
};
|
|
default = { };
|
|
description = ''
|
|
Settings which are applied to {file}`.gmailieer.json`
|
|
for the account.
|
|
|
|
See the [lieer manual](https://github.com/gauteh/lieer/)
|
|
for documentation of settings not explicitly covered by this module.
|
|
'';
|
|
};
|
|
|
|
sync = syncOpts;
|
|
};
|
|
|
|
lieerModule = types.submodule {
|
|
imports = [
|
|
(mkRenamedOptionModule [ "lieer" "dropNonExistingLabels" ] [
|
|
"lieer"
|
|
"settings"
|
|
"drop_non_existing_label"
|
|
])
|
|
(mkRenamedOptionModule [ "lieer" "ignoreTagsRemote" ] [
|
|
"lieer"
|
|
"settings"
|
|
"ignore_remote_labels"
|
|
])
|
|
(mkRenamedOptionModule [ "lieer" "ignoreTagsLocal" ] [
|
|
"lieer"
|
|
"settings"
|
|
"ignore_tags"
|
|
])
|
|
(mkRenamedOptionModule [ "lieer" "timeout" ] [
|
|
"lieer"
|
|
"settings"
|
|
"timeout"
|
|
])
|
|
(mkRenamedOptionModule [ "lieer" "replaceSlashWithDot" ] [
|
|
"lieer"
|
|
"settings"
|
|
"replace_slash_with_dot"
|
|
])
|
|
];
|
|
|
|
options = {
|
|
lieer = lieerOpts;
|
|
|
|
warnings = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ ];
|
|
internal = true;
|
|
visible = false;
|
|
};
|
|
};
|
|
};
|
|
|
|
renamedOptions = account:
|
|
let prefix = [ "accounts" "email" "accounts" account.name "lieer" ];
|
|
in [
|
|
(mkRenamedOptionModule (prefix ++ [ "dropNonExistingLabels" ])
|
|
(prefix ++ [ "settings" "drop_non_existing_label" ]))
|
|
(mkRenamedOptionModule (prefix ++ [ "ignoreTagsRemote" ])
|
|
(prefix ++ [ "settings" "ignore_remote_labels" ]))
|
|
(mkRenamedOptionModule (prefix ++ [ "ignoreTagsLocal" ])
|
|
(prefix ++ [ "settings" "ignore_tags" ]))
|
|
(mkRenamedOptionModule (prefix ++ [ "timeout" ])
|
|
(prefix ++ [ "settings" "timeout" ]))
|
|
(mkRenamedOptionModule (prefix ++ [ "replaceSlashWithDot" ])
|
|
(prefix ++ [ "settings" "replace_slash_with_dot" ]))
|
|
];
|
|
|
|
in {
|
|
meta.maintainers = [ maintainers.tadfisher ];
|
|
|
|
options = {
|
|
programs.lieer = {
|
|
enable = mkEnableOption "lieer Gmail synchronization for notmuch";
|
|
|
|
package = mkOption {
|
|
type = types.package;
|
|
default = pkgs.lieer;
|
|
defaultText = "pkgs.lieer";
|
|
description = ''
|
|
lieer package to use.
|
|
'';
|
|
};
|
|
};
|
|
|
|
accounts.email.accounts =
|
|
mkOption { type = with types; attrsOf lieerModule; };
|
|
};
|
|
|
|
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}
|
|
'';
|
|
}];
|
|
|
|
warnings = flatten (map (account: account.warnings) lieerAccounts);
|
|
|
|
home.packages = [ cfg.package ];
|
|
|
|
# Notmuch should ignore non-mail files created by lieer.
|
|
programs.notmuch.new.ignore = [ "/.*[.](json|lock|bak)$/" ];
|
|
|
|
home.file = listToAttrs (map configFile lieerAccounts);
|
|
}
|
|
]);
|
|
}
|