]> git.notmuchmail.org Git - notmuch/commitdiff
cli/count: add --lastmod
authorDavid Bremner <david@tethera.net>
Fri, 5 Jun 2015 06:16:17 +0000 (08:16 +0200)
committerDavid Bremner <david@tethera.net>
Fri, 14 Aug 2015 16:07:55 +0000 (18:07 +0200)
In the short term we need a way to get lastmod information e.g. for
the test suite. In the long term we probably want to add lastmod
information to at least the structured output for several other
clients (e.g. show, search).

doc/man1/notmuch-count.rst
notmuch-count.c
test/T570-revision-tracking.sh

index ca78c18b20555c80a87b720fb3bfe5900d2db05d..99de13a9871245af98f1ca55e8570179e116883e 100644 (file)
@@ -47,6 +47,11 @@ Supported options for **count** include
         (or threads) in the database will be output. This option is not
         compatible with specifying search terms on the command line.
 
         (or threads) in the database will be output. This option is not
         compatible with specifying search terms on the command line.
 
+    ``--lastmod``
+       Append lastmod (counter for number of database updates) and UUID
+       to the output. lastmod values are only comparable between databases
+       with the same UUID.
+
     ``--input=``\ <filename>
         Read input from given file, instead of from stdin. Implies
         ``--batch``.
     ``--input=``\ <filename>
         Read input from given file, instead of from stdin. Implies
         ``--batch``.
index 57a88a8d1806df1bb0616b64a2555994319f37dd..182710a67b0e8f61867860c6c7ad0c807ce7fb84 100644 (file)
@@ -25,6 +25,7 @@ enum {
     OUTPUT_THREADS,
     OUTPUT_MESSAGES,
     OUTPUT_FILES,
     OUTPUT_THREADS,
     OUTPUT_MESSAGES,
     OUTPUT_FILES,
+    OUTPUT_LASTMOD,
 };
 
 /* The following is to allow future options to be added more easily */
 };
 
 /* The following is to allow future options to be added more easily */
@@ -67,10 +68,13 @@ count_files (notmuch_query_t *query)
 
 static int
 print_count (notmuch_database_t *notmuch, const char *query_str,
 
 static int
 print_count (notmuch_database_t *notmuch, const char *query_str,
-            const char **exclude_tags, size_t exclude_tags_length, int output)
+            const char **exclude_tags, size_t exclude_tags_length, int output, int print_lastmod)
 {
     notmuch_query_t *query;
     size_t i;
 {
     notmuch_query_t *query;
     size_t i;
+    unsigned long revision;
+    const char *uuid;
+    int ret = 0;
 
     query = notmuch_query_create (notmuch, query_str);
     if (query == NULL) {
 
     query = notmuch_query_create (notmuch, query_str);
     if (query == NULL) {
@@ -83,24 +87,31 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
 
     switch (output) {
     case OUTPUT_MESSAGES:
 
     switch (output) {
     case OUTPUT_MESSAGES:
-       printf ("%u\n", notmuch_query_count_messages (query));
+       printf ("%u", notmuch_query_count_messages (query));
        break;
     case OUTPUT_THREADS:
        break;
     case OUTPUT_THREADS:
-       printf ("%u\n", notmuch_query_count_threads (query));
+       printf ("%u", notmuch_query_count_threads (query));
        break;
     case OUTPUT_FILES:
        break;
     case OUTPUT_FILES:
-       printf ("%u\n", count_files (query));
+       printf ("%u", count_files (query));
        break;
     }
 
        break;
     }
 
+    if (print_lastmod) {
+       revision = notmuch_database_get_revision (notmuch, &uuid);
+       printf ("\t%s\t%lu\n", uuid, revision);
+    } else {
+       fputs ("\n", stdout);
+    }
+
     notmuch_query_destroy (query);
 
     notmuch_query_destroy (query);
 
-    return 0;
+    return ret;
 }
 
 static int
 count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags,
 }
 
 static int
 count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags,
-           size_t exclude_tags_length, int output)
+           size_t exclude_tags_length, int output, int print_lastmod)
 {
     char *line = NULL;
     ssize_t line_len;
 {
     char *line = NULL;
     ssize_t line_len;
@@ -110,7 +121,7 @@ count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags,
     while (!ret && (line_len = getline (&line, &line_size, input)) != -1) {
        chomp_newline (line);
        ret = print_count (notmuch, line, exclude_tags, exclude_tags_length,
     while (!ret && (line_len = getline (&line, &line_size, input)) != -1) {
        chomp_newline (line);
        ret = print_count (notmuch, line, exclude_tags, exclude_tags_length,
-                          output);
+                          output, print_lastmod);
     }
 
     if (line)
     }
 
     if (line)
@@ -130,6 +141,7 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
     const char **search_exclude_tags = NULL;
     size_t search_exclude_tags_length = 0;
     notmuch_bool_t batch = FALSE;
     const char **search_exclude_tags = NULL;
     size_t search_exclude_tags_length = 0;
     notmuch_bool_t batch = FALSE;
+    notmuch_bool_t print_lastmod = FALSE;
     FILE *input = stdin;
     char *input_file_name = NULL;
     int ret;
     FILE *input = stdin;
     char *input_file_name = NULL;
     int ret;
@@ -139,11 +151,13 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
          (notmuch_keyword_t []){ { "threads", OUTPUT_THREADS },
                                  { "messages", OUTPUT_MESSAGES },
                                  { "files", OUTPUT_FILES },
          (notmuch_keyword_t []){ { "threads", OUTPUT_THREADS },
                                  { "messages", OUTPUT_MESSAGES },
                                  { "files", OUTPUT_FILES },
+                                 { "modifications", OUTPUT_LASTMOD },
                                  { 0, 0 } } },
        { NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
          (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
                                  { "false", EXCLUDE_FALSE },
                                  { 0, 0 } } },
                                  { 0, 0 } } },
        { NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
          (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
                                  { "false", EXCLUDE_FALSE },
                                  { 0, 0 } } },
