147 if (c_nm_default_url)
148 snprintf(url, len,
"%s", c_nm_default_url);
150 snprintf(url, len,
"notmuch://%s", c_folder);
216 return edata->virtual_id;
283 if (!c_nm_query_window_current_search ||
284 (strcmp(query, c_nm_query_window_current_search) != 0))
290 buf, buflen, c_nm_query_window_enable, c_nm_query_window_duration,
291 c_nm_query_window_current_position, c_nm_query_window_current_search,
292 c_nm_query_window_timebase, c_nm_query_window_or_terms);
311 _(
"Invalid nm_query_window_timebase value (valid values are: hour, day, week, month, year)"));
354 if (strcmp(item->
name,
"limit") == 0)
361 else if (strcmp(item->
name,
"type") == 0)
363 else if (strcmp(item->
name,
"query") == 0)
372 char buf[1024] = { 0 };
379 if (!strstr(mdata->
db_query,
"date:") &&
410 if (!c_nm_exclude_tags || !query)
419 notmuch_query_add_tag_exclude(query, *tag);
422 notmuch_query_set_omit_excluded(query, 1);
439 notmuch_database_t *db =
nm_db_get(m, writable);
445 notmuch_query_t *q = notmuch_query_create(db, str);
450 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
468 char *new_tags = NULL;
469 char *old_tags = NULL;
473 for (notmuch_tags_t *
tags = notmuch_message_get_tags(msg);
474 tags && notmuch_tags_valid(
tags); notmuch_tags_move_to_next(
tags))
476 const char *t = notmuch_tags_get(
tags);
477 if (!t || (*t ==
'\0'))
485 if (new_tags && old_tags && (strcmp(old_tags, new_tags) == 0))
522 char *p = strrchr(
path,
'/');
523 if (p && ((p -
path) > 3) &&
539 for (; (p >
path) && (*(p - 1) ==
'/'); p--)
559 char *p = strrchr(
path,
'/');
561 if (p && ((p -
path) > 3) &&
566 for (; (p >
path) && (*(p - 1) ==
'/'); p--)
592 snprintf(mid, sz,
"<%s>",
id);
614 const char *
id = notmuch_message_get_message_id(msg);
650 const char *name = NULL;
652 for (notmuch_filenames_t *ls = notmuch_message_get_filenames(msg);
653 ls && notmuch_filenames_valid(ls); notmuch_filenames_move_to_next(ls))
655 name = notmuch_filenames_get(ls);
675 mdata->ignmsgcount = 0;
706 const char *
id = notmuch_message_get_message_id(msg);
736 notmuch_message_t *msg,
bool dedup)
742 char *newpath = NULL;
743 struct Email *e = NULL;
751 notmuch_message_get_message_id(msg));
773 if (access(
path, F_OK) == 0)
849 notmuch_query_t *q, notmuch_message_t *top,
bool dedup)
851 notmuch_messages_t *msgs = NULL;
853 for (msgs = notmuch_message_get_replies(top); notmuch_messages_valid(msgs);
854 notmuch_messages_move_to_next(msgs))
856 notmuch_message_t *nm = notmuch_messages_get(msgs);
860 notmuch_message_destroy(nm);
876 notmuch_query_t *q, notmuch_thread_t *
thread,
bool dedup)
878 notmuch_messages_t *msgs = NULL;
880 for (msgs = notmuch_thread_get_toplevel_messages(
thread);
881 notmuch_messages_valid(msgs); notmuch_messages_move_to_next(msgs))
883 notmuch_message_t *nm = notmuch_messages_get(msgs);
886 notmuch_message_destroy(nm);
904 notmuch_messages_t *msgs = NULL;
906#if LIBNOTMUCH_CHECK_VERSION(5, 0, 0)
907 if (notmuch_query_search_messages(query, &msgs) != NOTMUCH_STATUS_SUCCESS)
909#elif LIBNOTMUCH_CHECK_VERSION(4, 3, 0)
910 if (notmuch_query_search_messages_st(query, &msgs) != NOTMUCH_STATUS_SUCCESS)
913 msgs = notmuch_query_search_messages(query);
942 for (; notmuch_messages_valid(msgs) && ((limit == 0) || (m->
msg_count < limit));
943 notmuch_messages_move_to_next(msgs))
951 notmuch_message_t *nm = notmuch_messages_get(msgs);
953 notmuch_message_destroy(nm);
974 notmuch_threads_t *threads = NULL;
975#if LIBNOTMUCH_CHECK_VERSION(5, 0, 0)
976 if (notmuch_query_search_threads(query, &threads) != NOTMUCH_STATUS_SUCCESS)
978#elif LIBNOTMUCH_CHECK_VERSION(4, 3, 0)
979 if (notmuch_query_search_threads_st(query, &threads) != NOTMUCH_STATUS_SUCCESS)
982 threads = notmuch_query_search_threads(query);
1009 for (; notmuch_threads_valid(threads) && ((limit == 0) || (m->
msg_count < limit));
1010 notmuch_threads_move_to_next(threads))
1018 notmuch_thread_t *thread = notmuch_threads_get(threads);
1020 notmuch_thread_destroy(thread);
1036 notmuch_message_t *msg = NULL;
1042 notmuch_database_find_message(db,
id, &msg);
1055 const char *possible_match_tag = NULL;
1056 notmuch_tags_t *tags = NULL;
1058 for (tags = notmuch_message_get_tags(msg); notmuch_tags_valid(tags);
1059 notmuch_tags_move_to_next(tags))
1061 possible_match_tag = notmuch_tags_get(tags);
1097 notmuch_message_freeze(msg);
1100 char **tag_elem = NULL;
1103 char *tag = *tag_elem;
1108 notmuch_message_remove_tag(msg, tag + 1);
1110 else if (tag[0] ==
'!')
1115 notmuch_message_remove_tag(msg, tag + 1);
1119 notmuch_message_add_tag(msg, tag + 1);
1125 notmuch_message_add_tag(msg, (tag[0] ==
'+') ? tag + 1 : tag);
1129 notmuch_message_thaw(msg);
1156 char **tag_elem = NULL;
1159 char *tag = *tag_elem;
1164 if (strcmp(tag, c_nm_unread_tag) == 0)
1166 else if (strcmp(tag, c_nm_replied_tag) == 0)
1168 else if (strcmp(tag, c_nm_flagged_tag) == 0)
1173 tag = (tag[0] ==
'+') ? tag + 1 : tag;
1174 if (strcmp(tag, c_nm_unread_tag) == 0)
1176 else if (strcmp(tag, c_nm_replied_tag) == 0)
1178 else if (strcmp(tag, c_nm_flagged_tag) == 0)
1205 char *p = strrchr(folder,
'/');
1217 p = strrchr(folder,
'/');
1222 p = strchr(filename,
':');
1229 snprintf(buf, buflen,
"%s/%s/%s%s", folder,
1230 (e->
read || e->
old) ?
"cur" :
"new", filename, suffix);
1232 if (strcmp(old, buf) == 0)
1235 if (rename(old, buf) != 0)
1259 notmuch_database_t *db =
nm_db_get(m,
true);
1263 notmuch_message_t *msg = NULL;
1264 notmuch_status_t st = notmuch_database_find_message_by_filename(db, path, &msg);
1274 notmuch_filenames_t *ls = NULL;
1275 st = notmuch_database_remove_message(db, path);
1278 case NOTMUCH_STATUS_SUCCESS:
1282 case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
1285 for (ls = notmuch_message_get_filenames(msg);
1286 ls && notmuch_filenames_valid(ls); notmuch_filenames_move_to_next(ls))
1288 path = notmuch_filenames_get(ls);
1292 notmuch_database_remove_message(db, path);
1300 notmuch_message_destroy(msg);
1316 const char *new_file,
struct Email *e)
1322 notmuch_database_t *db =
nm_db_get(m,
true);
1323 if (!db || !new_file || !old_file || (access(new_file, F_OK) != 0))
1327 notmuch_status_t st;
1328 notmuch_filenames_t *ls = NULL;
1329 notmuch_message_t *msg = NULL;
1337#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1338 st = notmuch_database_index_file(db, new_file, NULL, &msg);
1340 st = notmuch_database_add_message(db, new_file, &msg);
1343 if ((st != NOTMUCH_STATUS_SUCCESS) && (st != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID))
1350 st = notmuch_database_remove_message(db, old_file);
1353 case NOTMUCH_STATUS_SUCCESS:
1355 case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
1357 notmuch_message_destroy(msg);
1359 notmuch_database_find_message_by_filename(db, new_file, &msg);
1361 for (ls = notmuch_message_get_filenames(msg);
1362 msg && ls && notmuch_filenames_valid(ls); notmuch_filenames_move_to_next(ls))
1364 const char *path = notmuch_filenames_get(ls);
1367 if (strcmp(new_file, path) == 0)
1375 notmuch_database_remove_message(db, path);
1376#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1377 notmuch_database_index_file(db, newpath, NULL, NULL);
1379 notmuch_database_add_message(db, newpath, NULL);
1383 notmuch_message_destroy(msg);
1385 notmuch_database_find_message_by_filename(db, new_file, &msg);
1386 st = NOTMUCH_STATUS_SUCCESS;
1393 if ((st == NOTMUCH_STATUS_SUCCESS) && e && msg)
1395 notmuch_message_maildir_flags_to_tags(msg);
1406 notmuch_message_destroy(msg);
1419static unsigned int count_query(notmuch_database_t *db,
const char *qstr,
int limit)
1421 notmuch_query_t *q = notmuch_query_create(db, qstr);
1425 unsigned int res = 0;
1428#if LIBNOTMUCH_CHECK_VERSION(5, 0, 0)
1429 if (notmuch_query_count_messages(q, &res) != NOTMUCH_STATUS_SUCCESS)
1431#elif LIBNOTMUCH_CHECK_VERSION(4, 3, 0)
1432 if (notmuch_query_count_messages_st(q, &res) != NOTMUCH_STATUS_SUCCESS)
1435 res = notmuch_query_count_messages(q);
1437 notmuch_query_destroy(q);
1440 if ((limit > 0) && (res > limit))
1458 return edata->folder;
1481 return full_folder + strlen(db_path);
1500 notmuch_query_t *q = NULL;
1501 notmuch_database_t *db = NULL;
1502 notmuch_message_t *msg = NULL;
1512 const char *
id = notmuch_message_get_thread_id(msg);
1520 q = notmuch_query_create(db, qstr);
1525 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
1536 notmuch_query_destroy(q);
1543 mdata->oldmsgcount = 0;
1564 bool using_default_data =
false;
1575 using_default_data =
true;
1585 added = snprintf(url,
sizeof(url),
"%s%s?type=%s&query=",
NmUrlProtocol,
1590 added = snprintf(url,
sizeof(url),
"%s%s?type=%s&limit=%d&query=",
NmUrlProtocol,
1595 if (added >=
sizeof(url))
1604 buf[buflen - 1] =
'\0';
1606 if (using_default_data)
1622 return c_nm_query_window_enable || (c_nm_query_window_duration > 0);
1637 if (c_nm_query_window_current_position != 0)
1640 c_nm_query_window_current_position - 1, NULL);
1658 c_nm_query_window_current_position + 1, NULL);
1680 notmuch_database_t *db =
nm_db_get(m,
false);
1683 if (!db || !orig_str)
1686 char *new_str = NULL;
1693 notmuch_query_t *q = notmuch_query_create(db, new_str);
1695 switch (
mdata->query_type)
1705 rc = notmuch_messages_valid(messages);
1706 notmuch_messages_destroy(messages);
1716 rc = notmuch_threads_valid(threads);
1717 notmuch_threads_destroy(threads);
1722 notmuch_query_destroy(q);
1725 new_str, rc ?
"true" :
"false");
1740 const char *new_file,
struct Email *e)
1744 if (!
mdata || !new_file)
1767 struct Url *url = NULL;
1768 const char *db_filename = NULL;
1769 char *db_query = NULL;
1770 notmuch_database_t *db = NULL;
1773 int limit = c_nm_db_limit;
1785 if (item->
value && (strcmp(item->
name,
"query") == 0))
1786 db_query = item->
value;
1787 else if (item->
value && (strcmp(item->
name,
"limit") == 0))
1790 if (!mutt_str_atoi_full(item->
value, &limit))
1801 db_filename = url->
path;
1873 notmuch_database_t *db = NULL;
1874 notmuch_status_t st;
1875 notmuch_message_t *msg = NULL;
1894 if (!path || !
mdata || (access(path, F_OK) != 0))
1905#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1906 st = notmuch_database_index_file(db, path, NULL, &msg);
1908 st = notmuch_database_add_message(db, path, &msg);
1911 if ((st != NOTMUCH_STATUS_SUCCESS) && (st != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID))
1917 if ((st == NOTMUCH_STATUS_SUCCESS) && msg)
1919 notmuch_message_maildir_flags_to_tags(msg);
1927 if (c_nm_record_tags)
1934 notmuch_message_destroy(msg);
1959 notmuch_database_t *db = NULL;
1960 notmuch_tags_t *tags = NULL;
1961 const char *tag = NULL;
1964 if (!(db =
nm_db_get(m,
false)) || !(tags = notmuch_database_get_all_tags(db)))
1970 while (notmuch_tags_valid(tags))
1972 tag = notmuch_tags_get(tags);
1980 notmuch_tags_move_to_next(tags);
1986 notmuch_tags_destroy(tags);
2034 notmuch_query_t *q =
get_query(m,
false);
2038 switch (
mdata->query_type)
2050 notmuch_query_destroy(q);
2058 mdata->oldmsgcount = 0;
2078 bool occult =
false;
2089 notmuch_query_t *q =
get_query(m,
false);
2110#if LIBNOTMUCH_CHECK_VERSION(5, 0, 0)
2113#elif LIBNOTMUCH_CHECK_VERSION(4, 3, 0)
2120 for (
int i = 0; notmuch_messages_valid(msgs) && ((limit == 0) || (i < limit));
2121 notmuch_messages_move_to_next(msgs), i++)
2123 notmuch_message_t *msg = notmuch_messages_get(msgs);
2130 notmuch_message_destroy(msg);
2150 struct Email e_tmp = { 0 };
2161 notmuch_message_destroy(msg);
2183 notmuch_query_destroy(q);
2212 struct Progress *progress = NULL;
2214 bool changed =
false;
2222 snprintf(msg,
sizeof(msg),
_(
"Writing %s..."),
mailbox_path(m));
2228 int mh_sync_errors = 0;
2247 old_file[
sizeof(old_file) - 1] =
'\0';
2261 notmuch_database_t *db =
nm_db_get(m,
true);
2282 mh_sync_errors += 1;
2289 if (e->
deleted || (strcmp(old_file, new_file) != 0))
2293 else if (*new_file && *old_file && (
rename_filename(m, old_file, new_file, e) == 0))
2300 if (mh_sync_errors > 0)
2302 mutt_error(ngettext(
"Unable to sync %d message due to external mailbox modification",
2303 "Unable to sync %d messages due to external mailbox modification",
2349 snprintf(
path,
sizeof(
path),
"%s/%s", folder, e->
path);
2351 msg->
fp = fopen(
path,
"r");
2357 return msg->
fp != NULL;
2386 NULL, NULL, NULL) != 0)
2405 notmuch_database_t *db = NULL;
2406 notmuch_message_t *msg = NULL;
2480 .mbox_open_append = NULL,
2489 .msg_padding_size = NULL,
2490 .msg_save_hcache = NULL,
2497 .path_is_empty = NULL,
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
size_t mutt_buffer_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
void mutt_buffer_reset(struct Buffer *buf)
Reset an existing Buffer.
Functions to parse commands in a config file.
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Convenience wrapper for the config headers.
void commands_register(const struct Command *cmds, const size_t num_cmds)
Add commands to Commands array.
Convenience wrapper for the core headers.
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
void mutt_set_header_color(struct Mailbox *m, struct Email *e)
Select a colour for a message.
void email_free(struct Email **ptr)
Free an Email.
Structs that make up an email.
int mutt_buffer_get_field(const char *field, struct Buffer *buf, CompletionFlags complete, bool multiple, struct Mailbox *m, char ***files, int *numfiles)
Ask the user for a string.
int mutt_file_fclose(FILE **fp)
Close a FILE handle (and NULL the pointer)
SIG_ATOMIC_VOLATILE_T SigInt
true after SIGINT is received
enum CommandResult parse_unmailboxes(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Parse the 'unmailboxes' command - Implements Command::parse() -.
enum CommandResult parse_mailboxes(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Parse the 'mailboxes' command - Implements Command::parse() -.
#define mutt_message(...)
#define mutt_debug(LEVEL,...)
static bool nm_ac_add(struct Account *a, struct Mailbox *m)
Add a Mailbox to an Account - Implements MxOps::ac_add() -.
static bool nm_ac_owns_path(struct Account *a, const char *path)
Check whether an Account owns a Mailbox path - Implements MxOps::ac_owns_path() -.
struct MxOps MxNotmuchOps
Notmuch Mailbox - Implements MxOps -.
static enum MxStatus nm_mbox_check_stats(struct Mailbox *m, uint8_t flags)
Check the Mailbox statistics - Implements MxOps::mbox_check_stats() -.
static enum MxStatus nm_mbox_check(struct Mailbox *m)
Check for new mail - Implements MxOps::mbox_check() -.
static enum MxStatus nm_mbox_close(struct Mailbox *m)
Close a Mailbox - Implements MxOps::mbox_close() -.
static enum MxOpenReturns nm_mbox_open(struct Mailbox *m)
Open a Mailbox - Implements MxOps::mbox_open() -.
static enum MxStatus nm_mbox_sync(struct Mailbox *m)
Save changes to the Mailbox - Implements MxOps::mbox_sync() -.
static int nm_msg_close(struct Mailbox *m, struct Message *msg)
Close an email - Implements MxOps::msg_close() -.
static int nm_msg_commit(struct Mailbox *m, struct Message *msg)
Save changes to an email - Implements MxOps::msg_commit() -.
bool maildir_msg_open_new(struct Mailbox *m, struct Message *msg, const struct Email *e)
Open a new message in a Mailbox - Implements MxOps::msg_open_new() -.
static bool nm_msg_open(struct Mailbox *m, struct Message *msg, int msgno)
Open an email message in a Mailbox - Implements MxOps::msg_open() -.
static int nm_path_canon(char *buf, size_t buflen)
Canonicalise a Mailbox path - Implements MxOps::path_canon() -.
static int nm_path_parent(char *buf, size_t buflen)
Find the parent of a Mailbox path - Implements MxOps::path_parent() -.
static int nm_path_pretty(char *buf, size_t buflen, const char *folder)
Abbreviate a Mailbox path - Implements MxOps::path_pretty() -.
enum MailboxType nm_path_probe(const char *path, const struct stat *st)
Is this a Notmuch Mailbox? - Implements MxOps::path_probe() -.
void * mutt_hash_find(const struct HashTable *table, const char *strkey)
Find the HashElem data in a Hash Table element using a key.
Header cache multiplexor.
int mutt_hcache_store(struct HeaderCache *hc, const char *key, size_t keylen, struct Email *e, uint32_t uidvalidity)
Multiplexor for StoreOps::store.
void mutt_hcache_close(struct HeaderCache *hc)
Multiplexor for StoreOps::close.
struct HeaderCache * mutt_hcache_open(const char *path, const char *folder, hcache_namer_t namer)
Multiplexor for StoreOps::open.
struct HCacheEntry mutt_hcache_fetch(struct HeaderCache *hc, const char *key, size_t keylen, uint32_t uidvalidity)
Multiplexor for StoreOps::fetch.
GUI manage the main index (list of emails)
@ LL_DEBUG2
Log at debug level 2.
@ LL_DEBUG1
Log at debug level 1.
void mailbox_size_add(struct Mailbox *m, const struct Email *e)
Add an email's size to the total size of a Mailbox.
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
@ NT_MAILBOX_INVALID
Email list was changed.
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
MailboxType
Supported mailbox formats.
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
@ MUTT_UNKNOWN
Mailbox wasn't recognised.
@ MUTT_MAILDIR
'Maildir' Mailbox type
void maildir_edata_free(void **ptr)
Free the private Email data - Implements Email::edata_free()
struct MaildirEmailData * maildir_edata_new(void)
Create a new MaildirEmailData object.
Maildir-specific Email data.
Maildir local mailbox type.
FILE * maildir_open_find_message(const char *folder, const char *msg, char **newname)
Find a message by name.
bool maildir_update_flags(struct Mailbox *m, struct Email *e_old, struct Email *e_new)
Update the mailbox flags.
struct Email * maildir_parse_message(enum MailboxType type, const char *fname, bool is_old, struct Email *e)
Actually parse a maildir message.
void maildir_gen_flags(char *dest, size_t destlen, struct Email *e)
Generate the Maildir flags for an email.
struct Email * maildir_parse_stream(enum MailboxType type, FILE *fp, const char *fname, bool is_old, struct Email *e)
Parse a Maildir message.
bool maildir_sync_mailbox_message(struct Mailbox *m, int msgno, struct HeaderCache *hc)
Save changes to the mailbox.
void maildir_parse_flags(struct Email *e, const char *path)
Parse Maildir file flags.
void * mutt_mem_malloc(size_t size)
Allocate memory on the heap.
#define mutt_array_size(x)
Convenience wrapper for the library headers.
char * mutt_strn_dup(const char *begin, size_t len)
Duplicate a sub-string.
char * mutt_str_dup(const char *str)
Copy a string, safely.
int mutt_str_asprintf(char **strp, const char *fmt,...)
void mutt_str_append_item(char **str, const char *item, char sep)
Add string to another separated by sep.
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
bool mutt_strn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings (to a maximum), safely.
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
size_t mutt_istr_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix, ignoring case.
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Many unsorted constants and some structs.
#define MUTT_COMP_NM_TAG
Notmuch tag +/- mode.
@ MUTT_READ
Messages that have been read.
@ MUTT_FLAG
Flagged messages.
@ MUTT_REPLIED
Messages that have been replied to.
struct HashTable * mutt_make_id_hash(struct Mailbox *m)
Create a Hash Table for message-ids.
Create/manipulate threading in emails.
bool mx_mbox_ac_link(struct Mailbox *m)
Link a Mailbox to an existing or new Account.
void mx_alloc_memory(struct Mailbox *m)
Create storage for the emails.
struct Mailbox * mx_path_resolve(const char *path)
Get a Mailbox for a path.
MxOpenReturns
Return values for mbox_open()
@ MX_OPEN_ERROR
Open failed with an error.
@ MX_OPEN_ABORT
Open was aborted.
@ MX_OPEN_OK
Open succeeded.
MxStatus
Return values from mbox_check(), mbox_check_stats(), mbox_snc(), and mbox_close()
@ MX_STATUS_ERROR
An error occurred.
@ MX_STATUS_OK
No changes.
@ MX_STATUS_FLAGS
Nondestructive flags change (IMAP)
@ MX_STATUS_REOPENED
Mailbox was reopened.
@ MX_STATUS_NEW_MAIL
New mail received in Mailbox.
struct NmAccountData * nm_adata_new(void)
Allocate and initialise a new NmAccountData structure.
void nm_adata_free(void **ptr)
Free the private Account data - Implements Account::adata_free()
notmuch_database_t * nm_db_get(struct Mailbox *m, bool writable)
Get the Notmuch database.
int nm_db_trans_begin(struct Mailbox *m)
Start a Notmuch database transaction.
notmuch_database_t * nm_db_do_open(const char *filename, bool writable, bool verbose)
Open a Notmuch database.
const char * nm_db_get_filename(struct Mailbox *m)
Get the filename of the Notmuch database.
int nm_db_get_mtime(struct Mailbox *m, time_t *mtime)
Get the database modification time.
int nm_db_release(struct Mailbox *m)
Close the Notmuch database.
void nm_db_free(notmuch_database_t *db)
Decoupled way to close a Notmuch database.
int nm_db_trans_end(struct Mailbox *m)
End a database transaction.
struct NmEmailData * nm_edata_get(struct Email *e)
Get the Notmuch Email data.
struct NmEmailData * nm_edata_new(void)
Create a new NmEmailData for an email.
struct NmMboxData * nm_mdata_new(const char *url)
Create a new NmMboxData object from a query.
void nm_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free()
struct NmMboxData * nm_mdata_get(struct Mailbox *m)
Get the Notmuch Mailbox data.
Notmuch-specific Mailbox data.
static notmuch_threads_t * get_threads(notmuch_query_t *query)
Load threads for a query.
static char * get_query_string(struct NmMboxData *mdata, bool window)
Builds the notmuch vfolder search string.
static char * nm_get_default_url(void)
Create a Mailbox with default Notmuch settings.
int nm_update_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Change the filename.
void nm_query_window_reset(void)
Resets the vfolder window position to the present.
static char * email_get_id(struct Email *e)
Get the unique Notmuch Id.
static void apply_exclude_tags(notmuch_query_t *query)
Exclude the configured tags.
static char * email_get_fullpath(struct Email *e, char *buf, size_t buflen)
Get the full path of an email.
static bool windowed_query_from_query(const char *query, char *buf, size_t buflen)
Transforms a vfolder search query into a windowed one.
int nm_get_all_tags(struct Mailbox *m, const char **tag_list, int *tag_count)
Fill a list with all notmuch tags.
static unsigned int count_query(notmuch_database_t *db, const char *qstr, int limit)
Count the results of a query.
static int init_mailbox(struct Mailbox *m)
Add Notmuch data to the Mailbox.
static void append_replies(struct HeaderCache *h, struct Mailbox *m, notmuch_query_t *q, notmuch_message_t *top, bool dedup)
Add all the replies to a given messages into the display.
static int rename_maildir_filename(const char *old, char *buf, size_t buflen, struct Email *e)
Rename a Maildir file.
static void sync_email_path_with_nm(struct Email *e, notmuch_message_t *msg)
Synchronize Neomutt's Email path with notmuch.
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
static int init_email(struct Email *e, const char *path, notmuch_message_t *msg)
Set up an email's Notmuch data.
static void nm_hcache_close(struct HeaderCache *h)
Close the header cache.
static int get_limit(struct NmMboxData *mdata)
Get the database limit.
char * nm_email_get_folder_rel_db(struct Mailbox *m, struct Email *e)
Get the folder for a Email from the same level as the notmuch database.
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
static struct Mailbox * get_default_mailbox(void)
Get Mailbox for notmuch without any parameters.
int nm_record_message(struct Mailbox *m, char *path, struct Email *e)
Add a message to the Notmuch database.
static const struct Command NmCommands[]
Notmuch Commands.
static void append_thread(struct HeaderCache *h, struct Mailbox *m, notmuch_query_t *q, notmuch_thread_t *thread, bool dedup)
Add each top level reply in the thread.
static void append_message(struct HeaderCache *h, struct Mailbox *m, notmuch_message_t *msg, bool dedup)
Associate a message.
static struct NmMboxData * nm_get_default_data(void)
Create a Mailbox with default Notmuch settings.
int nm_read_entire_thread(struct Mailbox *m, struct Email *e)
Get the entire thread of an email.
static void query_window_reset(void)
Restore vfolder's search window to its original position.
const int NmUrlProtocolLen
static int rename_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Rename the file.
void nm_query_window_backward(void)
Function to move the current search window backward in time.
static struct HeaderCache * nm_hcache_open(struct Mailbox *m)
Open a header cache.
static bool nm_message_has_tag(notmuch_message_t *msg, char *tag)
Does a message have this tag?
static notmuch_query_t * get_query(struct Mailbox *m, bool writable)
Create a new query.
static int update_message_path(struct Email *e, const char *path)
Set the path for a message.
bool nm_query_window_available(void)
Are windowed queries enabled for use?
static int update_tags(notmuch_message_t *msg, const char *tag_str)
Update the tags on a message.
static bool read_mesgs_query(struct Mailbox *m, notmuch_query_t *q, bool dedup)
Search for matching messages.
static const char * get_message_last_filename(notmuch_message_t *msg)
Get a message's last filename.
char * nm_url_from_query(struct Mailbox *m, char *buf, size_t buflen)
Turn a query into a URL.
static char * get_folder_from_path(const char *path)
Find an email's folder from its path.
void nm_init(void)
Setup feature commands.
static char * nm2mutt_message_id(const char *id)
Converts notmuch message Id to neomutt message Id.
char * nm_email_get_folder(struct Email *e)
Get the folder for a Email.
static int update_email_tags(struct Email *e, notmuch_message_t *msg)
Update the Email's tags from Notmuch.
bool nm_message_is_still_queried(struct Mailbox *m, struct Email *e)
Is a message still visible in the query?
static int update_email_flags(struct Mailbox *m, struct Email *e, const char *tag_str)
Update the Email's flags.
static int remove_filename(struct Mailbox *m, const char *path)
Delete a file.
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
void nm_query_window_forward(void)
Function to move the current search window forward in time.
static notmuch_messages_t * get_messages(notmuch_query_t *query)
Load messages for a query.
const char NmUrlProtocol[]
static void nm_progress_update(struct Mailbox *m)
Update the progress counter.
static struct Email * get_mutt_email(struct Mailbox *m, notmuch_message_t *msg)
Get the Email of a Notmuch message.
Pop-specific Account data.
@ MUTT_PROGRESS_READ
Progress tracks elements, according to $read_inc
@ MUTT_PROGRESS_WRITE
Progress tracks elements, according to $write_inc
void progress_free(struct Progress **ptr)
Free a Progress Bar.
bool progress_update(struct Progress *progress, size_t pos, int percent)
Update the state of the progress bar.
struct Progress * progress_new(const char *msg, enum ProgressType type, size_t size)
Create a new Progress Bar.
Prototypes for many functions.
#define mutt_set_flag(m, e, flag, bf)
enum NmQueryType nm_string_to_query_type(const char *str)
Lookup a query type.
enum NmQueryType nm_parse_type_from_query(char *buf, enum NmQueryType fallback)
Parse a query type out of a query.
const char * nm_query_type_to_string(enum NmQueryType query_type)
Turn a query type into a string.
enum NmWindowQueryRc nm_windowed_query_from_query(char *buf, size_t buflen, const bool force_enable, const short duration, const short cur_pos, const char *cur_search, const char *timebase, const char *or_terms)
Windows buf with notmuch date: search term.
NmWindowQueryRc
Return codes for nm_windowed_query_from_query()
@ NM_WINDOW_QUERY_SUCCESS
Query was successful.
@ NM_WINDOW_QUERY_INVALID_DURATION
Invalid duration.
@ NM_WINDOW_QUERY_INVALID_TIMEBASE
Invalid timebase.
NmQueryType
Notmuch Query Types.
@ NM_QUERY_TYPE_UNKNOWN
Unknown query type. Error in notmuch query.
@ NM_QUERY_TYPE_THREADS
Whole threads.
@ NM_QUERY_TYPE_MESGS
Default: Messages only.
#define STAILQ_FOREACH(var, head, field)
A group of associated Mailboxes.
void(* adata_free)(void **ptr)
Free the private data attached to the Account.
void * adata
Private data (for Mailbox backends)
String manipulation buffer.
The envelope/body of an email.
struct Envelope * env
Envelope information.
void * edata
Driver-specific data.
bool active
Message is not to be removed.
void * nm_edata
Notmuch private data.
bool old
Email is seen, but unread.
bool changed
Email has been edited.
struct TagList tags
For drivers that support server tagging.
int msgno
Number displayed to the user.
char * path
Path of Email (for local Mailboxes)
bool deleted
Email is deleted.
int index
The absolute (unsorted) message number.
struct MuttThread * thread
Thread of Emails.
char * message_id
Message ID.
struct Email * email
Retrieved email.
void(* mdata_free)(void **ptr)
Free the private data attached to the Mailbox.
struct timespec mtime
Time Mailbox was last changed.
int msg_new
Number of new messages.
int msg_count
Total number of messages.
int email_max
Number of pointers in emails.
enum MailboxType type
Mailbox type.
void * mdata
Driver specific data.
struct Email ** emails
Array of Emails.
struct HashTable * id_hash
Hash Table by msg id.
struct Buffer pathbuf
Path of the Mailbox.
int msg_flagged
Number of flagged messages.
bool verbose
Display status messages?
int msg_unread
Number of unread messages.
A local copy of an email.
FILE * fp
pointer to the message data
enum MailboxType type
Mailbox type, e.g. MUTT_IMAP.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
Notmuch-specific Account data -.
Notmuch-specific Email data -.
Notmuch-specific Mailbox data -.
struct Url * db_url
Parsed view url of the Notmuch database.
enum NmQueryType query_type
Messages or Threads.
int db_limit
Maximum number of results to return.
char * db_query
Previous query.
int ignmsgcount
Ignored messages.
char * tag_str
Source string.
A parsed URL proto://user:password@host:port/path?a=1&b=2
struct UrlQueryList query_strings
List of query strings.
long tv_nsec
Number of nanosecond, on top.
time_t tv_sec
Number of seconds since the epoch.
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
int cs_subset_str_string_set(const struct ConfigSubset *sub, const char *name, const char *value, struct Buffer *err)
Set a config item by string.
void nm_tag_array_free(struct TagArray *tags)
Free all memory of a TagArray.
struct TagArray nm_tag_str_to_tags(const char *tag_str)
Converts a comma and/or space-delimited string of tags into an array.
struct Url * url_parse(const char *src)
Fill in Url.
void url_free(struct Url **ptr)
Free the contents of a URL.
void url_pct_encode(char *buf, size_t buflen, const char *src)
Percent-encode a string.