unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH 0/6] cli: better tooling support for duplicate messages
@ 2013-05-13 18:26 Jani Nikula
  2013-05-13 18:26 ` [PATCH 1/6] cli: add --duplicate=N option to notmuch search Jani Nikula
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:26 UTC (permalink / raw)
  To: notmuch

Patches 1-3 are an answer to a question on IRC:

<ccxCZ> is there a way for notmuch search --output=files to only output
        one file for Message-ID instead of all?

Yes, use --duplicate=0 on the command line. ;)

I suggest this interface (instead of, say, --output=file1 which was also
contemplated) for two reasons: it allows one to choose also other files
than the first one, and the same interface could be used later on in
notmuch show to display the duplicates.

An alternative could be something like --duplicates=(all|first|rest)
which would lack the possibility to pick a specific duplicate, but would
allow one to list all the "redundant" files with --duplicates=rest (this
would correspond to a number of invocations with --duplicate=1,
--duplicate=2, etc.)

Patches 4-6 add support for querying the file counts in notmuch
count. Most useful with a single id:<message-id> query I presume.


BR,
Jani.


Jani Nikula (6):
  cli: add --duplicate=N option to notmuch search
  test: test notmuch search --duplicate=N
  man: document notmuch search --duplicate=N
  cli: add --output=files option to notmuch count
  test: test notmuch count --output=files
  man: document notmuch count --output=files

 man/man1/notmuch-count.1  |   10 ++++++-
 man/man1/notmuch-search.1 |   11 ++++++++
 notmuch-count.c           |   37 ++++++++++++++++++++++++++
 notmuch-search.c          |   18 ++++++++-----
 test/count                |   10 +++++++
 test/search-output        |   65 +++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 144 insertions(+), 7 deletions(-)

-- 
1.7.10.4

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

* [PATCH 1/6] cli: add --duplicate=N option to notmuch search
  2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
@ 2013-05-13 18:26 ` Jani Nikula
  2013-05-27  0:26   ` David Bremner
  2013-05-13 18:26 ` [PATCH 2/6] test: test notmuch search --duplicate=N Jani Nikula
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:26 UTC (permalink / raw)
  To: notmuch

Effective with --output=files, output the Nth filename associated with
each message matching the query (N is 0-based). If N is equal to or
greater than the number of files associated with the message, don't
print anything.
---
 notmuch-search.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/notmuch-search.c b/notmuch-search.c
