From: Tomi Ollila <tomi.ollila@iki.fi>
To: markwalters1009 <markwalters1009@gmail.com>, notmuch@notmuchmail.org
Subject: Re: [PATCH v2 6/7] cli: allow search mode to include msg-ids with JSON output
Date: Sun, 25 Nov 2012 00:30:43 +0200 [thread overview]
Message-ID: <m2624uk50s.fsf@guru.guru-group.fi> (raw)
In-Reply-To: <1353763256-32336-7-git-send-email-markwalters1009@gmail.com>
On Sat, Nov 24 2012, markwalters1009 wrote:
> From: Mark Walters <markwalters1009@gmail.com>
>
> This adds a --queries=true option which modifies the summary output of
> notmuch search by including two extra query strings with each result:
> one query string specifies all matching messages and one query string
> all non-matching messages. Currently these are just lists of message
> ids joined with " or " but that could change in future.
Please see (mostly formatting) comments inline below.
> Currently this is not implemented for text format.
> ---
> notmuch-search.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++---
> 1 files changed, 89 insertions(+), 6 deletions(-)
>
> diff --git a/notmuch-search.c b/notmuch-search.c
> index 830c4e4..c8fc9a6 100644
> --- a/notmuch-search.c
> +++ b/notmuch-search.c
> @@ -26,7 +26,8 @@ typedef enum {
> OUTPUT_THREADS,
> OUTPUT_MESSAGES,
> OUTPUT_FILES,
> - OUTPUT_TAGS
> + OUTPUT_TAGS,
> + OUTPUT_SUMMARY_WITH_QUERIES
> } output_t;
>
> static char *
> @@ -46,6 +47,57 @@ sanitize_string (const void *ctx, const char *str)
> return out;
> }
>
> +/* This function takes a message id and returns an escaped string
> + * which can be used as a Xapian query. This involves prefixing with
> + * `id:', putting the id inside double quotes, and doubling any
> + * occurence of a double quote in the message id itself.*/
> +static char *
> +xapian_escape_id (const void *ctx,
> + const char *msg_id)
second line indentation, not at '(' level as elsewhere
> +{
> + const char *c;
> + char *escaped_msg_id;
> + escaped_msg_id = talloc_strdup (ctx, "id:\"");
> + for (c=msg_id; *c; c++)
spacing above
> + if (*c == '"')
> + escaped_msg_id = talloc_asprintf_append (escaped_msg_id, "\"\"");
> + else
> + escaped_msg_id = talloc_asprintf_append (escaped_msg_id, "%c", *c);
> + escaped_msg_id = talloc_asprintf_append (escaped_msg_id, "\"");
> + return escaped_msg_id;
> +}
If Austin sees fit he can comment the O(...) of the addition of msgids
to query strings -- it would take quite an overhaul to the functionality
if the escaped msgid's were directly written to query string...
> +
> +static char *
> +output_msg_query (const void *ctx,
> + sprinter_t *format,
> + notmuch_bool_t matching,
> + notmuch_bool_t first,
> + notmuch_messages_t *messages)
indentation level above
> +{
> + notmuch_message_t *message;
> + char *query, *escaped_msg_id;
> + query = talloc_strdup (ctx, "");
> + for (;
> + notmuch_messages_valid (messages);
> + notmuch_messages_move_to_next (messages))
> + {
> + message = notmuch_messages_get (messages);
> + if (notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH) == matching) {
> + escaped_msg_id = xapian_escape_id (ctx, notmuch_message_get_message_id (message));
> + if (first) {
> + query = talloc_asprintf_append (query, "%s", escaped_msg_id);
> + first = FALSE;
> + }
> + else
> + query = talloc_asprintf_append (query, " or %s", escaped_msg_id);
> + talloc_free (escaped_msg_id);
> + }
> + /* output_msg_query already starts with an ` or' */
> + query = talloc_asprintf_append (query, "%s", output_msg_query (ctx, format, matching, first, notmuch_message_get_replies (message)));
> + }
> + return query;
> +}
> +
> static int
> do_search_threads (sprinter_t *format,
> notmuch_query_t *query,
> @@ -88,7 +140,7 @@ do_search_threads (sprinter_t *format,
> format->string (format,
> notmuch_thread_get_thread_id (thread));
> format->separator (format);
> - } else { /* output == OUTPUT_SUMMARY */
> + } else { /* output == OUTPUT_SUMMARY or OUTPUT_SUMMARY_WITH_QUERIES */
> void *ctx_quote = talloc_new (thread);
> const char *authors = notmuch_thread_get_authors (thread);
> const char *subject = notmuch_thread_get_subject (thread);
> @@ -108,7 +160,7 @@ do_search_threads (sprinter_t *format,
> relative_date = notmuch_time_relative_date (ctx_quote, date);
>
> if (format->is_text_printer) {
> - /* Special case for the text formatter */
> + /* Special case for the text formatter */
irrelevant spacing change
> printf ("thread:%s %12s [%d/%d] %s; %s (",
> thread_id,
> relative_date,
> @@ -133,8 +185,6 @@ do_search_threads (sprinter_t *format,
> format->string (format, subject);
> }
>
> - talloc_free (ctx_quote);
> -
> format->map_key (format, "tags");
> format->begin_list (format);
>
> @@ -145,7 +195,7 @@ do_search_threads (sprinter_t *format,
> const char *tag = notmuch_tags_get (tags);
>
> if (format->is_text_printer) {
> - /* Special case for the text formatter */
> + /* Special case for the text formatter */
irrelevant spacing change
> if (first_tag)
> first_tag = FALSE;
> else
> @@ -160,8 +210,25 @@ do_search_threads (sprinter_t *format,
> printf (")");
>
> format->end (format);
> +
> + if (output == OUTPUT_SUMMARY_WITH_QUERIES) {
> + char *query;
> + query = output_msg_query (ctx_quote, format, TRUE, TRUE, notmuch_thread_get_toplevel_messages (thread));
> + if (strlen (query)) {
> + format->map_key (format, "matching_msg_query");
> + format->string (format, query);
> + }
> + query = output_msg_query (ctx_quote, format, FALSE, TRUE, notmuch_thread_get_toplevel_messages (thread));
> + if (strlen (query)) {
> + format->map_key (format, "nonmatching_msg_query");
> + format->string (format, query);
> + }
> + }
> +
> format->end (format);
> format->separator (format);
> +
> + talloc_free (ctx_quote);
> }
>
> notmuch_thread_destroy (thread);
> @@ -303,6 +370,7 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
> int offset = 0;
> int limit = -1; /* unlimited */
> int exclude = EXCLUDE_TRUE;
> + notmuch_bool_t with_queries = FALSE;
> unsigned int i;
>
> enum { NOTMUCH_FORMAT_JSON, NOTMUCH_FORMAT_TEXT }
> @@ -323,12 +391,14 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
> { "messages", OUTPUT_MESSAGES },
> { "files", OUTPUT_FILES },
> { "tags", OUTPUT_TAGS },
> + { "with-queries", OUTPUT_SUMMARY_WITH_QUERIES },
this "with-queries" confuses me -- old version or undocumented feature ?
> { 0, 0 } } },
> { NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
> (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
> { "false", EXCLUDE_FALSE },
> { "flag", EXCLUDE_FLAG },
> { 0, 0 } } },
> + { NOTMUCH_OPT_BOOLEAN, &with_queries, "queries", 'b', 0 },
> { NOTMUCH_OPT_INT, &offset, "offset", 'O', 0 },
> { NOTMUCH_OPT_INT, &limit, "limit", 'L', 0 },
> { 0, 0, 0, 0, 0 }
> @@ -398,6 +468,19 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
> notmuch_query_set_omit_excluded (query, FALSE);
> }
>
> + if (with_queries) {
> + if (format_sel == NOTMUCH_FORMAT_TEXT) {
> + fprintf (stderr, "Warning: --queries=true not implemented for text format.\n");
> + with_queries = FALSE;
> + }
> + if (output != OUTPUT_SUMMARY) {
> + fprintf (stderr, "Warning: --queries=true only implemented for --output=summary.\n");
> + with_queries = FALSE;
> + }
> + }
> +
> + if (with_queries) output = OUTPUT_SUMMARY_WITH_QUERIES;
newline before output = ...
> +
> switch (output) {
> default:
> case OUTPUT_SUMMARY:
> --
> 1.7.9.1
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
next prev parent reply other threads:[~2012-11-24 22:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-24 13:20 [PATCH v2 0/7] Fix emacs tagging race markwalters1009
2012-11-24 13:20 ` [PATCH v2 1/7] cli: allow query to come from stdin markwalters1009
2012-11-24 13:24 ` Mark Walters
2012-11-24 17:41 ` Austin Clements
2012-11-26 10:15 ` Mark Walters
2012-11-24 22:34 ` Tomi Ollila
2012-11-24 13:20 ` [PATCH v2 2/7] test: for the new query from stdin functionality markwalters1009
2012-11-24 13:20 ` [PATCH v2 3/7] emacs: notmuch.el split call-process into call-process-region markwalters1009
2012-11-24 13:20 ` [PATCH v2 4/7] emacs: make emacs tagging use the stdin query functionality markwalters1009
2012-11-24 22:09 ` Austin Clements
2012-11-24 13:20 ` [PATCH v2 5/7] test: test for race when tagging from emacs search markwalters1009
2012-11-24 13:20 ` [PATCH v2 6/7] cli: allow search mode to include msg-ids with JSON output markwalters1009
2012-11-24 22:30 ` Tomi Ollila [this message]
2012-11-25 0:23 ` Austin Clements
2012-11-24 13:20 ` [PATCH v2 7/7] emacs: make emacs use message-ids for tagging markwalters1009
2012-11-25 0:38 ` Austin Clements
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2624uk50s.fsf@guru.guru-group.fi \
--to=tomi.ollila@iki.fi \
--cc=markwalters1009@gmail.com \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).