unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide
@ 2012-04-24  9:11 Mark Walters
  2012-04-24  9:11 ` [PATCH v4 1/4] cli: Let json output "null" messages for non --entire-thread Mark Walters
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Mark Walters @ 2012-04-24  9:11 UTC (permalink / raw)
  To: notmuch

This is version 4 of this patch set (previous version at [1]) which
removes the --entire-thread constraint from json output in
notmuch-show, and then uses to implement the emacs elide
functionality.

Changes from the previous version: 

	split the cli patch 

	update devel/schemata 

	output "null" rather than "{}" for a null message and do so
	using a format string remove this feature

	from devel/TODO

The first three patches implement the client side changes: one to
allow null messages to be output in Json (without upsetting the
parsing/structure), one to do the command line parsing for
--entire-thread=false and one to update the schemata.

The final emacs patch is independent (and the first three make sense
without it) and uses this new functionality to implement the elide
option.

I think this addresses all review comments

Best wishes

Mark

[1] id:"1334999750-21811-1-git-send-email-markwalters1009@gmail.com"

Mark Walters (4):
  cli: Let json output "null" messages for non --entire-thread
  cli: make --entire-thread=false work for format=json.
  Update devel/schemata for --entire-thread=false
  emacs: make elide messages use notmuch-show for omitting messages.

 devel/TODO            |    2 --
 devel/schemata        |    2 +-
 emacs/notmuch-show.el |   18 ++++++++++--------
 notmuch-client.h      |    1 +
 notmuch-show.c        |   36 ++++++++++++++++++++++++++++++------
 5 files changed, 42 insertions(+), 17 deletions(-)

-- 
1.7.9.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v4 1/4] cli: Let json output "null" messages for non --entire-thread
  2012-04-24  9:11 [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Mark Walters
@ 2012-04-24  9:11 ` Mark Walters
  2012-04-24  9:11 ` [PATCH v4 2/4] cli: make --entire-thread=false work for format=json Mark Walters
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Mark Walters @ 2012-04-24  9:11 UTC (permalink / raw)
  To: notmuch

All formats except Json can output empty messages for non
entire-thread, but in Json format we output "null" to keep the other
elements (e.g. the replies to the omitted message) in the correct
place.
---
 notmuch-client.h |    1 +
 notmuch-show.c   |   20 ++++++++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index 19b7f01..08540a7 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -72,6 +72,7 @@ typedef struct notmuch_show_format {
 			      const struct notmuch_show_params *params);
     const char *message_set_sep;
     const char *message_set_end;
+    const char *null_message;
 } notmuch_show_format_t;
 
 typedef struct notmuch_show_params {
diff --git a/notmuch-show.c b/notmuch-show.c
index da4a797..0d21f1a 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -37,7 +37,8 @@ static const notmuch_show_format_t format_json = {
     .message_set_start = "[",
     .part = format_part_json_entry,
     .message_set_sep = ", ",
-    .message_set_end = "]"
+    .message_set_end = "]",
+    .null_message = "null"
 };
 
 static notmuch_status_t
@@ -800,6 +801,15 @@ format_part_raw (unused (const void *ctx), mime_node_t *node,
 }
 
 static notmuch_status_t
+show_null_message (const notmuch_show_format_t *format)
+{
+    /* Output a null message. Currently empty for all formats except Json */
+    if (format->null_message)
+	printf ("%s", format->null_message);
+    return NOTMUCH_STATUS_SUCCESS;
+}
+
+static notmuch_status_t
 show_message (void *ctx,
 	      const notmuch_show_format_t *format,
 	      notmuch_message_t *message,
@@ -862,11 +872,13 @@ show_messages (void *ctx,
 	    if (status && !res)
 		res = status;
 	    next_indent = indent + 1;
-
-	    if (!status && format->message_set_sep)
-		fputs (format->message_set_sep, stdout);
+	} else {
+	    status = show_null_message (format);
 	}
 
+	if (!status && format->message_set_sep)
+	    fputs (format->message_set_sep, stdout);
+
 	status = show_messages (ctx,
 				format,
 				notmuch_message_get_replies (message),
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 2/4] cli: make --entire-thread=false work for format=json.
  2012-04-24  9:11 [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Mark Walters
  2012-04-24  9:11 ` [PATCH v4 1/4] cli: Let json output "null" messages for non --entire-thread Mark Walters
