lib: make notmuch_query_add_tag_exclude return a status value

Since this is an ABI breaking change, but we already bumped the SONAME
for the next release
This commit is contained in:
David Bremner 2017-02-18 11:08:04 -04:00
parent 3721bd45d7
commit 242d5a3ed5
5 changed files with 49 additions and 19 deletions

View file

@ -179,6 +179,11 @@ typedef enum _notmuch_status {
* passed to a function expecting an absolute path. * passed to a function expecting an absolute path.
*/ */
NOTMUCH_STATUS_PATH_ERROR, NOTMUCH_STATUS_PATH_ERROR,
/**
* The requested operation was ignored. Depending on the function,
* this may not be an actual error.
*/
NOTMUCH_STATUS_IGNORED,
/** /**
* One of the arguments violates the preconditions for the * One of the arguments violates the preconditions for the
* function, in a way not covered by a more specific argument. * function, in a way not covered by a more specific argument.
@ -812,10 +817,20 @@ notmuch_query_get_sort (const notmuch_query_t *query);
/** /**
* Add a tag that will be excluded from the query results by default. * Add a tag that will be excluded from the query results by default.
* This exclusion will be overridden if this tag appears explicitly in * This exclusion will be ignored if this tag appears explicitly in
* the query. * the query.
*
* @returns
*
* NOTMUCH_STATUS_SUCCESS: excluded was added successfully.
*
* NOTMUCH_STATUS_XAPIAN_EXCEPTION: a Xapian exception occured.
* Most likely a problem lazily parsing the query string.
*
* NOTMUCH_STATUS_IGNORED: tag is explicitely present in the query, so
* not excluded.
*/ */
void notmuch_status_t
notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag); notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag);
/** /**

View file

@ -177,29 +177,22 @@ notmuch_query_get_sort (const notmuch_query_t *query)
return query->sort; return query->sort;
} }
void notmuch_status_t
notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag) notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag)
{ {
notmuch_status_t status; notmuch_status_t status;
char *term; char *term;
status = _notmuch_query_ensure_parsed (query); status = _notmuch_query_ensure_parsed (query);
/* The following is not ideal error handling, but to avoid
* breaking the ABI, we can live with it for now. In particular at
* least in the notmuch CLI, any syntax error in the query is
* caught in a later call to _notmuch_query_ensure_parsed with a
* better error path.
*
* TODO: add status return to this function.
*/
if (status) if (status)
return; return status;
term = talloc_asprintf (query, "%s%s", _find_prefix ("tag"), tag); term = talloc_asprintf (query, "%s%s", _find_prefix ("tag"), tag);
if (query->terms.count(term) != 0) if (query->terms.count(term) != 0)
return; /* XXX report ignoring exclude? */ return NOTMUCH_STATUS_IGNORED;
_notmuch_string_list_append (query->exclude_terms, term); _notmuch_string_list_append (query->exclude_terms, term);
return NOTMUCH_STATUS_SUCCESS;
} }
/* We end up having to call the destructors explicitly because we had /* We end up having to call the destructors explicitly because we had

View file

@ -87,8 +87,13 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
return -1; return -1;
} }
for (i = 0; i < exclude_tags_length; i++) for (i = 0; i < exclude_tags_length; i++) {
notmuch_query_add_tag_exclude (query, exclude_tags[i]); status = notmuch_query_add_tag_exclude (query, exclude_tags[i]);
if (status && status != NOTMUCH_STATUS_IGNORED) {
print_status_query ("notmuch count", query, status);
return -1;
}
}
switch (output) { switch (output) {
case OUTPUT_MESSAGES: case OUTPUT_MESSAGES:

View file

@ -735,11 +735,19 @@ _notmuch_search_prepare (search_context_t *ctx, notmuch_config_t *config, int ar
if (ctx->exclude != NOTMUCH_EXCLUDE_FALSE) { if (ctx->exclude != NOTMUCH_EXCLUDE_FALSE) {
const char **search_exclude_tags; const char **search_exclude_tags;
size_t search_exclude_tags_length; size_t search_exclude_tags_length;
notmuch_status_t status;
search_exclude_tags = notmuch_config_get_search_exclude_tags search_exclude_tags = notmuch_config_get_search_exclude_tags
(config, &search_exclude_tags_length); (config, &search_exclude_tags_length);
for (i = 0; i < search_exclude_tags_length; i++)
notmuch_query_add_tag_exclude (ctx->query, search_exclude_tags[i]); for (i = 0; i < search_exclude_tags_length; i++) {
status = notmuch_query_add_tag_exclude (ctx->query, search_exclude_tags[i]);
if (status && status != NOTMUCH_STATUS_IGNORED) {
print_status_query ("notmuch search", ctx->query, status);
return EXIT_FAILURE;
}
}
notmuch_query_set_omit_excluded (ctx->query, ctx->exclude); notmuch_query_set_omit_excluded (ctx->query, ctx->exclude);
} }

View file

@ -1177,11 +1177,19 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
const char **search_exclude_tags; const char **search_exclude_tags;
size_t search_exclude_tags_length; size_t search_exclude_tags_length;
unsigned int i; unsigned int i;
notmuch_status_t status;
search_exclude_tags = notmuch_config_get_search_exclude_tags search_exclude_tags = notmuch_config_get_search_exclude_tags
(config, &search_exclude_tags_length); (config, &search_exclude_tags_length);
for (i = 0; i < search_exclude_tags_length; i++)
notmuch_query_add_tag_exclude (query, search_exclude_tags[i]); for (i = 0; i < search_exclude_tags_length; i++) {
status = notmuch_query_add_tag_exclude (query, search_exclude_tags[i]);
if (status && status != NOTMUCH_STATUS_IGNORED) {
print_status_query ("notmuch show", query, status);
ret = -1;
goto DONE;
}
}
if (exclude == EXCLUDE_FALSE) { if (exclude == EXCLUDE_FALSE) {
notmuch_query_set_omit_excluded (query, FALSE); notmuch_query_set_omit_excluded (query, FALSE);
@ -1191,6 +1199,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
ret = do_show (config, query, formatter, sprinter, &params); ret = do_show (config, query, formatter, sprinter, &params);
} }
DONE:
notmuch_crypto_cleanup (&params.crypto); notmuch_crypto_cleanup (&params.crypto);
notmuch_query_destroy (query); notmuch_query_destroy (query);
notmuch_database_destroy (notmuch); notmuch_database_destroy (notmuch);