aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-11-12 20:47:12 -0800
committerGravatar Carl 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 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))
{