@ 2012-04-24  9:11 ` Mark Walters
  2012-05-26  2:15   ` Peter Wang
  2012-04-24  9:11 ` [PATCH v4 3/4] Update devel/schemata for --entire-thread=false Mark Walters
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Mark Walters @ 2012-04-24  9:11 UTC (permalink / raw)
  To: notmuch

The --entire-thread option in notmuch-show.c defaults to true when
format=json. Previously there was no way to turn this off. This patch
makes it respect --entire-thread=false.

The one subtlety is that we initialise a notmuch_bool_t to -1 to
indicate that the option parsing has not set it. This allows the code
to distinguish between the option being omitted from the command line,
and the option being set to false on the command line.
---
 notmuch-show.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/notmuch-show.c b/notmuch-show.c
index 0d21f1a..48551bb 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -996,7 +996,13 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
     char *query_string;
     int opt_index, ret;
     const notmuch_show_format_t *format = &format_text;
-    notmuch_show_params_t params = { .part = -1, .omit_excluded = TRUE };
+
+    /* We abuse the notmuch_bool_t variable params.entire-thread by
+     * setting it to -1 to denote that the command line parsing has
+     * not set it. We ensure it is set to TRUE or FALSE before passing
+     * it to any other function.*/
+    notmuch_show_params_t params = { .part = -1, .entire_thread = -1 };
+
     int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
     notmuch_bool_t verify = FALSE;
     int exclude = EXCLUDE_TRUE;
@@ -1036,7 +1042,9 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
     switch (format_sel) {
     case NOTMUCH_FORMAT_JSON:
 	format = &format_json;
-	params.entire_thread = TRUE;
+	/* JSON defaults to entire-thread TRUE */
+	if (params.entire_thread == -1)
+	    params.entire_thread = TRUE;
 	break;
     case NOTMUCH_FORMAT_TEXT:
 	format = &format_text;
@@ -1058,6 +1066,10 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
 	params.raw = TRUE;
 	break;
     }
+    /* Default is entire-thread = FALSE except for format=json which
+     * is dealt with above. */
+    if (params.entire_thread == -1)
+	params.entire_thread = FALSE;
 
     if (params.decrypt || verify) {
 #ifdef GMIME_ATLEAST_26
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 3/4] Update devel/schemata for --entire-thread=false
  2012-04-24  9:11 [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Mark Walters
  2012-04-24  9:11 ` [PATCH v4 1/4] cli: Let json output "null" messages for non --entire-thread Mark Walters
  2012-04-24  9:11 ` [PATCH v4 2/4] cli: make --entire-thread=false work for format=json Mark Walters
@ 2012-04-24  9:11 ` Mark Walters
  2012-04-24  9:11 ` [PATCH v4 4/4] emacs: make elide messages use notmuch-show for omitting messages Mark Walters
  2012-05-27 22:30 ` [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Daniel Schoepe
  4 siblings, 0 replies; 9+ messages in thread
From: Mark Walters @ 2012-04-24  9:11 UTC (permalink / raw)
  To: notmuch

Also remove the Json --entire-thread item from devel/TODO.
---
 devel/TODO     |    2 --
 devel/schemata |    2 +-
 2 files changed, 1 insertions(+), 3 deletions(-)

diff --git a/devel/TODO b/devel/TODO
index 7b750af..eb757af 100644
--- a/devel/TODO
+++ b/devel/TODO
@@ -92,8 +92,6 @@ and email address in the From: line. We could also then easily support
 "notmuch compose --from <something>" to support getting at alternate
 email addresses.
 
-Fix the --format=json option to not imply --entire-thread.
-
 Implement "notmuch search --exclude-threads=<search-terms>" to allow
 for excluding muted threads, (and any other negative, thread-based
 filtering that the user wants to do).
diff --git a/devel/schemata b/devel/schemata
index 977cea7..8fcab8e 100644
--- a/devel/schemata
+++ b/devel/schemata
@@ -32,7 +32,7 @@ thread = [thread_node*]
 
 # A message and its replies (show_messages)
 thread_node = [
-    message?,                 # present if --entire-thread or matched
+    message?,                 # null if not matched and not --entire-thread
     [thread_node*]            # children of message
 ]
 
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 4/4] emacs: make elide messages use notmuch-show for omitting messages.
  2012-04-24  9:11 [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Mark Walters
                   ` (2 preceding siblings ...)
  2012-04-24  9:11 ` [PATCH v4 3/4] Update devel/schemata for --entire-thread=false Mark Walters
@ 2012-04-24  9:11 ` Mark Walters
  2012-05-27 22:30 ` [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Daniel Schoepe
  4 siblings, 0 replies; 9+ messages in thread
From: Mark Walters @ 2012-04-24  9:11 UTC (permalink / raw)
  To: notmuch

Previously the elide messages code got the entire-thread from
notmuch-show.c and then threw away all non-matching messages. This
version calls notmuch-show.c without the --entire-thread flag so
it never receives the non-matching messages in the first place.

This makes it substantially faster.
---
 emacs/notmuch-show.el |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 4ee4290..347f90c 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -976,9 +976,9 @@ current buffer, if possible."
   "Insert the message tree TREE at depth DEPTH in the current thread."
   (let ((msg (car tree))
 	(replies (cadr tree)))
-    (if (or (not notmuch-show-elide-non-matching-messages)
-	    (plist-get msg :match))
-	(notmuch-show-insert-msg msg depth))
+    ;; We test whether there is a message or just some replies.
+    (when msg
+      (notmuch-show-insert-msg msg depth))
     (notmuch-show-insert-thread replies (1+ depth))))
 
 (defun notmuch-show-insert-thread (thread depth)
@@ -1059,16 +1059,18 @@ function is used."
 	     (args (if notmuch-show-query-context
 		       (append (list "\'") basic-args
 			       (list "and (" notmuch-show-query-context ")\'"))
-		     (append (list "\'") basic-args (list "\'")))))
-	(notmuch-show-insert-forest (notmuch-query-get-threads
-				     (cons "--exclude=false" args)))
+		     (append (list "\'") basic-args (list "\'"))))
+	     (cli-args (cons "--exclude=false"
+			     (when notmuch-show-elide-non-matching-messages
+			       (list "--entire-thread=false")))))
+
+	(notmuch-show-insert-forest (notmuch-query-get-threads (append cli-args args)))
 	;; If the query context reduced the results to nothing, run
 	;; the basic query.
 	(when (and (eq (buffer-size) 0)
 		   notmuch-show-query-context)
 	  (notmuch-show-insert-forest
-	   (notmuch-query-get-threads
-	    (cons "--exclude=false" basic-args)))))
+	   (notmuch-query-get-threads (append cli-args basic-args)))))
 
       (jit-lock-register #'notmuch-show-buttonise-links)
 
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 2/4] cli: make --entire-thread=false work for format=json.
  2012-04-24  9:11 ` [PATCH v4 2/4] cli: make --entire-thread=false work for format=json Mark Walters
@ 2012-05-26  2:15   ` Peter Wang
  2012-05-26  8:28     ` Mark Walters
  0 siblings, 1 reply; 9+ messages in thread
From: Peter Wang @ 2012-05-26  2:15 UTC (permalink / raw)
  To: notmuch

On Tue, 24 Apr 2012 10:11:13 +0100, Mark Walters <markwalters1009@gmail.com> wrote:
> The --entire-thread option in notmuch-show.c defaults to true when
> format=json. Previously there was no way to turn this off. This patch
> makes it respect --entire-thread=false.
> 
> The one subtlety is that we initialise a notmuch_bool_t to -1 to
> indicate that the option parsing has not set it. This allows the code
> to distinguish between the option being omitted from the command line,
> and the option being set to false on the command line.
> ---
>  notmuch-show.c |   16 ++++++++++++++--
>  1 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/notmuch-show.c b/notmuch-show.c
> index 0d21f1a..48551bb 100644
> --- a/notmuch-show.c
> +++ b/notmuch-show.c
> @@ -996,7 +996,13 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
>      char *query_string;
>      int opt_index, ret;
>      const notmuch_show_format_t *format = &format_text;
> -    notmuch_show_params_t params = { .part = -1, .omit_excluded = TRUE };
> +
> +    /* We abuse the notmuch_bool_t variable params.entire-thread by
> +     * setting it to -1 to denote that the command line parsing has
> +     * not set it. We ensure it is set to TRUE or FALSE before passing
> +     * it to any other function.*/
> +    notmuch_show_params_t params = { .part = -1, .entire_thread = -1 };
> +
>      int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
>      notmuch_bool_t verify = FALSE;
>      int exclude = EXCLUDE_TRUE;

Hi Mark,

As an alternative to the abuse, could you just treat it as with exclude,
using an enum with three values (TRUE|FALSE|DEFAULT)?
Then set params.entire_thread afterwards.

Peter

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 2/4] cli: make --entire-thread=false work for format=json.
  2012-05-26  2:15   ` Peter Wang
