cli/count: add --lastmod

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).
This commit is contained in:
David Bremner 2015-06-05 08:16:17 +02:00
parent 98ee460eaa
commit 5a3b42fb8c
3 changed files with 40 additions and 9 deletions

View file

@ -47,6 +47,11 @@ Supported options for **count** include
(or threads) in the database will be output. This option is not (or threads) in the database will be output. This option is not
compatible with specifying search terms on the command line. 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> ``--input=``\ <filename>
Read input from given file, instead of from stdin. Implies Read input from given file, instead of from stdin. Implies
``--batch``. ``--batch``.

View file

@ -25,6 +25,7 @@ enum {
OUTPUT_THREADS, OUTPUT_THREADS,
OUTPUT_MESSAGES, OUTPUT_MESSAGES,
OUTPUT_FILES, 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 static int
print_count (notmuch_database_t *notmuch, const char *query_str, 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; notmuch_query_t *query;
size_t i; size_t i;
unsigned long revision;
const char *uuid;
int ret = 0;
query = notmuch_query_create (notmuch, query_str); query = notmuch_query_create (notmuch, query_str);
if (query == NULL) { if (query == NULL) {
@ -83,24 +87,31 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
switch (output) { switch (output) {
case OUTPUT_MESSAGES: case OUTPUT_MESSAGES:
printf ("%u\n", notmuch_query_count_messages (query)); printf ("%u", notmuch_query_count_messages (query));
break; break;
case OUTPUT_THREADS: case OUTPUT_THREADS:
printf ("%u\n", notmuch_query_count_threads (query)); printf ("%u", notmuch_query_count_threads (query));
break; break;
case OUTPUT_FILES: 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 static int
count_file (notmuch_database_t *notmuch, FILE *input, const char **exclude_tags, 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; char *line = NULL;
ssize_t line_len; 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) { while (!ret && (line_len = getline (&line, &line_size, input)) != -1) {
chomp_newline (line); chomp_newline (line);
ret = print_count (notmuch, line, exclude_tags, exclude_tags_length, 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; const char **search_exclude_tags = NULL;
size_t search_exclude_tags_length = 0; size_t search_exclude_tags_length = 0;
notmuch_bool_t batch = FALSE; notmuch_bool_t batch = FALSE;
notmuch_bool_t print_lastmod = FALSE;
FILE *input = stdin; FILE *input = stdin;
char *input_file_name = NULL; char *input_file_name = NULL;
int ret; int ret;
@ -139,11 +151,13 @@ notmuch_count_command (notmuch_config_t *config, int argc, char *argv[])
(notmuch_keyword_t []){ { "threads", OUTPUT_THREADS }, (notmuch_keyword_t []){ { "threads", OUTPUT_THREADS },
{ "messages", OUTPUT_MESSAGES }, { "messages", OUTPUT_MESSAGES },
{ "files", OUTPUT_FILES }, { "files", OUTPUT_FILES },
{ "modifications", OUTPUT_LASTMOD },
{ 0, 0 } } }, { 0, 0 } } },
{ NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x', { NOTMUCH_OPT_KEYWORD, &exclude, "exclude", 'x',
(notmuch_keyword_t []){ { "true", EXCLUDE_TRUE }, (notmuch_keyword_t []){ { "true", EXCLUDE_TRUE },
{ "false", EXCLUDE_FALSE }, { "false", EXCLUDE_FALSE },
{ 0, 0 } } }, { 0, 0 } } },
{ NOTMUCH_OPT_BOOLEAN, &print_lastmod, "lastmod", 'l', 0 },
{ NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 }, { NOTMUCH_OPT_BOOLEAN, &batch, "batch", 0, 0 },
{ NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 }, { NOTMUCH_OPT_STRING, &input_file_name, "input", 'i', 0 },
{ NOTMUCH_OPT_INHERIT, (void *) &notmuch_shared_options, NULL, 0, 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) if (batch)
ret = count_file (notmuch, input, search_exclude_tags, ret = count_file (notmuch, input, search_exclude_tags,
search_exclude_tags_length, output); search_exclude_tags_length, output, print_lastmod);
else else
ret = print_count (notmuch, query_str, search_exclude_tags, 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);

View file

@ -34,4 +34,16 @@ UUID 53
EOF EOF
test_expect_equal_file EXPECTED CLEAN 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