[PATCH v3 00/10] "notmuch address" command

Michal Sojka sojkam1 at fel.cvut.cz
Tue Nov 4 16:25:49 PST 2014


Hi all,

this is v3 of "notmuch address" patchset. It obsoletes [1].

I think I addressed all comments made to v2. The diff between v2 and
v3 is below. Besides this, I improved commit messages.

I also tried to get rid of global variables in 6/10, but it looked
ugly, because the definition of keywords (e.g. "text", "json", ...)
had to be outside of option definition. So I kept the code as it was
in v2.

It seems that the agreement is to merge patches 1-9 for 0.19 and leave
patch 10 for further discussion.

Thanks
-Michal

[1] id:1415058622-21162-1-git-send-email-sojkam1 at fel.cvut.cz


Jani Nikula (1):
  cli: add support for hierarchical command line option arrays

Michal Sojka (9):
  cli: search: Rename options to context
  cli: search: Move more variables into search_context_t
  cli: search: Convert ctx. to ctx->
  cli: search: Split notmuch_search_command to smaller functions
  cli: Introduce "notmuch address" command
  cli: search: Convert --output to keyword argument
  cli: address: Do not output duplicate addresses
  cli: address: Add --output=count
  cli: address: Add --filter-by option to configure address filtering

 command-line-arguments.c           |  16 +-
 command-line-arguments.h           |   1 +
 completion/notmuch-completion.bash |  48 +++-
 completion/notmuch-completion.zsh  |  11 +-
 doc/man1/notmuch-address.rst       | 132 +++++++++++
 doc/man1/notmuch-search.rst        |  21 +-
 doc/man1/notmuch.rst               |   7 +-
 notmuch-client.h                   |   3 +
 notmuch-search.c                   | 461 ++++++++++++++++++++++++++-----------
 notmuch.c                          |   2 +
 test/T095-address.sh               | 148 ++++++++++++
 test/T097-address-filter-by.sh     |  73 ++++++
 12 files changed, 750 insertions(+), 173 deletions(-)
 create mode 100644 doc/man1/notmuch-address.rst
 create mode 100755 test/T095-address.sh
 create mode 100755 test/T097-address-filter-by.sh

-- 
2.1.1

diff --git a/doc/man1/notmuch-address.rst b/doc/man1/notmuch-address.rst
index 524ab91..00582c3 100644
--- a/doc/man1/notmuch-address.rst
+++ b/doc/man1/notmuch-address.rst
@@ -30,7 +30,7 @@ Supported options for **address** include
         intended for programs that invoke **notmuch(1)** internally. If
         omitted, the latest supported version will be used.
 
-    ``--output=(sender|recipients)``
+    ``--output=(sender|recipients|count)``
 
         Controls which information appears in the output. This option
 	can be given multiple times to combine different outputs.
@@ -64,7 +64,9 @@ Supported options for **address** include
         By default, results will be displayed in reverse chronological
         order, (that is, the newest results will be displayed first).
 
-    ``--exclude=(true|false|all|flag)``
+	This option has no effect when used with --output=count.
+
+    ``--exclude=(true|false)``
         A message is called "excluded" if it matches at least one tag in
         search.tag\_exclude that does not appear explicitly in the
         search terms. This option specifies whether to omit excluded
@@ -73,18 +75,8 @@ Supported options for **address** include
         The default value, **true**, prevents excluded messages from
         matching the search terms.
 
-        **all** additionally prevents excluded messages from appearing
-        in displayed results, in effect behaving as though the excluded
-        messages do not exist.
-
         **false** allows excluded messages to match search terms and
-        appear in displayed results. Excluded messages are still marked
-        in the relevant outputs.
-
-        **flag** only has an effect when ``--output=summary``. The
-        output is almost identical to **false**, but the "match count"
-        is the number of matching non-excluded messages in the thread,
-        rather than the number of matching messages.
+        appear in displayed results.
 
     ``--filter-by=``\ (**nameaddr**\ \|\ **name** \|\ **addr**\ \|\ **addrfold**\ \|\ **nameaddrfold**\)
 
diff --git a/notmuch-search.c b/notmuch-search.c
index 04e33c6..246ec0a 100644
--- a/notmuch-search.c
+++ b/notmuch-search.c
@@ -252,7 +252,9 @@ do_search_threads (search_context_t *ctx)
     return 0;
 }
 