@ 2012-05-26  8:28     ` Mark Walters
  2012-05-26 13:31       ` David Bremner
  0 siblings, 1 reply; 9+ messages in thread
From: Mark Walters @ 2012-05-26  8:28 UTC (permalink / raw)
  To: Peter Wang, notmuch


On Sat, 26 May 2012, Peter Wang <novalazy@gmail.com> wrote:
> On Tue, 24 Apr 2012 10:11:13 +0100, Mark Walters <markwalters1009@gmail.com> wrote:
>> The --entire-thread option in notmuch-show.c defaults to true when
>> format=json. Previously there was no way to turn this off. This patch
>> makes it respect --entire-thread=false.
>> 
>> The one subtlety is that we initialise a notmuch_bool_t to -1 to
>> indicate that the option parsing has not set it. This allows the code
>> to distinguish between the option being omitted from the command line,
>> and the option being set to false on the command line.
>> ---
>>  notmuch-show.c |   16 ++++++++++++++--
>>  1 files changed, 14 insertions(+), 2 deletions(-)
>> 
>> diff --git a/notmuch-show.c b/notmuch-show.c
>> index 0d21f1a..48551bb 100644
>> --- a/notmuch-show.c
>> +++ b/notmuch-show.c
>> @@ -996,7 +996,13 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
>>      char *query_string;
>>      int opt_index, ret;
>>      const notmuch_show_format_t *format = &format_text;
>> -    notmuch_show_params_t params = { .part = -1, .omit_excluded = TRUE };
>> +
>> +    /* We abuse the notmuch_bool_t variable params.entire-thread by
>> +     * setting it to -1 to denote that the command line parsing has
>> +     * not set it. We ensure it is set to TRUE or FALSE before passing
>> +     * it to any other function.*/
>> +    notmuch_show_params_t params = { .part = -1, .entire_thread = -1 };
>> +
>>      int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
>>      notmuch_bool_t verify = FALSE;
>>      int exclude = EXCLUDE_TRUE;
>
> Hi Mark,
>
> As an alternative to the abuse, could you just treat it as with exclude,
> using an enum with three values (TRUE|FALSE|DEFAULT)?
> Then set params.entire_thread afterwards.

