aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-11-12 20:47:12 -0800
committerCarl Worth <cworth@cworth.org>2009-11-12 20:47:12 -0800
commitfc2053b022e9b87928a29fa4af111f0cfce719fe (patch)
tree279c0406567bb83057bc4d587dad2aed60b2abc0
parentbbf4b8e4aec69b5684587b77bd0af743afd61eb1 (diff)
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.
-rw-r--r--notmuch-client.h3
-rw-r--r--notmuch-search.c29
2 files changed, 31 insertions, 1 deletions
diff --git a/notmuch-client.h b/notmuch-client.h
index f3396d0..1081a15 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 41e317a..85f3514 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))
{