From: Carl Worth Date: Fri, 13 Nov 2009 04:47:12 +0000 (-0800) Subject: notmuch search: Add --first and --max-threads options for incremental search. X-Git-Tag: 0.1~513 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=fc2053b022e9b87928a29fa4af111f0cfce719fe;ds=sidebyside notmuch search: Add --first and --max-threads options for incremental search. This time, things are actually tested. The current results aren't exactly the same as previous results since the incremental search doesn't necessarily see all the new messages that pertain to the thread. This means that some author names are missing. I plan to fix this by doing an additional database search for all messages in each thread. Of course, this will also be different than before since now the result will display *all* authors in the thread (rather than only those that matched the search) but that's probably what we really want to display anyway. --- diff --git a/notmuch-client.h b/notmuch-client.h index f3396d0d..1081a159 100644 --- a/notmuch-client.h +++ b/notmuch-client.h @@ -66,6 +66,9 @@ #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) +#define STRNCMP_LITERAL(var, literal) \ + strncmp ((var), (literal), sizeof (literal) - 1) + typedef int (*command_function_t) (void *ctx, int argc, char *argv[]); typedef struct command { diff --git a/notmuch-search.c b/notmuch-search.c index 41e317a2..85f3514e 100644 --- a/notmuch-search.c +++ b/notmuch-search.c @@ -32,6 +32,33 @@ notmuch_search_command (void *ctx, int argc, char *argv[]) char *query_str; const char *relative_date; time_t date; + int i, first = 0, max_threads = -1; + char *opt, *end; + + for (i = 0; i < argc && argv[i][0] == '-'; i++) { + if (strcmp (argv[i], "--") == 0) { + i++; + break; + } + if (STRNCMP_LITERAL (argv[i], "--first=") == 0) { + opt = argv[i] + sizeof ("--first=") - 1; + first = strtoul (opt, &end, 10); + if (*opt == '\0' || *end != '\0') { + fprintf (stderr, "Invalid value for --first: %s\n", opt); + return 1; + } + } else if (STRNCMP_LITERAL (argv[i], "--max-threads=") == 0) { + opt = argv[i] + sizeof ("--max-threads=") - 1; + max_threads = strtoul (opt, &end, 10); + if (*opt == '\0' || *end != '\0') { + fprintf (stderr, "Invalid value for --max-threads: %s\n", opt); + return 1; + } + } + } + + argc -= i; + argv += i; config = notmuch_config_open (ctx, NULL, NULL); if (config == NULL) @@ -53,7 +80,7 @@ notmuch_search_command (void *ctx, int argc, char *argv[]) return 1; } - for (threads = notmuch_query_search_threads (query, 0, -1); + for (threads = notmuch_query_search_threads (query, first, max_threads); notmuch_threads_has_more (threads); notmuch_threads_advance (threads)) {