[PATCH 2/2] cli: add support for running notmuch new pre and post hooks

Subject: [PATCH 2/2] cli: add support for running notmuch new pre and post hooks

Date: Fri, 2 Dec 2011 23:00:06 +0200

To: notmuch@notmuchmail.org

Cc:

From: Jani Nikula


Run notmuch new pre and post hooks if specified in the notmuch config
file. The hooks will be run before and after incorporating new messages to
the database. Also add command line option --no-hooks to notmuch new to
bypass the hooks.

With this patch, you can add hooks in your config, for example:

[new]
prehook=offlineimap
posthook=my-tagging-script

As the value is passed to system(1), you can actually have multiple
commands, redirections, pipes, etc. in there. If the tagging is simple
enough, you can just add the tagging in-line without a script.

TODO:

* Tests.

* Documentation (manpage and help).

Signed-off-by: Jani Nikula <jani@nikula.org>
---
 notmuch-client.h |    3 ++-
 notmuch-config.c |   16 +++++++++++++++-
 notmuch-new.c    |    9 +++++++++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index 5e2fed2..d2ebc73 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -88,7 +88,8 @@ typedef struct notmuch_show_params {
 } notmuch_show_params_t;
 
 typedef enum {
-    NOTMUCH_HOOK_PLACEHOLDER,
+    NOTMUCH_HOOK_PRE_NEW,
+    NOTMUCH_HOOK_POST_NEW,
 } notmuch_hook_t;
 
 /* There's no point in continuing when we've detected that we've done
diff --git a/notmuch-config.c b/notmuch-config.c
index 8f1a038..277f197 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -43,7 +43,13 @@ static const char new_config_comment[] =
     " The following options are supported here:\n"
     "\n"
     "\ttags	A list (separated by ';') of the tags that will be\n"
-    "\t	added to all messages incorporated by \"notmuch new\".\n";
+    "\t	added to all messages incorporated by \"notmuch new\".\n"
+    "\tprehook	A command to be executed before \"notmuch new\" starts\n"
+    "\t	incorporating new messages. For example, this could be used to fetch\n"
+    "\t	and deliver new messages to the mail directory.\n"
+    "\tposthook	A command to be executed after \"notmuch new\" has\n"
+    "\t	incorporated and tagged all new messages. For example, this could\n"
+    "\t	be used to perform further tagging on new messages.\n";
 
 static const char user_config_comment[] =
     " User configuration\n"
@@ -615,6 +621,14 @@ notmuch_config_get_hook (notmuch_config_t *config, notmuch_hook_t hook)
     const char *group, *key;
 
     switch (hook) {
+    case NOTMUCH_HOOK_PRE_NEW:
+	group = "new";
+	key = "prehook";
+	break;
+    case NOTMUCH_HOOK_POST_NEW:
+	group = "new";
+	key = "posthook";
+	break;
     default:
 	INTERNAL_ERROR ("Unknown hook %d\n.", hook);
     }
diff --git a/notmuch-new.c b/notmuch-new.c
index 0c70e64..09cc3f2 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -836,6 +836,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     _filename_node_t *f;
     int i;
     notmuch_bool_t timer_is_active = FALSE;
+    int run_hooks = 1;
 
     add_files_state.verbose = 0;
     add_files_state.output_is_a_tty = isatty (fileno (stdout));
@@ -845,6 +846,8 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     for (i = 0; i < argc && argv[i][0] == '-'; i++) {
 	if (STRNCMP_LITERAL (argv[i], "--verbose") == 0) {
 	    add_files_state.verbose = 1;
+	} else if (STRNCMP_LITERAL (argv[i], "--no-hooks") == 0) {
+	    run_hooks = 0;
 	} else {
 	    fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
 	    return 1;
@@ -854,6 +857,9 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     if (config == NULL)
 	return 1;
 
+    if (run_hooks && notmuch_run_hook (config, NOTMUCH_HOOK_PRE_NEW))
+	return 1;
+
     add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);
     add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
     db_path = notmuch_config_get_database_path (config);
@@ -1006,5 +1012,8 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
 
     notmuch_database_close (notmuch);
 
+    if (run_hooks && !interrupted)
+	ret |= notmuch_run_hook (config, NOTMUCH_HOOK_POST_NEW);
+
     return ret || interrupted;
 }
-- 
1.7.5.4


Thread: