unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: Johan Parin <johanparin@gmail.com>
To: notmuch@notmuchmail.org
Subject: Re: [PATCH] Display extra headers for emacs-mua - db config option
Date: Thu, 21 Nov 2019 22:56:04 +0100	[thread overview]
Message-ID: <m21ru0sxl7.fsf@gmail.com> (raw)
In-Reply-To: <m25zjdrsl7.fsf@gmail.com> (Johan Parin's message of "Thu, 21 Nov 2019 19:29:24 +0100")

[-- Attachment #1: Type: text/plain, Size: 553 bytes --]


Johan Parin <johanparin@gmail.com> writes:

> Daniel Kahn Gillmor <dkg@fifthhorseman.net> writes:
>>
>> Is it that much worse to pass around the notmuch_database_t *?
>>
>
> It has a lot of code impact, it really propagates to a lot of
> places. For instance it also impacts the json and text api, because
> those need to have the same signatures as the json api. Also the
> database needs to be opened in places where it's currently not opened,
> such as in notmuch_search_command().
>

Here is a taste (not fully tested, but seems to work).

/Johan


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Display-extra-headers-for-emacs-mua-db-config-option.patch --]
[-- Type: text/x-patch, Size: 23077 bytes --]

From 706a0f784a101b05ac82a462ff6c19c0cef550af Mon Sep 17 00:00:00 2001
From: Johan Parin <johan.parin@gmail.com>
Date: Sun, 17 Nov 2019 13:15:39 +0100
Subject: [PATCH] Display extra headers for emacs-mua - db config option

Modify format_headers_sprinter so that it returns some additional headers in the
sexp, instead of a small fixed set of headers.

The extra header list is configured by the database config option
`show.extra_headers'.

This is required in order for the elisp variable
`notmuch-message-headers' to work.

See this bug report:

  https://notmuchmail.org/pipermail/notmuch/2017/026069.html

This version avoids the file global notmuch database variable in
notmuch-show.c by passing around the database pointer in a lot of
function calls.
---
 doc/man1/notmuch-config.rst |   6 ++
 notmuch-client.h            |  12 ++--
 notmuch-config.c            |   7 ++-
 notmuch-reply.c             |  13 ++--
 notmuch-search.c            |  29 ++++++---
 notmuch-show.c              | 114 ++++++++++++++++++++++++++++--------
 sprinter-json.c             |   3 +-
 sprinter-sexp.c             |   3 +-
 sprinter-text.c             |  10 +++-
 sprinter.h                  |  12 ++--
 10 files changed, 155 insertions(+), 54 deletions(-)

diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst
index 28487079..0eb59883 100644
--- a/doc/man1/notmuch-config.rst
+++ b/doc/man1/notmuch-config.rst
@@ -204,6 +204,12 @@ The available configuration items are described below.
     supported. See **notmuch-search-terms(7)** for a list of existing
     prefixes, and an explanation of probabilistic prefixes.
 
+**show.extra_headers**
+    A list of extra headers that will be output by **notmuch show**
+    with ``--format=sexp``, if present in the message.
+
+    Default: empty list.
+
 **built_with.<name>**
     Compile time feature <name>. Current possibilities include
     "compact" (see **notmuch-compact(1)**) and "field_processor" (see
diff --git a/notmuch-client.h b/notmuch-client.h
index 74690054..d4402231 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -64,8 +64,10 @@ struct sprinter;
 struct notmuch_show_params;
 
 typedef struct notmuch_show_format {
-    struct sprinter *(*new_sprinter)(const void *ctx, FILE *stream);
-    notmuch_status_t (*part)(const void *ctx, struct sprinter *sprinter,
+    struct sprinter *(*new_sprinter)(notmuch_database_t *notmuch,
+				     const void *ctx, FILE *stream);
+    notmuch_status_t (*part)(notmuch_database_t *notmuch,
+			     const void *ctx, struct sprinter *sprinter,
 			     struct mime_node *node, int indent,
 			     const struct notmuch_show_params *params);
 } notmuch_show_format_t;
@@ -227,12 +229,14 @@ notmuch_status_t
 show_one_part (const char *filename, int part);
 
 void
-format_part_sprinter (const void *ctx, struct sprinter *sp, mime_node_t *node,
+format_part_sprinter (notmuch_database_t *notmuch,
+		      const void *ctx, struct sprinter *sp, mime_node_t *node,
 		      bool output_body,
 		      bool include_html);
 
 void
-format_headers_sprinter (struct sprinter *sp, GMimeMessage *message,
+format_headers_sprinter (notmuch_database_t *notmuch,
+			 struct sprinter *sp, GMimeMessage *message,
 			 bool reply, const _notmuch_message_crypto_t *msg_crypto);
 
 typedef enum {
diff --git a/notmuch-config.c b/notmuch-config.c
index 1b079e85..6554ad9b 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -841,9 +841,10 @@ typedef struct config_key {
 
 static struct config_key
     config_key_table[] = {
-    { "index.decrypt",   true,   false,  NULL },
-    { "index.header.",   true,   true,   validate_field_name },
-    { "query.",          true,   true,   NULL },
+    { "index.decrypt",      true,   false,  NULL },
+    { "index.header.",      true,   true,   validate_field_name },
+    { "query.",             true,   true,   NULL },
+    { "show.extra_headers", true,   false,  NULL }
 };
 
 static config_key_info_t *
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 2c30f6f9..5d468c88 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -614,7 +614,8 @@ enum {
 };
 
 static int
-do_reply (notmuch_config_t *config,
+do_reply (notmuch_database_t *notmuch,
+	  notmuch_config_t *config,
 	  notmuch_query_t *query,
 	  notmuch_show_params_t *params,
 	  int format,
@@ -640,9 +641,9 @@ do_reply (notmuch_config_t *config,
 	}
 
 	if (format == FORMAT_JSON)
-	    sp = sprinter_json_create (config, stdout);
+	    sp = sprinter_json_create (notmuch, config, stdout);
 	else
-	    sp = sprinter_sexp_create (config, stdout);
+	    sp = sprinter_sexp_create (notmuch, config, stdout);
     }
 
     status = notmuch_query_search_messages (query, &messages);
@@ -670,11 +671,11 @@ do_reply (notmuch_config_t *config,
 	    sp->map_key (sp, "reply-headers");
 	    /* FIXME: send msg_crypto here to avoid killing the
 	     * subject line on reply to encrypted messages! */
-	    format_headers_sprinter (sp, reply, true, NULL);
+	    format_headers_sprinter (notmuch, sp, reply, true, NULL);
 
 	    /* Start the original */
 	    sp->map_key (sp, "original");
-	    format_part_sprinter (config, sp, node, true, false);
+	    format_part_sprinter (notmuch, config, sp, node, true, false);
 
 	    /* End */
 	    sp->end (sp);
@@ -765,7 +766,7 @@ notmuch_reply_command (notmuch_config_t *config, int argc, char *argv[])
 	return EXIT_FAILURE;
     }
 
-    if (do_reply (config, query, &params, format, reply_all) != 0)
+    if (do_reply (notmuch, config, query, &params, format, reply_all) != 0)
 	return EXIT_FAILURE;
 
     _notmuch_crypto_cleanup (&params.crypto);
diff --git a/notmuch-search.c b/notmuch-search.c
index fd0b58c5..4a025530 100644
--- a/notmuch-search.c
+++ b/notmuch-search.c
@@ -673,7 +673,8 @@ do_search_tags (const search_context_t *ctx)
 }
 
 static int
-_notmuch_search_prepare (search_context_t *ctx, notmuch_config_t *config, int argc, char *argv[])
+_notmuch_search_prepare (notmuch_database_t *notmuch, search_context_t *ctx,
+			 notmuch_config_t *config, int argc, char *argv[])
 {
     char *query_str;
     unsigned int i;
@@ -681,20 +682,20 @@ _notmuch_search_prepare (search_context_t *ctx, notmuch_config_t *config, int ar
 
     switch (ctx->format_sel) {
     case NOTMUCH_FORMAT_TEXT:
-	ctx->format = sprinter_text_create (config, stdout);
+	ctx->format = sprinter_text_create (notmuch, config, stdout);
 	break;
     case NOTMUCH_FORMAT_TEXT0:
 	if (ctx->output == OUTPUT_SUMMARY) {
 	    fprintf (stderr, "Error: --format=text0 is not compatible with --output=summary.\n");
 	    return EXIT_FAILURE;
 	}
-	ctx->format = sprinter_text0_create (config, stdout);
+	ctx->format = sprinter_text0_create (notmuch, config, stdout);
 	break;
     case NOTMUCH_FORMAT_JSON:
-	ctx->format = sprinter_json_create (config, stdout);
+	ctx->format = sprinter_json_create (notmuch, config, stdout);
 	break;
     case NOTMUCH_FORMAT_SEXP:
-	ctx->format = sprinter_sexp_create (config, stdout);
+	ctx->format = sprinter_sexp_create (notmuch, config, stdout);
 	break;
     default:
 	/* this should never happen */
@@ -803,6 +804,7 @@ static const notmuch_opt_desc_t common_options[] = {
 int
 notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
 {
+    notmuch_database_t *notmuch;
     search_context_t *ctx = &search_context;
     int opt_index, ret;
 
@@ -841,10 +843,16 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
 	return EXIT_FAILURE;
     }
 
-    if (_notmuch_search_prepare (ctx, config,
+    if (notmuch_database_open (notmuch_config_get_database_path (config),
+			       NOTMUCH_DATABASE_MODE_READ_ONLY, &notmuch))
+	return EXIT_FAILURE;
+
+    if (_notmuch_search_prepare (notmuch, ctx, config,
 				 argc - opt_index, argv + opt_index))
 	return EXIT_FAILURE;
 
+    notmuch_database_destroy (notmuch);
+
     switch (ctx->output) {
     case OUTPUT_SUMMARY:
     case OUTPUT_THREADS:
@@ -869,6 +877,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
 int
 notmuch_address_command (notmuch_config_t *config, int argc, char *argv[])
 {
+    notmuch_database_t *notmuch;
     search_context_t *ctx = &search_context;
     int opt_index, ret;
 
@@ -907,10 +916,16 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[])
 	return EXIT_FAILURE;
     }
 
-    if (_notmuch_search_prepare (ctx, config,
+    if (notmuch_database_open (notmuch_config_get_database_path (config),
+			       NOTMUCH_DATABASE_MODE_READ_ONLY, &notmuch))
+	return EXIT_FAILURE;
+
+    if (_notmuch_search_prepare (notmuch, ctx, config,
 				 argc - opt_index, argv + opt_index))
 	return EXIT_FAILURE;
 
+    notmuch_database_destroy (notmuch);
+
     ctx->addresses = g_hash_table_new_full (strcase_hash, strcase_equal,
 					    _talloc_free_for_g_hash,
 					    _list_free_for_g_hash);
diff --git a/notmuch-show.c b/notmuch-show.c
index 21792a57..94d91aa6 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -18,11 +18,16 @@
  * Author: Carl Worth <cworth@cworth.org>
  */
 
+#include <string.h>
+
 #include "notmuch-client.h"
 #include "gmime-filter-reply.h"
 #include "sprinter.h"
 #include "zlib-extra.h"
 
+static notmuch_database_t *notmuch = NULL;
+
+
 static const char *
 _get_tags_as_string (const void *ctx, notmuch_message_t *message)
 {
@@ -195,8 +200,42 @@ _is_from_line (const char *line)
 	return 0;
 }
 
+/* Output extra headers if configured with the `show.extra_headers'
+ * database configuration option
+ */
 void
-format_headers_sprinter (sprinter_t *sp, GMimeMessage *message,
+format_extra_headers_sprinter (notmuch_database_t *notmuch,
+			       sprinter_t *sp, GMimeMessage *message)
+{
+    GMimeHeaderList *header_list;
+    GMimeHeader *header;
+    char *extra_headers, *tofree, *header_name;
+
+    if (notmuch == NULL)
+	return;
+
+    if (notmuch_database_get_config (notmuch, "show.extra_headers",
+				     &extra_headers) != NOTMUCH_STATUS_SUCCESS)
+	return;
+
+    header_list  = g_mime_object_get_header_list (GMIME_OBJECT(message));
+
+    tofree = extra_headers;
+    while ( (header_name = strsep(&extra_headers, ";")) != NULL) {
+
+	header = g_mime_header_list_get_header (header_list, header_name);
+	if (header == NULL)
+	    continue;
+
+	sp->map_key (sp, g_mime_header_get_name(header));
+	sp->string (sp, g_mime_header_get_value(header));
+    }
+    free (tofree);
+}
+
+void
+format_headers_sprinter (notmuch_database_t *notmuch,
+			 sprinter_t *sp, GMimeMessage *message,
 			 bool reply, const _notmuch_message_crypto_t *msg_crypto)
 {
     /* Any changes to the JSON or S-Expression format should be
@@ -253,6 +292,9 @@ format_headers_sprinter (sprinter_t *sp, GMimeMessage *message,
     } else {
 	sp->map_key (sp, "Date");
 	sp->string (sp, g_mime_message_get_date_string (sp, message));
+
+	/* Output extra headers the user has configured in the database, if any */
+	format_extra_headers_sprinter (notmuch, sp, message);
     }
 
     sp->end (sp);
@@ -486,7 +528,8 @@ format_part_sigstatus_sprinter (sprinter_t *sp, GMimeSignatureList *siglist)
 }
 
 static notmuch_status_t
-format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
+format_part_text (notmuch_database_t *notmuch,
+		  const void *ctx, sprinter_t *sp, mime_node_t *node,
 		  int indent, const notmuch_show_params_t *params)
 {
     /* The disposition and content-type metadata are associated with
@@ -499,6 +542,8 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
     const char *part_type;
     int i;
 
+    (void) notmuch;
+
     if (node->envelope_file) {
 	notmuch_message_t *message = node->envelope_file;
 
@@ -576,7 +621,8 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node,
     }
 
     for (i = 0; i < node->nchildren; i++)
-	format_part_text (ctx, sp, mime_node_child (node, i), indent, params);
+	format_part_text (notmuch, ctx, sp, mime_node_child (node, i),
+			  indent, params);
 
     if (GMIME_IS_MESSAGE (node->part))
 	g_mime_stream_printf (stream, "\fbody}\n");
@@ -610,7 +656,8 @@ format_omitted_part_meta_sprinter (sprinter_t *sp, GMimeObject *meta, GMimePart
 }
 
 void
-format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
+format_part_sprinter (notmuch_database_t *notmuch,
+		      const void *ctx, sprinter_t *sp, mime_node_t *node,
 		      bool output_body,
 		      bool include_html)
 {
@@ -625,7 +672,8 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
 	if (output_body) {
 	    sp->map_key (sp, "body");
 	    sp->begin_list (sp);
-	    format_part_sprinter (ctx, sp, mime_node_child (node, 0), true, include_html);
+	    format_part_sprinter (notmuch, ctx, sp, mime_node_child (node, 0),
+				  true, include_html);
 	    sp->end (sp);
 	}
 
@@ -679,7 +727,8 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
 	}
 
 	sp->map_key (sp, "headers");
-	format_headers_sprinter (sp, GMIME_MESSAGE (node->part), false, msg_crypto);
+	format_headers_sprinter (notmuch, sp, GMIME_MESSAGE (node->part),
+				 false, msg_crypto);
 
 	sp->end (sp);
 	return;
@@ -771,7 +820,8 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
 	sp->begin_map (sp);
 
 	sp->map_key (sp, "headers");
-	format_headers_sprinter (sp, GMIME_MESSAGE (node->part), false, NULL);
+	format_headers_sprinter (notmuch, sp, GMIME_MESSAGE (node->part),
+				 false, NULL);
 
 	sp->map_key (sp, "body");
 	sp->begin_list (sp);
@@ -779,7 +829,8 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
     }
 
     for (i = 0; i < node->nchildren; i++)
-	format_part_sprinter (ctx, sp, mime_node_child (node, i), true, include_html);
+	format_part_sprinter (notmuch, ctx, sp, mime_node_child (node, i),
+			      true, include_html);
 
     /* Close content structures */
     for (i = 0; i < nclose; i++)
@@ -789,11 +840,12 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
 }
 
 static notmuch_status_t
-format_part_sprinter_entry (const void *ctx, sprinter_t *sp,
+format_part_sprinter_entry (notmuch_database_t *notmuch,
+			    const void *ctx, sprinter_t *sp,
 			    mime_node_t *node, unused (int indent),
 			    const notmuch_show_params_t *params)
 {
-    format_part_sprinter (ctx, sp, node, params->output_body, params->include_html);
+    format_part_sprinter (notmuch, ctx, sp, node, params->output_body, params->include_html);
 
     return NOTMUCH_STATUS_SUCCESS;
 }
@@ -804,7 +856,8 @@ format_part_sprinter_entry (const void *ctx, sprinter_t *sp,
  * http://qmail.org/qmail-manual-html/man5/mbox.html
  */
 static notmuch_status_t
-format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
+format_part_mbox (notmuch_database_t *notmuch,
+		  const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
 		  unused (int indent),
 		  unused (const notmuch_show_params_t *params))
 {
@@ -822,6 +875,8 @@ format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
     ssize_t line_size;
     ssize_t line_len;
 
+    (void) notmuch;
+
     if (! message)
 	INTERNAL_ERROR ("format_part_mbox requires a root part");
 
@@ -856,10 +911,13 @@ format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
 }
 
 static notmuch_status_t
-format_part_raw (unused (const void *ctx), unused (sprinter_t *sp),
+format_part_raw (notmuch_database_t *notmuch,
+		 unused (const void *ctx), unused (sprinter_t *sp),
 		 mime_node_t *node, unused (int indent),
 		 const notmuch_show_params_t *params)
 {
+    (void) notmuch;
+
     if (node->envelope_file) {
 	/* Special case the entire message to avoid MIME parsing. */
 	const char *filename;
@@ -930,7 +988,8 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp),
 }
 
 static notmuch_status_t
-show_message (void *ctx,
+show_message (notmuch_database_t *notmuch,
+	      void *ctx,
 	      const notmuch_show_format_t *format,
 	      sprinter_t *sp,
 	      notmuch_message_t *message,
@@ -951,7 +1010,7 @@ show_message (void *ctx,
 	goto DONE;
     part = mime_node_seek_dfs (root, (params->part < 0 ? 0 : params->part));
     if (part)
-	status = format->part (local, sp, part, indent, params);
+	status = format->part (notmuch, local, sp, part, indent, params);
     if (params->crypto.decrypt == NOTMUCH_DECRYPT_TRUE && session_key_count_error == NOTMUCH_STATUS_SUCCESS) {
 	unsigned int new_session_keys = 0;
 	if (notmuch_message_count_properties (message, "session-key", &new_session_keys) == NOTMUCH_STATUS_SUCCESS &&
@@ -971,7 +1030,8 @@ show_message (void *ctx,
 }
 
 static notmuch_status_t
-show_messages (void *ctx,
+show_messages (notmuch_database_t *notmuch,
+	       void *ctx,
 	       const notmuch_show_format_t *format,
 	       sprinter_t *sp,
 	       notmuch_messages_t *messages,
@@ -999,7 +1059,8 @@ show_messages (void *ctx,
 	next_indent = indent;
 
 	if ((match && (! excluded || ! params->omit_excluded)) || params->entire_thread) {
-	    status = show_message (ctx, format, sp, message, indent, params);
+	    status = show_message (notmuch, ctx, format, sp, message, indent,
+				   params);
 	    if (status && ! res)
 		res = status;
 	    next_indent = indent + 1;
@@ -1007,7 +1068,8 @@ show_messages (void *ctx,
 	    sp->null (sp);
 	}
 
-	status = show_messages (ctx,
+	status = show_messages (notmuch,
+				ctx,
 				format, sp,
 				notmuch_message_get_replies (message),
 				next_indent,
@@ -1027,7 +1089,8 @@ show_messages (void *ctx,
 
 /* Formatted output of single message */
 static int
-do_show_single (void *ctx,
+do_show_single (notmuch_database_t *notmuch,
+		void *ctx,
 		notmuch_query_t *query,
 		const notmuch_show_format_t *format,
 		sprinter_t *sp,
@@ -1060,13 +1123,14 @@ do_show_single (void *ctx,
 
     notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH, 1);
 
-    return show_message (ctx, format, sp, message, 0, params)
+    return show_message (notmuch, ctx, format, sp, message, 0, params)
 	   != NOTMUCH_STATUS_SUCCESS;
 }
 
 /* Formatted output of threads */
 static int
-do_show (void *ctx,
+do_show (notmuch_database_t *notmuch,
+	 void *ctx,
 	 notmuch_query_t *query,
 	 const notmuch_show_format_t *format,
 	 sprinter_t *sp,
@@ -1094,7 +1158,7 @@ do_show (void *ctx,
 	    INTERNAL_ERROR ("Thread %s has no toplevel messages.\n",
 			    notmuch_thread_get_thread_id (thread));
 
-	status = show_messages (ctx, format, sp, messages, 0, params);
+	status = show_messages (notmuch, ctx, format, sp, messages, 0, params);
 	if (status && ! res)
 	    res = status;
 
@@ -1152,7 +1216,6 @@ static const notmuch_show_format_t *formatters[] = {
 int
 notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
 {
-    notmuch_database_t *notmuch;
     notmuch_query_t *query;
     char *query_string;
     int opt_index, ret;
@@ -1284,13 +1347,14 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
 
     /* Create structure printer. */
     formatter = formatters[format];
-    sprinter = formatter->new_sprinter (config, stdout);
+    sprinter = formatter->new_sprinter (notmuch, config, stdout);
 
     params.out_stream = g_mime_stream_stdout_new ();
 
     /* If a single message is requested we do not use search_excludes. */
     if (single_message) {
-	ret = do_show_single (config, query, formatter, sprinter, &params);
+	ret = do_show_single (notmuch, config, query, formatter, sprinter,
+			      &params);
     } else {
 	/* We always apply set the exclude flag. The
 	 * exclude=true|false option controls whether or not we return
@@ -1317,7 +1381,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
 	    params.omit_excluded = false;
 	}
 
-	ret = do_show (config, query, formatter, sprinter, &params);
+	ret = do_show (notmuch, config, query, formatter, sprinter, &params);
     }
 
   DONE:
diff --git a/sprinter-json.c b/sprinter-json.c
index c6ec8577..8f718e6c 100644
--- a/sprinter-json.c
+++ b/sprinter-json.c
@@ -171,7 +171,8 @@ json_separator (struct sprinter *sp)
 }
 
 struct sprinter *
-sprinter_json_create (const void *ctx, FILE *stream)
+sprinter_json_create (notmuch_database_t *notmuch, const void *ctx,
+		      FILE *stream)
 {
     static const struct sprinter_json template = {
 	.vtable = {
diff --git a/sprinter-sexp.c b/sprinter-sexp.c
index 6891ea42..2e6b1174 100644
--- a/sprinter-sexp.c
+++ b/sprinter-sexp.c
@@ -206,7 +206,8 @@ sexp_separator (struct sprinter *sp)
 }
 
 struct sprinter *
-sprinter_sexp_create (const void *ctx, FILE *stream)
+sprinter_sexp_create (notmuch_database_t *notmuch, const void *ctx,
+		      FILE *stream)
 {
     static const struct sprinter_sexp template = {
 	.vtable = {
diff --git a/sprinter-text.c b/sprinter-text.c
index 648b54b1..201bbe12 100644
--- a/sprinter-text.c
+++ b/sprinter-text.c
@@ -113,7 +113,8 @@ text_map_key (unused (struct sprinter *sp), unused (const char *key))
 }
 
 struct sprinter *
-sprinter_text_create (const void *ctx, FILE *stream)
+sprinter_text_create (notmuch_database_t *notmuch, const void *ctx,
+		      FILE *stream)
 {
     static const struct sprinter_text template = {
 	.vtable = {
@@ -133,6 +134,8 @@ sprinter_text_create (const void *ctx, FILE *stream)
     };
     struct sprinter_text *res;
 
+    (void) notmuch;
+
     res = talloc (ctx, struct sprinter_text);
     if (! res)
 	return NULL;
@@ -143,11 +146,12 @@ sprinter_text_create (const void *ctx, FILE *stream)
 }
 
 struct sprinter *
-sprinter_text0_create (const void *ctx, FILE *stream)
+sprinter_text0_create (notmuch_database_t *notmuch, const void *ctx,
+		       FILE *stream)
 {
     struct sprinter *sp;
 
-    sp = sprinter_text_create (ctx, stream);
+    sp = sprinter_text_create (notmuch, ctx, stream);
     if (! sp)
 	return NULL;
 
diff --git a/sprinter.h b/sprinter.h
index 182b1a8b..20f32e1c 100644
--- a/sprinter.h
+++ b/sprinter.h
@@ -65,20 +65,24 @@ typedef struct sprinter {
 /* Create a new unstructured printer that emits the default text format
  * for "notmuch search". */
 struct sprinter *
-sprinter_text_create (const void *ctx, FILE *stream);
+sprinter_text_create (notmuch_database_t *notmuch, const void *ctx,
+		      FILE *stream);
 
 /* Create a new unstructured printer that emits the text format for
  * "notmuch search", with each field separated by a null character
  * instead of the newline character. */
 struct sprinter *
-sprinter_text0_create (const void *ctx, FILE *stream);
+sprinter_text0_create (notmuch_database_t *notmuch, const void *ctx,
+		       FILE *stream);
 
 /* Create a new structure printer that emits JSON. */
 struct sprinter *
-sprinter_json_create (const void *ctx, FILE *stream);
+sprinter_json_create (notmuch_database_t *notmuch, const void *ctx,
+		      FILE *stream);
 
 /* Create a new structure printer that emits S-Expressions. */
 struct sprinter *
-sprinter_sexp_create (const void *ctx, FILE *stream);
+sprinter_sexp_create (notmuch_database_t *notmuch, const void *ctx,
+		      FILE *stream);
 
 #endif // NOTMUCH_SPRINTER_H
-- 
2.21.0 (Apple Git-122)


  reply	other threads:[~2019-11-21 21:56 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-16 16:27 [PATCH] Display extra headers for emacs-mua - db config option Johan Parin
2019-11-16 16:35 ` Tomi Ollila
2019-11-16 16:53 ` Johan Parin
2019-11-21  2:48 ` Daniel Kahn Gillmor
2019-11-21 12:16   ` David Bremner
2019-11-21 18:29   ` Johan Parin
2019-11-21 21:56     ` Johan Parin [this message]
2019-11-22  2:51       ` Daniel Kahn Gillmor
2019-11-22 17:46       ` Carl Worth
2019-11-21 12:27 ` David Bremner
2019-11-21 19:47   ` Daniel Kahn Gillmor
2019-11-21 21:38     ` Tomi Ollila
2019-11-22  2:43       ` moving the config into the database [was: Re: [PATCH] Display extra headers for emacs-mua - db config option] Daniel Kahn Gillmor
2019-12-08 16:47         ` Jorge P. de Morais Neto
2019-12-08 17:12           ` Jameson Graef Rollins
2019-12-08 18:19             ` Jorge P. de Morais Neto
2019-12-09 18:31               ` Daniel Kahn Gillmor
2019-12-10 12:46                 ` Jorge P. de Morais Neto
2019-12-10 17:01                   ` Daniel Kahn Gillmor
2019-12-12 11:59                     ` Jorge P. de Morais Neto
2019-12-10 16:11               ` Jameson Graef Rollins
2019-12-11 10:53                 ` David Edmondson
2019-12-11 14:00                   ` David Bremner
2019-12-11 14:21                     ` David Edmondson
2019-12-12 16:25                     ` Daniel Kahn Gillmor

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=m21ru0sxl7.fsf@gmail.com \
    --to=johanparin@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).