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 374D9431FAF for ; Thu, 3 Jan 2013 10:42:45 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org 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 l6yRDpCwTdPa for ; Thu, 3 Jan 2013 10:42:41 -0800 (PST) Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 2244F431FAE for ; Thu, 3 Jan 2013 10:42:41 -0800 (PST) Received: by mail-wi0-f170.google.com with SMTP id hq7so7992294wib.3 for ; Thu, 03 Jan 2013 10:42:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:subject:in-reply-to:references:user-agent:date :message-id:mime-version:content-type:x-gm-message-state; bh=JQz6/403c9vuI04EhvhuO2KmfyQIz4KE6whOmCvmYzc=; b=gQStqMVNnNNU09QHIQC/qvG9qZxouTTA8l0s3lTWMtAD/Qx3FF41IanBthtu6jA9T5 mbo908K10ll62Q/6bLhUlEtb10YHT5vAbAsFV4Zce2N/jQCIhKSnDMub7J2hWumtpu7F 3ZK2UBPxDQrBxHwFSMcKCkIdCW42WuEKjJqGe1lj41UnSPJAH9UFoVuUYfJXuqgghpKK PlALE8DDDUt8nFrDJ6k3ynhjbEwAKkXTnkkeaIKv6kkpZL/ff3LKl5XFiBNURiPS6Cwx DI3hucJlEcbFdRRpeQxhSx9tu/1SFyOufyh0mwk6RDzN4ESDeTM7bIgmYQ9Gz4YrTd/R t7kw== X-Received: by 10.180.19.136 with SMTP id f8mr77909083wie.0.1357238558696; Thu, 03 Jan 2013 10:42:38 -0800 (PST) Received: from localhost ([2001:4b98:dc0:43:216:3eff:fe1b:25f3]) by mx.google.com with ESMTPS id e6sm32875868wiz.1.2013.01.03.10.42.36 (version=SSLv3 cipher=OTHER); Thu, 03 Jan 2013 10:42:37 -0800 (PST) From: Jani Nikula To: david@tethera.net, notmuch@notmuchmail.org Subject: Re: [PATCH 04/11] cli: add support for batch tagging operations to "notmuch tag" In-Reply-To: <1356464567-21779-5-git-send-email-david@tethera.net> References: <1356464567-21779-1-git-send-email-david@tethera.net> <1356464567-21779-5-git-send-email-david@tethera.net> User-Agent: Notmuch/0.14+235~gdaf492b (http://notmuchmail.org) Emacs/23.2.1 (x86_64-pc-linux-gnu) Date: Thu, 03 Jan 2013 19:42:30 +0100 Message-ID: <87pq1mglbd.fsf@nikula.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Gm-Message-State: ALoCoQlLSPQGottqs0FLxsr9392rGi3xGF4wKdi2Hp13hqdjhCg/QQeeFeixPrMNITUsbXv8u2Vx 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: Thu, 03 Jan 2013 18:42:45 -0000 On Tue, 25 Dec 2012, david@tethera.net wrote: > 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 > MAP be hex encoded with %NN where NN is the MAY > hexadecimal value of the character. Any ' ' and '%' characters in > and MUST be hex encoded (using %20 and %25, If we also required double quotes '"' to be hex encoded, we would have an easier transition to using xapian quoting for tags too if we so choose. notmuch dump already does this. If we additionally require % to be quoted when using xapian quoting, we could detect hex vs. xapian automatically. > respectively). Any characters that are not part of or -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