diff options
author | Mark Walters <markwalters1009@gmail.com> | 2013-05-13 16:10:51 +0100 |
---|---|---|
committer | David Bremner <bremner@debian.org> | 2013-06-24 22:53:16 -0700 |
commit | d29d7e1ee25059c657412d5b045650f1e3e1533f (patch) | |
tree | e5de7694c9dfe5684458c25564c65a9ef70a7a90 /lib | |
parent | 8d863c9e87677909491f9783b951b2f0f13130ab (diff) |
lib: add NOTMUCH_EXCLUDE_FLAG to notmuch_exclude_t
Add NOTMUCH_EXCLUDE_FLAG to notmuch_exclude_t so that it can
cover all four values of search --exclude in the cli.
Previously the way to avoid any message being marked excluded was to
pass in an empty list of excluded tags: since we now have an explicit
option we might as well honour it.
The enum is in a slightly strange order as the existing FALSE/TRUE
options correspond to the new
NOTMUCH_EXCLUDE_FLAG/NOTMUCH_EXCLUDE_TRUE options so this means we do
not need to bump the version number.
Indeed, an example of this is that the cli count and show still use
FALSE/TRUE and still work.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/notmuch.h | 18 | ||||
-rw-r--r-- | lib/query.cc | 8 | ||||
-rw-r--r-- | lib/thread.cc | 28 |
3 files changed, 36 insertions, 18 deletions
diff --git a/lib/notmuch.h b/lib/notmuch.h index 27b43ff6..73c85a41 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -500,10 +500,15 @@ typedef enum { const char * notmuch_query_get_query_string (notmuch_query_t *query); -/* Exclude values for notmuch_query_set_omit_excluded */ +/* Exclude values for notmuch_query_set_omit_excluded. The strange + * order is to maintain backward compatibility: the old FALSE/TRUE + * options correspond to the new + * NOTMUCH_EXCLUDE_FLAG/NOTMUCH_EXCLUDE_TRUE options. + */ typedef enum { - NOTMUCH_EXCLUDE_FALSE, + NOTMUCH_EXCLUDE_FLAG, NOTMUCH_EXCLUDE_TRUE, + NOTMUCH_EXCLUDE_FALSE, NOTMUCH_EXCLUDE_ALL } notmuch_exclude_t; @@ -517,6 +522,15 @@ typedef enum { * match in at least one non-excluded message. Otherwise, if set to ALL, * notmuch_query_search_threads will omit excluded messages from all threads. * + * If set to FALSE or FLAG then both notmuch_query_search_messages and + * notmuch_query_search_threads will return all matching + * messages/threads regardless of exclude status. If set to FLAG then + * the exclude flag will be set for any excluded message that is + * returned by notmuch_query_search_messages, and the thread counts + * for threads returned by notmuch_query_search_threads will be the + * number of non-excluded messages/matches. Otherwise, if set to + * FALSE, then the exclude status is completely ignored. + * * The performance difference when calling * notmuch_query_search_messages should be relatively small (and both * should be very fast). However, in some cases, diff --git a/lib/query.cc b/lib/query.cc index 1cc768f8..69668a45 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -218,13 +218,15 @@ notmuch_query_search_messages (notmuch_query_t *query) } messages->base.excluded_doc_ids = NULL; - if (query->exclude_terms) { + if ((query->omit_excluded != NOTMUCH_EXCLUDE_FALSE) && (query->exclude_terms)) { exclude_query = _notmuch_exclude_tags (query, final_query); - if (query->omit_excluded != NOTMUCH_EXCLUDE_FALSE) + if (query->omit_excluded == NOTMUCH_EXCLUDE_TRUE || + query->omit_excluded == NOTMUCH_EXCLUDE_ALL) + { final_query = Xapian::Query (Xapian::Query::OP_AND_NOT, final_query, exclude_query); - else { + } else { /* NOTMUCH_EXCLUDE_FLAG */ exclude_query = Xapian::Query (Xapian::Query::OP_AND, exclude_query, final_query); diff --git a/lib/thread.cc b/lib/thread.cc index bc078778..4dcf7053 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -238,20 +238,22 @@ _thread_add_message (notmuch_thread_t *thread, char *clean_author; notmuch_bool_t message_excluded = FALSE; - for (tags = notmuch_message_get_tags (message); - notmuch_tags_valid (tags); - notmuch_tags_move_to_next (tags)) - { - tag = notmuch_tags_get (tags); - /* Is message excluded? */ - for (notmuch_string_node_t *term = exclude_terms->head; - term != NULL; - term = term->next) + if (omit_exclude != NOTMUCH_EXCLUDE_FALSE) { + for (tags = notmuch_message_get_tags (message); + notmuch_tags_valid (tags); + notmuch_tags_move_to_next (tags)) { - /* We ignore initial 'K'. */ - if (strcmp(tag, (term->string + 1)) == 0) { - message_excluded = TRUE; - break; + tag = notmuch_tags_get (tags); + /* Is message excluded? */ + for (notmuch_string_node_t *term = exclude_terms->head; + term != NULL; + term = term->next) + { + /* We ignore initial 'K'. */ + if (strcmp(tag, (term->string + 1)) == 0) { + message_excluded = TRUE; + break; + } } } } |