From: david Date: Mon, 7 Jan 2013 03:16:48 +0000 (+2000) Subject: [Patch v2 3/9] cli: add support for batch tagging operations to "notmuch tag" X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=774fb14a6a9649d340e8f1a2727b3afd456d1c37;p=notmuch-archives.git [Patch v2 3/9] cli: add support for batch tagging operations to "notmuch tag" --- diff --git a/e3/eb2843a62a39272081c4803d522d0188161f4a b/e3/eb2843a62a39272081c4803d522d0188161f4a new file mode 100644 index 000000000..ce081256b --- /dev/null +++ b/e3/eb2843a62a39272081c4803d522d0188161f4a @@ -0,0 +1,217 @@ +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 9D62B431FD4 + for ; Sun, 6 Jan 2013 19:17:12 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] + 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 akfxxruJcZ+F for ; + Sun, 6 Jan 2013 19:17:11 -0800 (PST) +Received: from tesseract.cs.unb.ca (tesseract.cs.unb.ca [131.202.240.238]) + (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id 3C881431FC9 + for ; Sun, 6 Jan 2013 19:17:11 -0800 (PST) +Received: from fctnnbsc30w-156034082078.dhcp-dynamic.fibreop.nb.bellaliant.net + ([156.34.82.78] helo=zancas.localnet) + by tesseract.cs.unb.ca with esmtpsa + (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) + (envelope-from ) + id 1Ts3D3-0002dy-Ai; Sun, 06 Jan 2013 23:17:09 -0400 +Received: from bremner by zancas.localnet with local (Exim 4.80) + (envelope-from ) + id 1Ts3Cx-0001hw-Lr; Sun, 06 Jan 2013 23:17:03 -0400 +From: david@tethera.net +To: notmuch@notmuchmail.org +Subject: [Patch v2 3/9] cli: add support for batch tagging operations to + "notmuch tag" +Date: Sun, 6 Jan 2013 23:16:48 -0400 +Message-Id: <1357528614-6413-4-git-send-email-david@tethera.net> +X-Mailer: git-send-email 1.7.10.4 +In-Reply-To: <1357528614-6413-1-git-send-email-david@tethera.net> +References: <1357528614-6413-1-git-send-email-david@tethera.net> +X-Spam_bar: - +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: Mon, 07 Jan 2013 03:17:12 -0000 + +From: Jani Nikula + +Add support for batch tagging operations through stdin to "notmuch +tag". This can be enabled with the new --batch command line option to +"notmuch tag". The input must consist of lines of the format: + ++|- [...] [--] [...] + +Each line is interpreted similarly to "notmuch tag" command line +arguments. The delimiter is one or more spaces ' '. Any characters in + MAY be hex encoded with %NN where NN is the hexadecimal value of +the character. Any ' ' and '%' characters in and MUST be hex +encoded (using %20 and %25, respectively). For future-proofing, any +'"' characters in SHOULD be hex-encoded. + +Any characters that are not part of or +MUST NOT be hex encoded. + + is passed verbatim to Xapian + +Leading and trailing space ' ' is ignored. Empty lines and lines +beginning with '#' are ignored. + +Signed-off-by: Jani Nikula + +Hacked-like-crazy-by: David Bremner +--- + notmuch-tag.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 86 insertions(+), 8 deletions(-) + +diff --git a/notmuch-tag.c b/notmuch-tag.c +index 8129912..7fc614d 100644 +--- a/notmuch-tag.c ++++ b/notmuch-tag.c +@@ -128,6 +128,46 @@ tag_query (void *ctx, notmuch_database_t *notmuch, const char *query_string, + return interrupted; + } + ++static int ++tag_file (void *ctx, notmuch_database_t *notmuch, tag_op_flag_t flags, ++ FILE *input) ++{ ++ char *line = NULL; ++ char *query_string = NULL; ++ size_t line_size = 0; ++ ssize_t line_len; ++ int ret = 0; ++ tag_op_list_t *tag_ops; ++ ++ tag_ops = tag_op_list_create (ctx); ++ if (tag_ops == NULL) { ++ fprintf (stderr, "Out of memory.\n"); ++ return 1; ++ } ++ ++ while ((line_len = getline (&line, &line_size, input)) != -1 && ++ ! interrupted) { ++ ++ ret = parse_tag_line (ctx, line, TAG_FLAG_NONE, ++ &query_string, tag_ops); ++ ++ if (ret > 0) ++ continue; ++ ++ if (ret < 0) ++ break; ++ ++ ret = tag_query (ctx, notmuch, query_string, tag_ops, flags); ++ if (ret) ++ break; ++ } ++ ++ if (line) ++ free (line); ++ ++ return ret; ++} ++ + int + notmuch_tag_command (void *ctx, int argc, char *argv[]) + { +@@ -137,6 +177,10 @@ notmuch_tag_command (void *ctx, int argc, char *argv[]) + notmuch_database_t *notmuch; + struct sigaction action; + tag_op_flag_t tag_flags = TAG_FLAG_NONE; ++ notmuch_bool_t batch = FALSE; ++ FILE *input = stdin; ++ char *input_file_name = NULL; ++ int opt_index; + int ret = 0; + + /* Setup our handler for SIGINT */ +@@ -146,15 +190,43 @@ notmuch_tag_command (void *ctx, int argc, char *argv[]) + action.sa_flags = SA_RESTART; + sigaction (SIGINT, &action, NULL); + +- tag_ops = tag_op_list_create (ctx); +- if (tag_ops == NULL) { +- fprintf (stderr, "Out of memory.\n"); ++ notmuch_opt_desc_t options[] = { ++ { NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 }, ++ { NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 }, ++ { 0, 0, 0, 0, 0 } ++ }; ++ ++ opt_index = parse_arguments (argc, argv, options, 1); ++ if (opt_index < 0) + return 1; ++ ++ if (input_file_name) { ++ batch = TRUE; ++ input = fopen (input_file_name, "r"); ++ if (input == NULL) { ++ fprintf (stderr, "Error opening %s for reading: %s\n", ++ input_file_name, strerror (errno)); ++ return 1; ++ } + } + +- if (parse_tag_command_line (ctx, argc - 1, argv + 1, +- &query_string, tag_ops)) +- return 1; ++ if (batch) { ++ if (opt_index != argc) { ++ fprintf (stderr, "Can't specify both cmdline and stdin!\n"); ++ return 1; ++ } ++ } else { ++ ++ tag_ops = tag_op_list_create (ctx); ++ if (tag_ops == NULL) { ++ fprintf (stderr, "Out of memory.\n"); ++ return 1; ++ } ++ ++ if (parse_tag_command_line (ctx, argc - opt_index, argv + opt_index, ++ &query_string, tag_ops)) ++ return 1; ++ } + + config = notmuch_config_open (ctx, NULL, NULL); + if (config == NULL) +@@ -167,9 +239,15 @@ notmuch_tag_command (void *ctx, int argc, char *argv[]) + if (notmuch_config_get_maildir_synchronize_flags (config)) + tag_flags |= TAG_FLAG_MAILDIR_SYNC; + +- ret = tag_query (ctx, notmuch, query_string, tag_ops, tag_flags); ++ if (batch) ++ ret = tag_file (ctx, notmuch, tag_flags, input); ++ else ++ ret = tag_query (ctx, notmuch, query_string, tag_ops, tag_flags); + + notmuch_database_destroy (notmuch); + +- return ret; ++ if (input != stdin) ++ fclose (input); ++ ++ return ret || interrupted; + } +-- +1.7.10.4 +