-/* Returns TRUE iff name and/or addr is considered duplicate. */
+/* Returns TRUE iff name and/or addr is considered duplicate. If not,
+ * stores the name/addr pair in order to detect subsequent
+ * duplicates. */
 static notmuch_bool_t
 is_duplicate (const search_context_t *ctx, const char *name, const char *addr)
 {
@@ -405,8 +407,9 @@ process_address_header (const search_context_t *ctx, const char *value)
     g_object_unref (list);
 }
 
+/* Destructor for talloc-allocated GHashTable keys and values. */
 static void
-_my_talloc_free_for_g_hash (void *ptr)
+_talloc_free_for_g_hash (void *ptr)
 {
     talloc_free (ptr);
 }
@@ -679,12 +682,6 @@ static const notmuch_opt_desc_t common_options[] = {
 			      { "text0", NOTMUCH_FORMAT_TEXT0 },
 			      { 0, 0 } } },
     { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },
-    { NOTMUCH_OPT_KEYWORD, &search_context.exclude, "exclude", 'x',
-      (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
-			      { "false", NOTMUCH_EXCLUDE_FALSE },
-			      { "flag", NOTMUCH_EXCLUDE_FLAG },
-			      { "all", NOTMUCH_EXCLUDE_ALL },
-			      { 0, 0 } } },
     { 0, 0, 0, 0, 0 }
 };
 
@@ -702,6 +699,12 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[])
 				  { "files", OUTPUT_FILES },
 				  { "tags", OUTPUT_TAGS },
 				  { 0, 0 } } },
+        { NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x',
+          (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
+                                  { "false", NOTMUCH_EXCLUDE_FALSE },
+                                  { "flag", NOTMUCH_EXCLUDE_FLAG },
+                                  { "all", NOTMUCH_EXCLUDE_ALL },
+                                  { 0, 0 } } },
 	{ NOTMUCH_OPT_INT, &ctx->offset, "offset", 'O', 0 },
 	{ NOTMUCH_OPT_INT, &ctx->limit, "limit", 'L', 0  },
 	{ NOTMUCH_OPT_INT, &ctx->dupe, "duplicate", 'D', 0  },
@@ -757,6 +760,10 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[])
 				  { "recipients", OUTPUT_RECIPIENTS },
 				  { "count", OUTPUT_COUNT },
 				  { 0, 0 } } },
+	{ NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x',
+	  (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
+				  { "false", NOTMUCH_EXCLUDE_FALSE },
+				  { 0, 0 } } },
 	{ NOTMUCH_OPT_KEYWORD, &ctx->filter_by, "filter-by", 'b',
 	  (notmuch_keyword_t []){ { "nameaddr", FILTER_BY_NAMEADDR },
 				  { "name", FILTER_BY_NAME },
@@ -774,14 +781,14 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[])
 	return EXIT_FAILURE;
 
     if (! ctx->output)
-	search_context.output = OUTPUT_SENDER | OUTPUT_RECIPIENTS;
+	ctx->output = OUTPUT_SENDER | OUTPUT_RECIPIENTS;
 
     if (_notmuch_search_prepare (ctx, config,
 				 argc - opt_index, argv + opt_index))
 	return EXIT_FAILURE;
 
     ctx->addresses = g_hash_table_new_full (g_str_hash, g_str_equal,
-					    _my_talloc_free_for_g_hash, _my_talloc_free_for_g_hash);
+					    _talloc_free_for_g_hash, _talloc_free_for_g_hash);
 
     ret = do_search_messages (ctx);
 
diff --git a/test/T095-address.sh b/test/T095-address.sh
index 92e17b0..033d0f4 100755
--- a/test/T095-address.sh
+++ b/test/T095-address.sh
@@ -91,8 +91,8 @@ Mikhail Gusarov <dottedmag at dottedmag.net>
 EOF
 test_expect_equal_file OUTPUT EXPECTED
 
-test_begin_subtest "No --output"
-notmuch address --output=sender --output=recipients '*' >OUTPUT
+test_begin_subtest "without --output"
+notmuch address '*' >OUTPUT
 # Use EXPECTED from previous subtest
 test_expect_equal_file OUTPUT EXPECTED
 


More information about the notmuch mailing list