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.
This commit is contained in:
Carl Worth 2009-11-12 20:47:12 -08:00
parent bbf4b8e4ae
commit fc2053b022
2 changed files with 31 additions and 1 deletions

View file

@ -66,6 +66,9 @@
#define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) #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 int (*command_function_t) (void *ctx, int argc, char *argv[]);
typedef struct command { typedef struct command {

View file

@ -32,6 +32,33 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
char *query_str; char *query_str;
const char *relative_date; const char *relative_date;
time_t 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); config = notmuch_config_open (ctx, NULL, NULL);
if (config == NULL) if (config == NULL)
@ -53,7 +80,7 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
return 1; 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_has_more (threads);
notmuch_threads_advance (threads)) notmuch_threads_advance (threads))
{ {