The reason I haven't done this is that the current command line parser
does not allow keyword options to take default values: in other words
--entire-thread without an "=<something>" would not be allowed.

It is easy to change the keyword parsing code to allow this: I include a
first draft of such a patch below. This would allow the solution you
suggest and thus avoid the hack/abuse.  What do people think?

Best wishes

Mark


---
 command-line-arguments.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/command-line-arguments.c b/command-line-arguments.c
index 76b185f..d40c7e6 100644
--- a/command-line-arguments.c
+++ b/command-line-arguments.c
@@ -11,10 +11,16 @@
 */
 
 static notmuch_bool_t
-_process_keyword_arg (const notmuch_opt_desc_t *arg_desc, const char *arg_str) {
+_process_keyword_arg (const notmuch_opt_desc_t *arg_desc, char next, const char *arg_str) {
 
     const notmuch_keyword_t *keywords = arg_desc->keywords;
 
+    if (next == 0) {
+/* No keyword given so return first option as default */
+	*((int *)arg_desc->output_var) = keywords->value;
+	return TRUE;
+    }
+
     while (keywords->name) {
 	if (strcmp (arg_str, keywords->name) == 0) {
 	    if (arg_desc->output_var) {
@@ -99,7 +105,8 @@ parse_option (const char *arg,
 	     */
 	    if (next != '=' && next != ':' && next != 0) return FALSE;
 	    if (next == 0) {
-		if (try->opt_type != NOTMUCH_OPT_BOOLEAN)
+		if (try->opt_type != NOTMUCH_OPT_BOOLEAN &&
+		    try->opt_type != NOTMUCH_OPT_KEYWORD)
 		    return FALSE;
 	    } else {
 		if (value[0] == 0) return FALSE;
@@ -110,7 +117,7 @@ parse_option (const char *arg,
 
 	    switch (try->opt_type) {
 	    case NOTMUCH_OPT_KEYWORD:
-		return _process_keyword_arg (try, value);
+		return _process_keyword_arg (try, next, value);
 		break;
 	    case NOTMUCH_OPT_BOOLEAN:
 		return _process_boolean_arg (try, next, value);
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 2/4] cli: make --entire-thread=false work for format=json.
  2012-05-26  8:28     ` Mark Walters
@ 2012-05-26 13:31       ` David Bremner
  0 siblings, 0 replies; 9+ messages in thread
From: David Bremner @ 2012-05-26 13:31 UTC (permalink / raw)
  To: Mark Walters, Peter Wang, notmuch

Mark Walters <markwalters1009@gmail.com> writes:

> On Sat, 26 May 2012, Peter Wang <novalazy@gmail.com> wrote:
>> On Tue, 24 Apr 2012 10:11:13 +0100, Mark Walters <markwalters1009@gmail.com> wrote:
>
> It is easy to change the keyword parsing code to allow this: I include a
> first draft of such a patch below. This would allow the solution you
> suggest and thus avoid the hack/abuse.  What do people think?
>

It didn't carefully review it, but it looks sane enough at a quick
glance.

d

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide
  2012-04-24  9:11 [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Mark Walters
                   ` (3 preceding siblings ...)
  2012-04-24  9:11 ` [PATCH v4 4/4] emacs: make elide messages use notmuch-show for omitting messages Mark Walters
@ 2012-05-27 22:30 ` Daniel Schoepe
  4 siblings, 0 replies; 9+ messages in thread
From: Daniel Schoepe @ 2012-05-27 22:30 UTC (permalink / raw)
  To: Mark Walters, notmuch

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

On Tue, 24.04.2012 11:11, Mark Walters wrote:
> The first three patches implement the client side changes: one to
> allow null messages to be output in Json (without upsetting the
> parsing/structure), one to do the command line parsing for
> --entire-thread=false and one to update the schemata.
>
> The final emacs patch is independent (and the first three make sense
> without it) and uses this new functionality to implement the elide
> option.
>
> I think this addresses all review comments

LGTM (all four patches). I think both version of the command line
parsing patch would be acceptable, but the second one seems cleaner to
me.

Cheers,
Daniel

[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-05-27 22:30 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-24  9:11 [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Mark Walters
2012-04-24  9:11 ` [PATCH v4 1/4] cli: Let json output "null" messages for non --entire-thread Mark Walters
2012-04-24  9:11 ` [PATCH v4 2/4] cli: make --entire-thread=false work for format=json Mark Walters
2012-05-26  2:15   ` Peter Wang
2012-05-26  8:28     ` Mark Walters
2012-05-26 13:31       ` David Bremner
2012-04-24  9:11 ` [PATCH v4 3/4] Update devel/schemata for --entire-thread=false Mark Walters
2012-04-24  9:11 ` [PATCH v4 4/4] emacs: make elide messages use notmuch-show for omitting messages Mark Walters
2012-05-27 22:30 ` [PATCH v4 0/4] Allow JSON to use non-entire thread, and use for elide Daniel Schoepe

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).