Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 7EE61429E21 for ; Fri, 2 Dec 2011 13:00:19 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fr+YZLJRn6MS for ; Fri, 2 Dec 2011 13:00:18 -0800 (PST) Received: from mail-ww0-f45.google.com (mail-ww0-f45.google.com [74.125.82.45]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 3A42B429E34 for ; Fri, 2 Dec 2011 13:00:18 -0800 (PST) Received: by wgbds13 with SMTP id ds13so1494759wgb.2 for ; Fri, 02 Dec 2011 13:00:16 -0800 (PST) Received: by 10.216.137.137 with SMTP id y9mr803861wei.112.1322859616200; Fri, 02 Dec 2011 13:00:16 -0800 (PST) Received: from localhost (dsl-hkibrasgw4-fe5cdc00-23.dhcp.inet.fi. [80.220.92.23]) by mx.google.com with ESMTPS id em4sm12046848wbb.20.2011.12.02.13.00.14 (version=SSLv3 cipher=OTHER); Fri, 02 Dec 2011 13:00:14 -0800 (PST) From: Jani Nikula To: notmuch@notmuchmail.org Subject: [PATCH 2/2] cli: add support for running notmuch new pre and post hooks Date: Fri, 2 Dec 2011 23:00:06 +0200 Message-Id: <716da00e176e1dc6af0ba248caee40acee733120.1322859389.git.jani@nikula.org> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <7fbe6befcf31881a9bca672f55b93501249a220c.1322859389.git.jani@nikula.org> References: <7fbe6befcf31881a9bca672f55b93501249a220c.1322859389.git.jani@nikula.org> In-Reply-To: <7fbe6befcf31881a9bca672f55b93501249a220c.1322859389.git.jani@nikula.org> References: <7fbe6befcf31881a9bca672f55b93501249a220c.1322859389.git.jani@nikula.org> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2011 21:00:19 -0000 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 --- 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