[PATCH 2/3] cli/count: update to use notmuch_query_search_messages_st

David Bremner david at tethera.net
Sun Sep 6 06:15:46 PDT 2015


This brings back status information that may have been hidden by the
great library logging conversion.

Note the change of the internal API / return-value for count_files The
other count calls to the lib will also get error handling when that
API is updated in the lib.
---
 notmuch-count.c    | 22 ++++++++++++++++------
 test/T060-count.sh | 30 ++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/notmuch-count.c b/notmuch-count.c
index f26e726..65e1f4e 100644
--- a/notmuch-count.c
+++ b/notmuch-count.c
@@ -34,17 +34,19 @@ enum {
     EXCLUDE_FALSE,
 };
 
-static unsigned int
+/* Return the number of files matching the query, or -1 for an error */
+static int
 count_files (notmuch_query_t *query)
 {
     notmuch_messages_t *messages;
     notmuch_message_t *message;
     notmuch_filenames_t *filenames;
-    unsigned int count = 0;
+    notmuch_status_t status;
+    int count = 0;
 
-    messages = notmuch_query_search_messages (query);
-    if (messages == NULL)
-	return 0;
+    status = notmuch_query_search_messages_st (query, &messages);
+    if (print_status_query ("notmuch count", query, status))
+	return -1;
 
     for (;
 	 notmuch_messages_valid (messages);
@@ -72,6 +74,7 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
 {
     notmuch_query_t *query;
     size_t i;
+    int count;
     unsigned long revision;
     const char *uuid;
     int ret = 0;
@@ -93,7 +96,13 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
 	printf ("%u", notmuch_query_count_threads (query));
 	break;
     case OUTPUT_FILES:
-	printf ("%u", count_files (query));
+	count = count_files (query);
+	if (count >= 0) {
+	    printf ("%u", count);
+	} else {
+	    ret = -1;
+	    goto DONE;
+	}
 	break;
     }
 
@@ -104,6 +113,7 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
 	fputs ("\n", stdout);
     }
 
+  DONE:
     notmuch_query_destroy (query);
 
     return ret;
diff --git a/test/T060-count.sh b/test/T060-count.sh
index 5ef3879..3fec94e 100755
--- a/test/T060-count.sh
+++ b/test/T060-count.sh
@@ -93,5 +93,35 @@ notmuch count --output=messages >>EXPECTED
 notmuch count --output=messages tag:inbox >>EXPECTED
 test_expect_equal_file EXPECTED OUTPUT
 
+backup_database
+test_begin_subtest "error message for database open"
+dd if=/dev/zero of="${MAIL_DIR}/.notmuch/xapian/postlist.DB" count=3
+notmuch count '*' 2>OUTPUT 1>/dev/null
+output=$(sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' OUTPUT)
+test_expect_equal "${output}" "A Xapian exception occurred opening database"
+restore_database
+
+cat <<EOF > count-files.gdb
+set breakpoint pending on
+break count_files
+commands
+shell cp /dev/null ${MAIL_DIR}/.notmuch/xapian/postlist.DB
+continue
+end
+run
+EOF
+
+backup_database
+test_begin_subtest "error message from query_search_messages"
+gdb --batch-silent --return-child-result -x count-files.gdb \
+    --args notmuch count --output=files '*' 2>OUTPUT 1>/dev/null
+cat <<EOF > EXPECTED
+notmuch count: A Xapian exception occurred
+A Xapian exception occurred performing query
+Query string was: *
+EOF
+sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
+test_expect_equal_file EXPECTED OUTPUT.clean
+restore_database
 
 test_done
-- 
2.5.1



More information about the notmuch mailing list