index e658639..b113883 100644
--- a/notmuch-search.c
+++ b/notmuch-search.c
@@ -177,7 +177,8 @@ do_search_messages (sprinter_t *format,
 		    notmuch_query_t *query,
 		    output_t output,
 		    int offset,
-		    int limit)
+		    int limit,
+		    int dupe)
 {
     notmuch_message_t *message;
     notmuch_messages_t *messages;
@@ -206,14 +207,17 @@ do_search_messages (sprinter_t *format,
 	message = notmuch_messages_get (messages);
 
 	if (output == OUTPUT_FILES) {
+	    int j;
 	    filenames = notmuch_message_get_filenames (message);
 
-	    for (;
+	    for (j = 0;
 		 notmuch_filenames_valid (filenames);
-		 notmuch_filenames_move_to_next (filenames))
+		 notmuch_filenames_move_to_next (filenames), j++)
 	    {
-		format->string (format, notmuch_filenames_get (filenames));
-		format->separator (format);
+		if (dupe < 0 || dupe == j) {
+		    format->string (format, notmuch_filenames_get (filenames));
+		    format->separator (format);
+		}
 	    }
 	    
 	    notmuch_filenames_destroy( filenames );
@@ -302,6 +306,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
     int offset = 0;
     int limit = -1; /* unlimited */
     int exclude = EXCLUDE_TRUE;
+    int dupe = -1;
     unsigned int i;
 
     enum {
@@ -337,6 +342,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
                                   { 0, 0 } } },
 	{ NOTMUCH_OPT_INT, &offset, "offset", 'O', 0 },
 	{ NOTMUCH_OPT_INT, &limit, "limit", 'L', 0  },
+	{ NOTMUCH_OPT_INT, &dupe, "duplicate", 'D', 0  },
 	{ 0, 0, 0, 0, 0 }
     };
 
@@ -420,7 +426,7 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
 	break;
     case OUTPUT_MESSAGES:
     case OUTPUT_FILES:
-	ret = do_search_messages (format, query, output, offset, limit);
+	ret = do_search_messages (format, query, output, offset, limit, dupe);
 	break;
     case OUTPUT_TAGS:
 	ret = do_search_tags (notmuch, format, query);
-- 
1.7.10.4

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

* [PATCH 2/6] test: test notmuch search --duplicate=N
  2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
  2013-05-13 18:26 ` [PATCH 1/6] cli: add --duplicate=N option to notmuch search Jani Nikula
@ 2013-05-13 18:26 ` Jani Nikula
  2013-05-13 18:26 ` [PATCH 3/6] man: document " Jani Nikula
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:26 UTC (permalink / raw)
  To: notmuch

---
 test/search-output |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/test/search-output b/test/search-output
index c2a87eb..3268833 100755
--- a/test/search-output
+++ b/test/search-output
@@ -239,6 +239,64 @@ MAIL_DIR/cur/01:2,
 EOF
 test_expect_equal_file OUTPUT EXPECTED
 
+test_begin_subtest "--output=files --duplicate=0"
+notmuch search --output=files --duplicate=0 '*' | sed -e "s,$MAIL_DIR,MAIL_DIR," >OUTPUT
+cat <<EOF >EXPECTED
+MAIL_DIR/cur/52:2,
+MAIL_DIR/cur/53:2,
+MAIL_DIR/cur/50:2,
+MAIL_DIR/cur/49:2,
+MAIL_DIR/cur/48:2,
+MAIL_DIR/cur/47:2,
+MAIL_DIR/cur/46:2,
+MAIL_DIR/cur/45:2,
+MAIL_DIR/cur/44:2,
+MAIL_DIR/cur/43:2,
+MAIL_DIR/cur/42:2,
+MAIL_DIR/cur/41:2,
+MAIL_DIR/cur/40:2,
+MAIL_DIR/cur/39:2,
+MAIL_DIR/cur/38:2,
+MAIL_DIR/cur/37:2,
+MAIL_DIR/cur/36:2,
+MAIL_DIR/cur/35:2,
+MAIL_DIR/cur/34:2,
+MAIL_DIR/cur/33:2,
+MAIL_DIR/cur/32:2,
+MAIL_DIR/cur/31:2,
+MAIL_DIR/cur/30:2,
+MAIL_DIR/cur/29:2,
+MAIL_DIR/cur/28:2,
+MAIL_DIR/cur/27:2,
+MAIL_DIR/cur/26:2,
+MAIL_DIR/cur/25:2,
+MAIL_DIR/cur/24:2,
+MAIL_DIR/cur/23:2,
+MAIL_DIR/cur/22:2,
+MAIL_DIR/cur/21:2,
+MAIL_DIR/cur/19:2,
+MAIL_DIR/cur/18:2,
+MAIL_DIR/cur/20:2,
+MAIL_DIR/cur/17:2,
+MAIL_DIR/cur/16:2,
+MAIL_DIR/cur/15:2,
+MAIL_DIR/cur/14:2,
+MAIL_DIR/cur/13:2,
+MAIL_DIR/cur/12:2,
+MAIL_DIR/cur/11:2,
+MAIL_DIR/cur/10:2,
+MAIL_DIR/cur/09:2,
+MAIL_DIR/cur/08:2,
+MAIL_DIR/cur/06:2,
+MAIL_DIR/cur/05:2,
+MAIL_DIR/cur/04:2,
+MAIL_DIR/cur/03:2,
+MAIL_DIR/cur/07:2,
+MAIL_DIR/cur/02:2,
+MAIL_DIR/cur/01:2,
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
 test_begin_subtest "--output=files --format=json"
 notmuch search --format=json --output=files '*' | sed -e "s,$MAIL_DIR,MAIL_DIR," >OUTPUT
 cat <<EOF >EXPECTED
@@ -298,6 +356,13 @@ cat <<EOF >EXPECTED
 EOF
 test_expect_equal_file OUTPUT EXPECTED
 
+test_begin_subtest "--output=files --format=json --duplicate=1"
+notmuch search --format=json --output=files --duplicate=1 '*' | sed -e "s,$MAIL_DIR,MAIL_DIR," >OUTPUT
+cat <<EOF >EXPECTED
+["MAIL_DIR/cur/51:2,"]
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
 test_begin_subtest "--output=tags"
 notmuch search --output=tags '*' >OUTPUT
 cat <<EOF >EXPECTED
-- 
1.7.10.4

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

* [PATCH 3/6] man: document notmuch search --duplicate=N
  2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
  2013-05-13 18:26 ` [PATCH 1/6] cli: add --duplicate=N option to notmuch search Jani Nikula
  2013-05-13 18:26 ` [PATCH 2/6] test: test notmuch search --duplicate=N Jani Nikula
@ 2013-05-13 18:26 ` Jani Nikula
  2013-05-13 18:26 ` [PATCH 4/6] cli: add --output=files option to notmuch count Jani Nikula
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:26 UTC (permalink / raw)
  To: notmuch

---
 man/man1/notmuch-search.1 |   11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/man/man1/notmuch-search.1 b/man/man1/notmuch-search.1
index da2f1dd..d2a582d 100644
--- a/man/man1/notmuch-search.1
+++ b/man/man1/notmuch-search.1
@@ -154,6 +154,17 @@ but the "match count" is the number of matching non-excluded messages in the
 thread, rather than the number of matching messages.
 .RE
 
+.RS 4
+.TP 4
+.BR \-\-duplicate=N
+
+Effective with
+.BR --output=files ,
+output the Nth filename associated with each message matching the
+query (N is 0-based). If N is equal to or greater than the number of
+files associated with the message, don't print anything.
+.RE
+
 .SH EXIT STATUS
 
 This command supports the following special exit status codes
-- 
1.7.10.4

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

* [PATCH 4/6] cli: add --output=files option to notmuch count
  2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
                   ` (2 preceding siblings ...)
  2013-05-13 18:26 ` [PATCH 3/6] man: document " Jani Nikula
@ 2013-05-13 18:26 ` Jani Nikula
  2013-05-13 18:27 ` [PATCH 5/6] test: test notmuch count --output=files Jani Nikula
  2013-05-13 18:27 ` [PATCH 6/6] man: document " Jani Nikula
  5 siblings, 0 replies; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:26 UTC (permalink / raw)
  To: notmuch

Add support for querying the total number of files associated with the
messages matching the search. This is mostly useful with an
id:<message-id> query for a single message.
---
 notmuch-count.c |   37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/notmuch-count.c b/notmuch-count.c
index 8772cff..01e4e30 100644
--- a/notmuch-count.c
+++ b/notmuch-count.c
@@ -24,6 +24,7 @@
 enum {
     OUTPUT_THREADS,
     OUTPUT_MESSAGES,
+    OUTPUT_FILES,
 };
 
 /* The following is to allow future options to be added more easily */
@@ -32,6 +33,38 @@ enum {
     EXCLUDE_FALSE,
 };
 
+static unsigned int
+count_files (notmuch_query_t *query)
+{
+    notmuch_messages_t *messages;
+    notmuch_message_t *message;
+    notmuch_filenames_t *filenames;
+    unsigned int count = 0;
+
+    messages = notmuch_query_search_messages (query);
+    if (messages == NULL)
+	return 0;
+
+    for (;
+	 notmuch_messages_valid (messages);
+	 notmuch_messages_move_to_next (messages)) {
+	message = notmuch_messages_get (messages);
+	filenames = notmuch_message_get_filenames (message);
+
+	for (;
+	     notmuch_filenames_valid (filenames);
+	     notmuch_filenames_move_to_next (filenames))
+	    count++;
+
+	notmuch_filenames_destroy (filenames);
+	notmuch_message_destroy (message);
+    }
+
+    notmuch_messages_destroy (messages);
+
+    return count;
+}
+
 static int
 print_count (notmuch_database_t *notmuch, const char *query_str,
 	     const char **exclude_tags, size_t exclude_tags_length, int output)
@@ -55,6 +88,9 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
     case OUTPUT_THREADS:
 	printf ("%u\n", notmuch_query_count_threads (query));
 	break;
+    case OUTPUT_FILES:
+	printf ("%u\n", count_files (query));
+	break;
     }
 
     notmuch_query_destroy (query);
