notmuch: add module

Co-authored-by: Matthieu Coudron <mattator@gmail.com>
This commit is contained in:
Robert Helgesson 2018-06-28 23:42:25 +02:00
parent 8dc1737e39
commit eecebbf186
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
4 changed files with 206 additions and 0 deletions

View file

@ -697,6 +697,13 @@ in
A new module is available: 'programs.mbsync'. A new module is available: 'programs.mbsync'.
''; '';
} }
{
time = "2018-07-01T16:12:20+00:00";
message = ''
A new module is available: 'programs.notmuch'.
'';
}
]; ];
}; };
} }

View file

@ -45,6 +45,7 @@ let
./programs/mercurial.nix ./programs/mercurial.nix
./programs/neovim.nix ./programs/neovim.nix
./programs/newsboat.nix ./programs/newsboat.nix
./programs/notmuch.nix
./programs/pidgin.nix ./programs/pidgin.nix
./programs/rofi.nix ./programs/rofi.nix
./programs/ssh.nix ./programs/ssh.nix

View file

@ -219,6 +219,8 @@ in
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
programs.notmuch.new.ignore = [ ".uidvalidity" ".mbsyncstate" ];
home.file.".mbsyncrc".text = home.file.".mbsyncrc".text =
let let
accountsConfig = map genAccountConfig mbsyncAccounts; accountsConfig = map genAccountConfig mbsyncAccounts;

View file

@ -0,0 +1,196 @@
{ config, lib, pkgs, ... }:
with lib;
let
dag = config.lib.dag;
cfg = config.programs.notmuch;
mkIniKeyValue = key: value:
let
tweakVal = v:
if isString v then v
else if isList v then concatMapStringsSep ";" tweakVal v
else if isBool v then toJSON v
else toString v;
in
"${key}=${tweakVal value}";
notmuchIni =
recursiveUpdate
{
database = {
path = config.accounts.email.maildirBasePath;
};
new = {
ignore = cfg.new.ignore;
tags = cfg.new.tags;
};
user =
let
accounts =
filter (a: a.notmuch.enable)
(attrValues config.accounts.email.accounts);
primary = filter (a: a.primary) accounts;
secondaries = filter (a: !a.primary) accounts;
in {
name = catAttrs "realName" primary;
primary_email = catAttrs "address" primary;
other_email = catAttrs "address" secondaries;
};
search = {
exclude_tags = [ "deleted" "spam" ];
};
}
cfg.extraConfig;
in
{
options = {
programs.notmuch = {
enable = mkEnableOption "Notmuch mail indexer";
new = mkOption {
type = types.submodule {
options = {
ignore = mkOption {
type = types.listOf types.str;
default = [];
description = ''
A list to specify files and directories that will not be
searched for messages by <command>notmuch new</command>.
'';
};
tags = mkOption {
type = types.listOf types.str;
default = [ "unread" "inbox" ];
example = [ "new" ];
description = ''
A list of tags that will be added to all messages
incorporated by <command>notmuch new</command>.
'';
};
};
};
default = {};
description = ''
Options related to email processing performed by
<command>notmuch new</command>.
'';
};
extraConfig = mkOption {
type = types.attrsOf (types.attrsOf types.str);
default = {
maildir = { synchronize_flags = "True"; };
};
description = ''
Options that should be appended to the notmuch configuration file.
'';
};
hooks = {
preNew = mkOption {
type = types.lines;
default = "";
example = "mbsync --all";
description = ''
Bash statements run before scanning or importing new
messages into the database.
'';
};
postNew = mkOption {
type = types.lines;
default = "";
example = ''
notmuch tag +nixos -- tag:new and from:nixos1@discoursemail.com
'';
description = ''
Bash statements run after new messages have been imported
into the database and initial tags have been applied.
'';
};
postInsert = mkOption {
type = types.lines;
default = "";
description = ''
Bash statements run after a message has been inserted
into the database and initial tags have been applied.
'';
};
};
};
accounts.email.accounts = mkOption {
options = [
{
notmuch = {
enable = mkEnableOption "notmuch indexing";
};
}
];
};
};
config = mkIf cfg.enable {
assertions = [
{
assertion = notmuchIni.user.name != [];
message = "notmuch: Must have a user name set.";
}
{
assertion = notmuchIni.user.primary_email != [];
message = "notmuch: Must have a user primary email address set.";
}
];
home.packages = [ pkgs.notmuch ];
home.sessionVariables = {
NOTMUCH_CONFIG = "${config.xdg.configHome}/notmuch/notmuchrc";
NMBGIT = "${config.xdg.dataHome}/notmuch/nmbug";
};
xdg.configFile."notmuch/notmuchrc".text =
let
toIni = generators.toINI { mkKeyValue = mkIniKeyValue; };
in
"# Generated by Home Manager.\n\n"
+ toIni notmuchIni;
home.file =
let
hook = name: cmds:
{
target = "${notmuchIni.database.path}/.notmuch/hooks/${name}";
source = pkgs.writeScript name ''
#!${pkgs.stdenv.shell}
export PATH="${pkgs.notmuch}/bin''${PATH:+:}$PATH"
export NOTMUCH_CONFIG="${config.xdg.configHome}/notmuch/notmuchrc"
export NMBGIT="${config.xdg.dataHome}/notmuch/nmbug"
${cmds}
'';
executable = true;
};
in
optional (cfg.hooks.preNew != "")
(hook "pre-new" cfg.hooks.preNew)
++
optional (cfg.hooks.postNew != "")
(hook "post-new" cfg.hooks.postNew)
++
optional (cfg.hooks.postInsert != "")
(hook "post-insert" cfg.hooks.postInsert);
};
}