+       { NOTMUCH_OPT_BOOLEAN, &print_lastmod, "lastmod", 'l', 0 },
        { NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 },
        { NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 },
        { NOTMUCH_OPT_INHERIT, (void *) &notmuch_shared_options, NULL, 0, 0 },
        { NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 },
        { NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 },
        { NOTMUCH_OPT_INHERIT, (void *) &notmuch_shared_options, NULL, 0, 0 },
@@ -188,10 +202,10 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
 
     if (batch)
        ret = count_file (notmuch, input, search_exclude_tags,
 
     if (batch)
        ret = count_file (notmuch, input, search_exclude_tags,
-                         search_exclude_tags_length, output);
+                         search_exclude_tags_length, output, print_lastmod);
     else
        ret = print_count (notmuch, query_str, search_exclude_tags,
     else
        ret = print_count (notmuch, query_str, search_exclude_tags,
-                          search_exclude_tags_length, output);
+                          search_exclude_tags_length, output, print_lastmod);
 
     notmuch_database_destroy (notmuch);
 
 
     notmuch_database_destroy (notmuch);
 
index e0a57030f404249308bb7a1b17a33b49f10f91c8..4fff6896dd203b8dbb64760ad31bb3b633c90859 100755 (executable)
@@ -34,4 +34,16 @@ UUID 53
 EOF
 test_expect_equal_file EXPECTED CLEAN
 
 EOF
 test_expect_equal_file EXPECTED CLEAN
 
+grep '^[0-9a-f]' OUTPUT > INITIAL_OUTPUT
+
+test_begin_subtest "output of count matches test code"
+notmuch count --lastmod '*' | cut -f2-3 > OUTPUT
+test_expect_equal_file INITIAL_OUTPUT OUTPUT
+
+test_begin_subtest "modification count increases"
+before=$(notmuch count --lastmod '*' | cut -f3)
+notmuch tag +a-random-tag-8743632 '*'
+after=$(notmuch count --lastmod '*' | cut -f3)
+result=$(($before < $after))
+test_expect_equal 1 ${result}
 test_done
 test_done