@@ -102,6 +138,7 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
 	{ NOTMUCH_OPT_KEYWORD, &output, "output", 'o',
 	  (notmuch_keyword_t []){ { "threads", OUTPUT_THREADS },
 				  { "messages", OUTPUT_MESSAGES },
+				  { "files", OUTPUT_FILES },
 				  { 0, 0 } } },
 	{ NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
 	  (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
-- 
1.7.10.4

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

* [PATCH 5/6] test: test notmuch count --output=files
  2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
                   ` (3 preceding siblings ...)
  2013-05-13 18:26 ` [PATCH 4/6] cli: add --output=files option to notmuch count Jani Nikula
@ 2013-05-13 18:27 ` Jani Nikula
  2013-05-13 18:27 ` [PATCH 6/6] man: document " Jani Nikula
  5 siblings, 0 replies; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:27 UTC (permalink / raw)
  To: notmuch

---
 test/count |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/test/count b/test/count
index 05713fd..da86c8c 100755
--- a/test/count
+++ b/test/count
@@ -28,6 +28,16 @@ test_expect_equal \
     "$((`notmuch search '*' | wc -l`))" \
     "`notmuch count --output=threads '*'`"
 
+test_begin_subtest "files count"
+test_expect_equal \
+    "$((`notmuch search --output=files '*' | wc -l`))" \
+    "`notmuch count --output=files '*'`"
+
+test_begin_subtest "files count for a duplicate message-id"
+test_expect_equal \
+    "2" \
+    "`notmuch count --output=files id:20091117232137.GA7669@griffis1.net`"
+
 test_begin_subtest "count with no matching messages"
 test_expect_equal \
     "0" \
-- 
1.7.10.4

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

* [PATCH 6/6] man: document notmuch count --output=files
  2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
                   ` (4 preceding siblings ...)
  2013-05-13 18:27 ` [PATCH 5/6] test: test notmuch count --output=files Jani Nikula
@ 2013-05-13 18:27 ` Jani Nikula
  2013-05-27  0:36   ` David Bremner
  5 siblings, 1 reply; 10+ messages in thread
From: Jani Nikula @ 2013-05-13 18:27 UTC (permalink / raw)
  To: notmuch

---
 man/man1/notmuch-count.1 |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/man/man1/notmuch-count.1 b/man/man1/notmuch-count.1
index 7fc4378..60af631 100644
--- a/man/man1/notmuch-count.1
+++ b/man/man1/notmuch-count.1
@@ -23,7 +23,7 @@ Supported options for
 include
 .RS 4
 .TP 4
-.B \-\-output=(messages|threads)
+.B \-\-output=(messages|threads|files)
 
 .RS 4
 .TP 4
@@ -37,6 +37,14 @@ Output the number of matching messages. This is the default.
 
 Output the number of matching threads.
 .RE
+.RS 4
+.TP 4
+.B files
+
+Output the number of files associated with matching messages. This may
+be bigger than the number of matching messages due to duplicates
+(i.e. multiple files having the same message-id).
+.RE
 .RE
 
 .RS 4
-- 
1.7.10.4

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

* Re: [PATCH 1/6] cli: add --duplicate=N option to notmuch search
  2013-05-13 18:26 ` [PATCH 1/6] cli: add --duplicate=N option to notmuch search Jani Nikula
@ 2013-05-27  0:26   ` David Bremner
  0 siblings, 0 replies; 10+ messages in thread
From: David Bremner @ 2013-05-27  0:26 UTC (permalink / raw)
  To: Jani Nikula, notmuch

Jani Nikula <jani@nikula.org> writes:

> Effective with --output=files, output the Nth filename associated with
> each message matching the query (N is 0-based). If N is equal to or
> greater than the number of files associated with the message, don't
> print anything.

I guess this is a proverbial bikeshed, but 1 based indexing feels more
natural to me here.

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

* Re: [PATCH 6/6] man: document notmuch count --output=files
  2013-05-13 18:27 ` [PATCH 6/6] man: document " Jani Nikula
@ 2013-05-27  0:36   ` David Bremner
  2013-05-27  6:14     ` Mark Walters
  0 siblings, 1 reply; 10+ messages in thread
From: David Bremner @ 2013-05-27  0:36 UTC (permalink / raw)
  To: Jani Nikula, notmuch


Other than the bikeshed about starting from zero instead of one, and not
being completely happy with the option name --duplicate (but not being
inspired to suggest a better one), this series looks OK to me.

It seems like it would be quite useful to query based on the number of
duplicates, but that is a much more ambitious task, I think.

d

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

* Re: [PATCH 6/6] man: document notmuch count --output=files
  2013-05-27  0:36   ` David Bremner
@ 2013-05-27  6:14     ` Mark Walters
  0 siblings, 0 replies; 10+ messages in thread
From: Mark Walters @ 2013-05-27  6:14 UTC (permalink / raw)
  To: David Bremner, Jani Nikula, notmuch


David Bremner <david@tethera.net> writes:

> Other than the bikeshed about starting from zero instead of one, and not
> being completely happy with the option name --duplicate (but not being
> inspired to suggest a better one), this series looks OK to me.
>
> It seems like it would be quite useful to query based on the number of
> duplicates, but that is a much more ambitious task, I think.

This series basically looks good to me too. I agree with all of the
above points though. 

Best wishes

Mark

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

end of thread, other threads:[~2013-05-27  6:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-13 18:26 [PATCH 0/6] cli: better tooling support for duplicate messages Jani Nikula
2013-05-13 18:26 ` [PATCH 1/6] cli: add --duplicate=N option to notmuch search Jani Nikula
2013-05-27  0:26   ` David Bremner
2013-05-13 18:26 ` [PATCH 2/6] test: test notmuch search --duplicate=N Jani Nikula
2013-05-13 18:26 ` [PATCH 3/6] man: document " Jani Nikula
2013-05-13 18:26 ` [PATCH 4/6] cli: add --output=files option to notmuch count Jani Nikula
2013-05-13 18:27 ` [PATCH 5/6] test: test notmuch count --output=files Jani Nikula
2013-05-13 18:27 ` [PATCH 6/6] man: document " Jani Nikula
2013-05-27  0:36   ` David Bremner
2013-05-27  6:14     ` Mark Walters

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