OUTPUT_SENDER = 1 << 5,
OUTPUT_RECIPIENTS = 1 << 6,
OUTPUT_COUNT = 1 << 7,
+ OUTPUT_ADDRESS = 1 << 8,
} output_t;
typedef enum {
typedef struct {
notmuch_database_t *notmuch;
- format_sel_t format_sel;
+ int format_sel;
sprinter_t *format;
- notmuch_exclude_t exclude;
+ int exclude;
notmuch_query_t *query;
- notmuch_sort_t sort;
- output_t output;
+ int sort;
+ int output;
int offset;
int limit;
int dupe;
GHashTable *addresses;
- dedup_t dedup;
+ int dedup;
} search_context_t;
typedef struct {
for (messages = notmuch_thread_get_messages (thread);
notmuch_messages_valid (messages);
- notmuch_messages_move_to_next (messages))
- {
+ notmuch_messages_move_to_next (messages)) {
notmuch_message_t *message = notmuch_messages_get (messages);
const char *mid = notmuch_message_get_message_id (message);
/* Determine which query buffer to extend */
*buf = talloc_asprintf_append_buffer (*buf, " %s", escaped);
else
*buf = talloc_strdup (thread, escaped);
- if (!*buf)
+ if (! *buf)
return -1;
}
talloc_free (escaped);
if (ctx->offset < 0) {
unsigned count;
notmuch_status_t status;
- status = notmuch_query_count_threads_st (ctx->query, &count);
+ status = notmuch_query_count_threads (ctx->query, &count);
if (print_status_query ("notmuch search", ctx->query, status))
return 1;
ctx->offset = 0;
}
- status = notmuch_query_search_threads_st (ctx->query, &threads);
- if (print_status_query("notmuch search", ctx->query, status))
+ status = notmuch_query_search_threads (ctx->query, &threads);
+ if (print_status_query ("notmuch search", ctx->query, status))
return 1;
format->begin_list (format);
for (i = 0;
notmuch_threads_valid (threads) && (ctx->limit < 0 || i < ctx->offset + ctx->limit);
- notmuch_threads_move_to_next (threads), i++)
- {
+ notmuch_threads_move_to_next (threads), i++) {
thread = notmuch_threads_get (threads);
if (i < ctx->offset) {
const char *subject = notmuch_thread_get_subject (thread);
const char *thread_id = notmuch_thread_get_thread_id (thread);
int matched = notmuch_thread_get_matched_messages (thread);
+ int files = notmuch_thread_get_total_files (thread);
int total = notmuch_thread_get_total_messages (thread);
const char *relative_date = NULL;
- notmuch_bool_t first_tag = TRUE;
+ bool first_tag = true;
format->begin_map (format);
relative_date = notmuch_time_relative_date (ctx_quote, date);
if (format->is_text_printer) {
- /* Special case for the text formatter */
- printf ("thread:%s %12s [%d/%d] %s; %s (",
+ /* Special case for the text formatter */
+ printf ("thread:%s %12s ",
thread_id,
- relative_date,
- matched,
- total,
- sanitize_string (ctx_quote, authors),
- sanitize_string (ctx_quote, subject));
+ relative_date);
+ if (total == files)
+ printf ("[%d/%d] %s; %s (",
+ matched,
+ total,
+ sanitize_string (ctx_quote, authors),
+ sanitize_string (ctx_quote, subject));
+ else
+ printf ("[%d/%d(%d)] %s; %s (",
+ matched,
+ total,
+ files,
+ sanitize_string (ctx_quote, authors),
+ sanitize_string (ctx_quote, subject));
+
} else { /* Structured Output */
format->map_key (format, "thread");
format->string (format, thread_id);
for (tags = notmuch_thread_get_tags (thread);
notmuch_tags_valid (tags);
- notmuch_tags_move_to_next (tags))
- {
+ notmuch_tags_move_to_next (tags)) {
const char *tag = notmuch_tags_get (tags);
if (format->is_text_printer) {
- /* Special case for the text formatter */
+ /* Special case for the text formatter */
if (first_tag)
- first_tag = FALSE;
+ first_tag = false;
else
fputc (' ', stdout);
fputs (tag, stdout);
return 0;
}
-static mailbox_t *new_mailbox (void *ctx, const char *name, const char *addr)
+static mailbox_t *
+new_mailbox (void *ctx, const char *name, const char *addr)
{
mailbox_t *mailbox;
return mailbox;
}
-static int mailbox_compare (const void *v1, const void *v2)
+static int
+mailbox_compare (const void *v1, const void *v2)
{
const mailbox_t *m1 = v1, *m2 = v2;
int ret;
return ret;
}
-/* Returns TRUE iff name and addr is duplicate. If not, stores the
+/* Returns true iff name and addr is duplicate. If not, stores the
* name/addr pair in order to detect subsequent duplicates. */
-static notmuch_bool_t
+static bool
is_duplicate (const search_context_t *ctx, const char *name, const char *addr)
{
char *key;
if (l) {
mailbox = l->data;
mailbox->count++;
- return TRUE;
+ return true;
}
mailbox = new_mailbox (ctx->format, name, addr);
if (! mailbox)
- return FALSE;
+ return false;
/*
* XXX: It would be more efficient to prepend to the list, but
if (list != g_list_append (list, mailbox))
INTERNAL_ERROR ("appending to list changed list head\n");
- return FALSE;
+ return false;
}
key = talloc_strdup (ctx->format, addr);
if (! key)
- return FALSE;
+ return false;
mailbox = new_mailbox (ctx->format, name, addr);
if (! mailbox)
- return FALSE;
+ return false;
list = g_list_append (NULL, mailbox);
if (! list)
- return FALSE;
+ return false;
g_hash_table_insert (ctx->addresses, key, list);
- return FALSE;
+ return false;
}
static void
/* name_addr has the name part quoted if necessary. Compare
* 'John Doe <john@doe.com>' vs. '"Doe, John" <john@doe.com>' */
- name_addr = internet_address_to_string (ia, FALSE);
+ name_addr = internet_address_to_string (ia, NULL, false);
if (format->is_text_printer) {
if (ctx->output & OUTPUT_COUNT) {
format->integer (format, count);
format->string (format, "\t");
}
- format->string (format, name_addr);
+ if (ctx->output & OUTPUT_ADDRESS)
+ format->string (format, addr);
+ else
+ format->string (format, name_addr);
format->separator (format);
} else {
format->begin_map (format);
if (value == NULL)
return;
- list = internet_address_list_parse_string (value);
+ list = internet_address_list_parse (NULL, value);
if (list == NULL)
return;
}
if (! mailbox)
- INTERNAL_ERROR("Empty list in address hash table\n");
+ INTERNAL_ERROR ("Empty list in address hash table\n");
/* The original count is no longer needed, so overwrite. */
mailbox->count = total;
filenames = notmuch_message_get_filenames (message);
while (notmuch_filenames_valid (filenames)) {
- notmuch_filenames_move_to_next (filenames);
- i++;
+ notmuch_filenames_move_to_next (filenames);
+ i++;
}
notmuch_filenames_destroy (filenames);
if (ctx->offset < 0) {
unsigned count;
notmuch_status_t status;
- status = notmuch_query_count_messages_st (ctx->query, &count);
+ status = notmuch_query_count_messages (ctx->query, &count);
if (print_status_query ("notmuch search", ctx->query, status))
return 1;
ctx->offset = 0;
}
- status = notmuch_query_search_messages_st (ctx->query, &messages);
+ status = notmuch_query_search_messages (ctx->query, &messages);
if (print_status_query ("notmuch search", ctx->query, status))
return 1;
for (i = 0;
notmuch_messages_valid (messages) && (ctx->limit < 0 || i < ctx->offset + ctx->limit);
- notmuch_messages_move_to_next (messages), i++)
- {
+ notmuch_messages_move_to_next (messages), i++) {
if (i < ctx->offset)
continue;
for (j = 1;
notmuch_filenames_valid (filenames);
- notmuch_filenames_move_to_next (filenames), j++)
- {
+ notmuch_filenames_move_to_next (filenames), j++) {
if (ctx->dupe < 0 || ctx->dupe == j) {
format->string (format, notmuch_filenames_get (filenames));
format->separator (format);
}
}
-
- notmuch_filenames_destroy( filenames );
+
+ notmuch_filenames_destroy ( filenames );
} else if (ctx->output == OUTPUT_MESSAGES) {
- /* special case 1 for speed */
- if (ctx->dupe <= 1 || ctx->dupe <= _count_filenames (message)) {
- format->set_prefix (format, "id");
- format->string (format,
- notmuch_message_get_message_id (message));
- format->separator (format);
- }
+ /* special case 1 for speed */
+ if (ctx->dupe <= 1 || ctx->dupe <= _count_filenames (message)) {
+ format->set_prefix (format, "id");
+ format->string (format,
+ notmuch_message_get_message_id (message));
+ format->separator (format);
+ }
} else {
if (ctx->output & OUTPUT_SENDER) {
const char *addrs;
tags = notmuch_database_get_all_tags (notmuch);
} else {
notmuch_status_t status;
- status = notmuch_query_search_messages_st (query, &messages);
+ status = notmuch_query_search_messages (query, &messages);
if (print_status_query ("notmuch search", query, status))
return 1;
for (;
notmuch_tags_valid (tags);
- notmuch_tags_move_to_next (tags))
- {
+ notmuch_tags_move_to_next (tags)) {
tag = notmuch_tags_get (tags);
format->string (format, tag);
break;
default:
/* this should never happen */
- INTERNAL_ERROR("no output format selected");
+ INTERNAL_ERROR ("no output format selected");
}
notmuch_exit_if_unsupported_format ();
if (ctx->exclude != NOTMUCH_EXCLUDE_FALSE) {
const char **search_exclude_tags;
size_t search_exclude_tags_length;
+ notmuch_status_t status;
+
+ search_exclude_tags = notmuch_config_get_search_exclude_tags (
+ config, &search_exclude_tags_length);
+
+ 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;
+ }
+ }
- search_exclude_tags = notmuch_config_get_search_exclude_tags
- (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]);
notmuch_query_set_omit_excluded (ctx->query, ctx->exclude);
}
};
static const notmuch_opt_desc_t common_options[] = {
- { NOTMUCH_OPT_KEYWORD, &search_context.sort, "sort", 's',
- (notmuch_keyword_t []){ { "oldest-first", NOTMUCH_SORT_OLDEST_FIRST },
- { "newest-first", NOTMUCH_SORT_NEWEST_FIRST },
- { 0, 0 } } },
- { NOTMUCH_OPT_KEYWORD, &search_context.format_sel, "format", 'f',
- (notmuch_keyword_t []){ { "json", NOTMUCH_FORMAT_JSON },
- { "sexp", NOTMUCH_FORMAT_SEXP },
- { "text", NOTMUCH_FORMAT_TEXT },
- { "text0", NOTMUCH_FORMAT_TEXT0 },
- { 0, 0 } } },
- { NOTMUCH_OPT_INT, ¬much_format_version, "format-version", 0, 0 },
- { 0, 0, 0, 0, 0 }
+ { .opt_keyword = &search_context.sort, .name = "sort", .keywords =
+ (notmuch_keyword_t []){ { "oldest-first", NOTMUCH_SORT_OLDEST_FIRST },
+ { "newest-first", NOTMUCH_SORT_NEWEST_FIRST },
+ { 0, 0 } } },
+ { .opt_keyword = &search_context.format_sel, .name = "format", .keywords =
+ (notmuch_keyword_t []){ { "json", NOTMUCH_FORMAT_JSON },
+ { "sexp", NOTMUCH_FORMAT_SEXP },
+ { "text", NOTMUCH_FORMAT_TEXT },
+ { "text0", NOTMUCH_FORMAT_TEXT0 },
+ { 0, 0 } } },
+ { .opt_int = ¬much_format_version, .name = "format-version" },
+ { }
};
int
int opt_index, ret;
notmuch_opt_desc_t options[] = {
- { NOTMUCH_OPT_KEYWORD, &ctx->output, "output", 'o',
- (notmuch_keyword_t []){ { "summary", OUTPUT_SUMMARY },
- { "threads", OUTPUT_THREADS },
- { "messages", OUTPUT_MESSAGES },
- { "files", OUTPUT_FILES },
- { "tags", OUTPUT_TAGS },
- { 0, 0 } } },
- { NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x',
- (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
- { "false", NOTMUCH_EXCLUDE_FALSE },
- { "flag", NOTMUCH_EXCLUDE_FLAG },
- { "all", NOTMUCH_EXCLUDE_ALL },
- { 0, 0 } } },
- { NOTMUCH_OPT_INT, &ctx->offset, "offset", 'O', 0 },
- { NOTMUCH_OPT_INT, &ctx->limit, "limit", 'L', 0 },
- { NOTMUCH_OPT_INT, &ctx->dupe, "duplicate", 'D', 0 },
- { NOTMUCH_OPT_INHERIT, (void *) &common_options, NULL, 0, 0 },
- { NOTMUCH_OPT_INHERIT, (void *) ¬much_shared_options, NULL, 0, 0 },
- { 0, 0, 0, 0, 0 }
+ { .opt_keyword = &ctx->output, .name = "output", .keywords =
+ (notmuch_keyword_t []){ { "summary", OUTPUT_SUMMARY },
+ { "threads", OUTPUT_THREADS },
+ { "messages", OUTPUT_MESSAGES },
+ { "files", OUTPUT_FILES },
+ { "tags", OUTPUT_TAGS },
+ { 0, 0 } } },
+ { .opt_keyword = &ctx->exclude, .name = "exclude", .keywords =
+ (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
+ { "false", NOTMUCH_EXCLUDE_FALSE },
+ { "flag", NOTMUCH_EXCLUDE_FLAG },
+ { "all", NOTMUCH_EXCLUDE_ALL },
+ { 0, 0 } } },
+ { .opt_int = &ctx->offset, .name = "offset" },
+ { .opt_int = &ctx->limit, .name = "limit" },
+ { .opt_int = &ctx->dupe, .name = "duplicate" },
+ { .opt_inherit = common_options },
+ { .opt_inherit = notmuch_shared_options },
+ { }
};
ctx->output = OUTPUT_SUMMARY;
if (ctx->output != OUTPUT_FILES && ctx->output != OUTPUT_MESSAGES &&
ctx->dupe != -1) {
- fprintf (stderr, "Error: --duplicate=N is only supported with --output=files and --output=messages.\n");
- return EXIT_FAILURE;
+ fprintf (stderr, "Error: --duplicate=N is only supported with --output=files and --output=messages.\n");
+ return EXIT_FAILURE;
}
if (_notmuch_search_prepare (ctx, config,
int opt_index, ret;
notmuch_opt_desc_t options[] = {
- { NOTMUCH_OPT_KEYWORD_FLAGS, &ctx->output, "output", 'o',
- (notmuch_keyword_t []){ { "sender", OUTPUT_SENDER },
- { "recipients", OUTPUT_RECIPIENTS },
- { "count", OUTPUT_COUNT },
- { 0, 0 } } },
- { NOTMUCH_OPT_KEYWORD, &ctx->exclude, "exclude", 'x',
- (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
- { "false", NOTMUCH_EXCLUDE_FALSE },
- { 0, 0 } } },
- { NOTMUCH_OPT_KEYWORD, &ctx->dedup, "deduplicate", 'D',
- (notmuch_keyword_t []){ { "no", DEDUP_NONE },
- { "mailbox", DEDUP_MAILBOX },
- { "address", DEDUP_ADDRESS },
- { 0, 0 } } },
- { NOTMUCH_OPT_INHERIT, (void *) &common_options, NULL, 0, 0 },
- { NOTMUCH_OPT_INHERIT, (void *) ¬much_shared_options, NULL, 0, 0 },
- { 0, 0, 0, 0, 0 }
+ { .opt_flags = &ctx->output, .name = "output", .keywords =
+ (notmuch_keyword_t []){ { "sender", OUTPUT_SENDER },
+ { "recipients", OUTPUT_RECIPIENTS },
+ { "count", OUTPUT_COUNT },
+ { "address", OUTPUT_ADDRESS },
+ { 0, 0 } } },
+ { .opt_keyword = &ctx->exclude, .name = "exclude", .keywords =
+ (notmuch_keyword_t []){ { "true", NOTMUCH_EXCLUDE_TRUE },
+ { "false", NOTMUCH_EXCLUDE_FALSE },
+ { 0, 0 } } },
+ { .opt_keyword = &ctx->dedup, .name = "deduplicate", .keywords =
+ (notmuch_keyword_t []){ { "no", DEDUP_NONE },
+ { "mailbox", DEDUP_MAILBOX },
+ { "address", DEDUP_ADDRESS },
+ { 0, 0 } } },
+ { .opt_inherit = common_options },
+ { .opt_inherit = notmuch_shared_options },
+ { }
};
opt_index = parse_arguments (argc, argv, options, 1);