NeoMutt  2024-04-16-36-g75b6fb
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h File Reference

Notmuch virtual mailbox type. More...

#include <stddef.h>
#include <stdbool.h>
#include "core/lib.h"
#include "complete/lib.h"
+ Include dependency graph for lib.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void nm_init (void)
 Setup feature commands.
 
void nm_db_debug_check (struct Mailbox *m)
 Check if the database is open.
 
void nm_db_longrun_done (struct Mailbox *m)
 Finish a long transaction.
 
void nm_db_longrun_init (struct Mailbox *m, bool writable)
 Start a long transaction.
 
char * nm_email_get_folder (struct Email *e)
 Get the folder for a Email.
 
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.
 
int nm_get_all_tags (struct Mailbox *m, const char **tag_list, int *tag_count)
 Fill a list with all notmuch tags.
 
bool nm_message_is_still_queried (struct Mailbox *m, struct Email *e)
 Is a message still visible in the query?
 
enum MailboxType nm_path_probe (const char *path, const struct stat *st)
 Is this a Notmuch Mailbox? - Implements MxOps::path_probe() -.
 
bool nm_query_window_available (void)
 Are windowed queries enabled for use?
 
void nm_query_window_backward (void)
 Function to move the current search window backward in time.
 
void nm_query_window_forward (void)
 Function to move the current search window forward in time.
 
void nm_query_window_reset (void)
 Resets the vfolder window position to the present.
 
int nm_read_entire_thread (struct Mailbox *m, struct Email *e)
 Get the entire thread of an email.
 
int nm_record_message (struct Mailbox *m, char *path, struct Email *e)
 Add a message to the Notmuch database.
 
int nm_update_filename (struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
 Change the filename.
 
char * nm_url_from_query (struct Mailbox *m, char *buf, size_t buflen)
 Turn a query into a URL.
 

Variables

const struct CompleteOps CompleteNmQueryOps
 Auto-Completion of NmQuerys.
 
const struct CompleteOps CompleteNmTagOps
 Auto-Completion of NmTags.
 
const struct MxOps MxNotmuchOps
 Notmuch Mailbox - Implements MxOps -.
 

Detailed Description

Notmuch virtual mailbox type.

Authors
  • Karel Zak
  • Richard Russon

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file lib.h.

Function Documentation

◆ nm_init()

void nm_init ( void  )

Setup feature commands.

Definition at line 108 of file notmuch.c.

109{
111}
void commands_register(const struct Command *cmds, const size_t num_cmds)
Add commands to Commands array.
Definition: command.c:53
#define mutt_array_size(x)
Definition: memory.h:38
static const struct Command NmCommands[]
Notmuch Commands.
Definition: notmuch.c:93
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_db_debug_check()

void nm_db_debug_check ( struct Mailbox m)

Check if the database is open.

Parameters
mMailbox

Definition at line 396 of file db.c.

397{
398 struct NmAccountData *adata = nm_adata_get(m);
399 if (!adata || !adata->db)
400 return;
401
402 mutt_debug(LL_DEBUG1, "nm: ERROR: db is open, closing\n");
403 nm_db_release(m);
404}
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
@ LL_DEBUG1
Log at debug level 1.
Definition: logging2.h:43
struct NmAccountData * nm_adata_get(struct Mailbox *m)
Get the Notmuch Account data.
Definition: adata.c:71
int nm_db_release(struct Mailbox *m)
Close the Notmuch database.
Definition: db.c:232
void * adata
Private data (for Mailbox backends)
Definition: account.h:42
Notmuch-specific Account data -.
Definition: adata.h:35
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_db_longrun_done()

void nm_db_longrun_done ( struct Mailbox m)

Finish a long transaction.

Parameters
mMailbox

Definition at line 378 of file db.c.

379{
380 struct NmAccountData *adata = nm_adata_get(m);
381
382 if (adata)
383 {
384 adata->longrun = false; /* to force nm_db_release() released DB */
385 if (nm_db_release(m) == 0)
386 mutt_debug(LL_DEBUG2, "nm: long run deinitialized\n");
387 else
388 adata->longrun = true;
389 }
390}
@ LL_DEBUG2
Log at debug level 2.
Definition: logging2.h:44
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_db_longrun_init()

void nm_db_longrun_init ( struct Mailbox m,
bool  writable 
)

Start a long transaction.

Parameters
mMailbox
writableRead/write?

Definition at line 363 of file db.c.

364{
365 struct NmAccountData *adata = nm_adata_get(m);
366
367 if (!(adata && nm_db_get(m, writable)))
368 return;
369
370 adata->longrun = true;
371 mutt_debug(LL_DEBUG2, "nm: long run initialized\n");
372}
notmuch_database_t * nm_db_get(struct Mailbox *m, bool writable)
Get the Notmuch database.
Definition: db.c:208
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_email_get_folder()

char * nm_email_get_folder ( struct Email e)

Get the folder for a Email.

Parameters
eEmail
Return values
ptrFolder containing email
NULLError

Definition at line 1469 of file notmuch.c.

1470{
1471 struct NmEmailData *edata = nm_edata_get(e);
1472 if (!edata)
1473 return NULL;
1474
1475 return edata->folder;
1476}
struct NmEmailData * nm_edata_get(struct Email *e)
Get the Notmuch Email data.
Definition: edata.c:72
void * edata
Driver-specific data.
Definition: email.h:74
Notmuch-specific Email data -.
Definition: edata.h:34
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_email_get_folder_rel_db()

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.

Parameters
mMailbox containing Email
eEmail
Return values
ptrFolder containing email from the same level as the notmuch db
NULLError

Instead of returning a path like /var/mail/account/Inbox, this returns account/Inbox. If wanting the full path, use nm_email_get_folder().

Definition at line 1488 of file notmuch.c.

1489{
1490 char *full_folder = nm_email_get_folder(e);
1491 if (!full_folder)
1492 return NULL;
1493
1494 const char *db_path = nm_db_get_filename(m);
1495 if (!db_path)
1496 return NULL;
1497
1498 size_t prefix = mutt_str_startswith(full_folder, db_path);
1499
1500 char *path = full_folder + prefix;
1501 if (*path == '/')
1502 path++;
1503
1504 return path;
1505}
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition: string.c:230
const char * nm_db_get_filename(struct Mailbox *m)
Get the filename of the Notmuch database.
Definition: db.c:57
char * nm_email_get_folder(struct Email *e)
Get the folder for a Email.
Definition: notmuch.c:1469
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_get_all_tags()

int nm_get_all_tags ( struct Mailbox m,
const char **  tag_list,
int *  tag_count 
)

Fill a list with all notmuch tags.

Parameters
[in]mMailbox
[out]tag_listList of tags
[out]tag_countNumber of tags
Return values
0Success
-1Failure

If tag_list is NULL, just count the tags.

Definition at line 1979 of file notmuch.c.

1980{
1981 struct NmMboxData *mdata = nm_mdata_get(m);
1982 if (!mdata)
1983 return -1;
1984
1985 notmuch_database_t *db = NULL;
1986 notmuch_tags_t *tags = NULL;
1987 const char *tag = NULL;
1988 int rc = -1;
1989
1990 if (!(db = nm_db_get(m, false)) || !(tags = notmuch_database_get_all_tags(db)))
1991 goto done;
1992
1993 *tag_count = 0;
1994 mutt_debug(LL_DEBUG1, "nm: get all tags\n");
1995
1996 while (notmuch_tags_valid(tags))
1997 {
1998 tag = notmuch_tags_get(tags);
1999 /* Skip empty string */
2000 if (*tag)
2001 {
2002 if (tag_list)
2003 tag_list[*tag_count] = mutt_str_dup(tag);
2004 (*tag_count)++;
2005 }
2006 notmuch_tags_move_to_next(tags);
2007 }
2008
2009 rc = 0;
2010done:
2011 if (tags)
2012 notmuch_tags_destroy(tags);
2013
2014 nm_db_release(m);
2015
2016 mutt_debug(LL_DEBUG1, "nm: get all tags done [rc=%d tag_count=%u]\n", rc, *tag_count);
2017 return rc;
2018}
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
struct NmMboxData * nm_mdata_get(struct Mailbox *m)
Get the Notmuch Mailbox data.
Definition: mdata.c:96
void * mdata
Driver specific data.
Definition: mailbox.h:132
Notmuch-specific Mailbox data -.
Definition: mdata.h:35
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_message_is_still_queried()

bool nm_message_is_still_queried ( struct Mailbox m,
struct Email e 
)

Is a message still visible in the query?

Parameters
mMailbox
eEmail
Return values
trueMessage is still in query

Definition at line 1698 of file notmuch.c.

1699{
1700 struct NmMboxData *mdata = nm_mdata_get(m);
1701 if (!mdata)
1702 return false;
1703
1704 notmuch_database_t *db = nm_db_get(m, false);
1705 char *orig_str = get_query_string(mdata, true);
1706
1707 if (!db || !orig_str)
1708 return false;
1709
1710 char *new_str = NULL;
1711 bool rc = false;
1712 if (mutt_str_asprintf(&new_str, "id:%s and (%s)", email_get_id(e), orig_str) < 0)
1713 return false;
1714
1715 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s\n", new_str);
1716
1717 notmuch_query_t *q = notmuch_query_create(db, new_str);
1718
1719 switch (mdata->query_type)
1720 {
1721 case NM_QUERY_TYPE_UNKNOWN: // UNKNOWN should never occur, but MESGS is default
1723 {
1724 notmuch_messages_t *messages = get_messages(q);
1725
1726 if (!messages)
1727 return false;
1728
1729 rc = notmuch_messages_valid(messages);
1730 notmuch_messages_destroy(messages);
1731 break;
1732 }
1734 {
1735 notmuch_threads_t *threads = get_threads(q);
1736
1737 if (!threads)
1738 return false;
1739
1740 rc = notmuch_threads_valid(threads);
1741 notmuch_threads_destroy(threads);
1742 break;
1743 }
1744 }
1745
1746 notmuch_query_destroy(q);
1747
1748 mutt_debug(LL_DEBUG2, "nm: checking if message is still queried: %s = %s\n",
1749 new_str, rc ? "true" : "false");
1750
1751 return rc;
1752}
int mutt_str_asprintf(char **strp, const char *fmt,...)
Definition: string.c:797
static notmuch_threads_t * get_threads(notmuch_query_t *query)
Load threads for a query.
Definition: notmuch.c:982
static char * get_query_string(struct NmMboxData *mdata, bool window)
Builds the notmuch vfolder search string.
Definition: notmuch.c:346
static char * email_get_id(struct Email *e)
Get the unique Notmuch Id.
Definition: notmuch.c:221
static notmuch_messages_t * get_messages(notmuch_query_t *query)
Load messages for a query.
Definition: notmuch.c:912
@ NM_QUERY_TYPE_UNKNOWN
Unknown query type. Error in notmuch query.
Definition: query.h:38
@ NM_QUERY_TYPE_THREADS
Whole threads.
Definition: query.h:37
@ NM_QUERY_TYPE_MESGS
Default: Messages only.
Definition: query.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_available()

bool nm_query_window_available ( void  )

Are windowed queries enabled for use?

Return values
trueWindowed queries in use

Definition at line 1638 of file notmuch.c.

1639{
1640 const short c_nm_query_window_duration = cs_subset_number(NeoMutt->sub, "nm_query_window_duration");
1641 const bool c_nm_query_window_enable = cs_subset_bool(NeoMutt->sub, "nm_query_window_enable");
1642
1643 return c_nm_query_window_enable || (c_nm_query_window_duration > 0);
1644}
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition: helpers.c:144
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:48
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_backward()

void nm_query_window_backward ( void  )

Function to move the current search window backward in time.

Updates nm_query_window_current_position by incrementing it by 1

The higher the value of nm_query_window_current_position is, the less recent the result will be.

Definition at line 1675 of file notmuch.c.

1676{
1677 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1678 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1679 c_nm_query_window_current_position + 1, NULL);
1680 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position + 1);
1681}
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.
Definition: subset.c:297
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_forward()

void nm_query_window_forward ( void  )

Function to move the current search window forward in time.

Updates nm_query_window_current_position by decrementing it by 1, or does nothing if the current window already is set to 0.

The lower the value of nm_query_window_current_position is, the more recent the result will be.

Definition at line 1655 of file notmuch.c.

1656{
1657 const short c_nm_query_window_current_position = cs_subset_number(NeoMutt->sub, "nm_query_window_current_position");
1658 if (c_nm_query_window_current_position != 0)
1659 {
1660 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position",
1661 c_nm_query_window_current_position - 1, NULL);
1662 }
1663
1664 mutt_debug(LL_DEBUG2, "(%d)\n", c_nm_query_window_current_position - 1);
1665}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_query_window_reset()

void nm_query_window_reset ( void  )

Resets the vfolder window position to the present.

Definition at line 1686 of file notmuch.c.

1687{
1688 cs_subset_str_native_set(NeoMutt->sub, "nm_query_window_current_position", 0, NULL);
1689 mutt_debug(LL_DEBUG2, "Reset nm_query_window_current_position to 0\n");
1690}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_read_entire_thread()

int nm_read_entire_thread ( struct Mailbox m,
struct Email e 
)

Get the entire thread of an email.

Parameters
mMailbox
eEmail
Return values
0Success
-1Failure

Definition at line 1514 of file notmuch.c.

1515{
1516 if (!m)
1517 return -1;
1518
1519 struct NmMboxData *mdata = nm_mdata_get(m);
1520 if (!mdata)
1521 return -1;
1522
1523 notmuch_query_t *q = NULL;
1524 notmuch_database_t *db = NULL;
1525 notmuch_message_t *msg = NULL;
1526 int rc = -1;
1527
1528 if (!(db = nm_db_get(m, false)) || !(msg = get_nm_message(db, e)))
1529 goto done;
1530
1531 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages...[current count=%d]\n",
1532 m->msg_count);
1533
1534 progress_setup(m);
1535 const char *id = notmuch_message_get_thread_id(msg);
1536 if (!id)
1537 goto done;
1538
1539 struct Buffer *qstr = buf_pool_get();
1540 buf_printf(qstr, "thread:%s", id);
1541 q = notmuch_query_create(db, buf_string(qstr));
1542 buf_pool_release(&qstr);
1543 if (!q)
1544 goto done;
1546 notmuch_query_set_sort(q, NOTMUCH_SORT_NEWEST_FIRST);
1547
1548 read_threads_query(m, q, true, 0);
1549 mdata->mtime.tv_sec = mutt_date_now();
1550 mdata->mtime.tv_nsec = 0;
1551 rc = 0;
1552
1553 if (m->msg_count > mdata->oldmsgcount)
1555done:
1556 if (q)
1557 notmuch_query_destroy(q);
1558
1559 nm_db_release(m);
1560
1561 if (m->msg_count == mdata->oldmsgcount)
1562 mutt_message(_("No more messages in the thread"));
1563
1564 mdata->oldmsgcount = 0;
1565 mutt_debug(LL_DEBUG1, "nm: reading entire-thread messages... done [rc=%d, count=%d]\n",
1566 rc, m->msg_count);
1567 progress_free(&mdata->progress);
1568 return rc;
1569}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:160
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
Definition: mailbox.c:234
@ NT_MAILBOX_INVALID
Email list was changed.
Definition: mailbox.h:189
#define mutt_message(...)
Definition: logging2.h:91
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:455
#define _(a)
Definition: message.h:28
static void apply_exclude_tags(notmuch_query_t *query)
Exclude the configured tags.
Definition: notmuch.c:423
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
Definition: notmuch.c:1047
static bool read_threads_query(struct Mailbox *m, notmuch_query_t *q, bool dedup, int limit)
Perform a query with threads.
Definition: notmuch.c:1010
static void progress_setup(struct Mailbox *m)
Set up the Progress Bar.
Definition: notmuch.c:678
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
void progress_free(struct Progress **ptr)
Free a Progress Bar.
Definition: progress.c:110
String manipulation buffer.
Definition: buffer.h:36
int msg_count
Total number of messages.
Definition: mailbox.h:88
int oldmsgcount
Definition: mdata.h:42
struct Progress * progress
A progress bar.
Definition: mdata.h:41
struct timespec mtime
Time Mailbox was last changed.
Definition: mdata.h:44
long tv_nsec
Number of nanosecond, on top.
Definition: file.h:53
time_t tv_sec
Number of seconds since the epoch.
Definition: file.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_record_message()

int nm_record_message ( struct Mailbox m,
char *  path,
struct Email e 
)

Add a message to the Notmuch database.

Parameters
mMailbox
pathPath of the email
eEmail
Return values
0Success
-1Failure

Definition at line 1896 of file notmuch.c.

1897{
1898 notmuch_database_t *db = NULL;
1899 notmuch_status_t st;
1900 notmuch_message_t *msg = NULL;
1901 int rc = -1;
1902
1903 struct NmMboxData *mdata = nm_mdata_get(m);
1904
1905 // If no notmuch data, fall back to the default mailbox.
1906 //
1907 // IMPORTANT: DO NOT FREE THIS MAILBOX. Two reasons:
1908 // 1) If user has default mailbox in config, we'll be removing it. That's not
1909 // good program behavior!
1910 // 2) If not in user's config, keep mailbox around for future nm_record calls.
1911 // It saves NeoMutt from allocating/deallocating repeatedly.
1912 if (!mdata)
1913 {
1914 mutt_debug(LL_DEBUG1, "nm: non-nm mailbox. trying the default nm mailbox.");
1915 m = get_default_mailbox();
1916 mdata = nm_mdata_get(m);
1917 }
1918
1919 if (!path || !mdata || (access(path, F_OK) != 0))
1920 return 0;
1921 db = nm_db_get(m, true);
1922 if (!db)
1923 return -1;
1924
1925 mutt_debug(LL_DEBUG1, "nm: record message: %s\n", path);
1926 int trans = nm_db_trans_begin(m);
1927 if (trans < 0)
1928 goto done;
1929
1930#if LIBNOTMUCH_CHECK_VERSION(5, 1, 0)
1931 st = notmuch_database_index_file(db, path, NULL, &msg);
1932#else
1933 st = notmuch_database_add_message(db, path, &msg);
1934#endif
1935
1936 if ((st != NOTMUCH_STATUS_SUCCESS) && (st != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID))
1937 {
1938 mutt_debug(LL_DEBUG1, "nm: failed to add '%s' [st=%d]\n", path, (int) st);
1939 goto done;
1940 }
1941
1942 if ((st == NOTMUCH_STATUS_SUCCESS) && msg)
1943 {
1944 notmuch_message_maildir_flags_to_tags(msg);
1945 if (e)
1946 {
1947 struct Buffer *tags = buf_pool_get();
1948 driver_tags_get(&e->tags, tags);
1949 update_tags(msg, buf_string(tags));
1950 buf_pool_release(&tags);
1951 }
1952 const char *const c_nm_record_tags = cs_subset_string(NeoMutt->sub, "nm_record_tags");
1953 if (c_nm_record_tags)
1954 update_tags(msg, c_nm_record_tags);
1955 }
1956
1957 rc = 0;
1958done:
1959 if (msg)
1960 notmuch_message_destroy(msg);
1961 if (trans == 1)
1962 nm_db_trans_end(m);
1963
1964 nm_db_release(m);
1965
1966 return rc;
1967}
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:292
int nm_db_trans_begin(struct Mailbox *m)
Start a Notmuch database transaction.
Definition: db.c:265
int nm_db_trans_end(struct Mailbox *m)
End a database transaction.
Definition: db.c:287
static struct Mailbox * get_default_mailbox(void)
Get Mailbox for notmuch without any parameters.
Definition: notmuch.c:1873
static int update_tags(notmuch_message_t *msg, const char *tag_str)
Update the tags on a message.
Definition: notmuch.c:1105
struct TagList tags
For drivers that support server tagging.
Definition: email.h:72
void driver_tags_get(struct TagList *tl, struct Buffer *tags)
Get tags all tags separated by space.
Definition: tags.c:164
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nm_update_filename()

int nm_update_filename ( struct Mailbox m,
const char *  old_file,
const char *  new_file,
struct Email e 
)

Change the filename.

Parameters
mMailbox
old_fileOld filename
new_fileNew filename
eEmail
Return values
0Success
-1Failure

Definition at line 1763 of file notmuch.c.

1765{
1766 char buf[PATH_MAX] = { 0 };
1767 struct NmMboxData *mdata = nm_mdata_get(m);
1768 if (!mdata || !new_file)
1769 return -1;
1770
1771 if (!old_file && nm_edata_get(e))
1772 {
1773 email_get_fullpath(e, buf, sizeof(buf));
1774 old_file = buf;
1775 }
1776
1777 int rc = rename_filename(m, old_file, new_file, e);
1778
1779 nm_db_release(m);
1780 mdata->mtime.tv_sec = mutt_date_now();
1781 mdata->mtime.tv_nsec = 0;
1782 return rc;
1783}
#define PATH_MAX
Definition: mutt.h:42
static char * email_get_fullpath(struct Email *e, char *buf, size_t buflen)
Get the full path of an email.
Definition: notmuch.c:237
static int rename_filename(struct Mailbox *m, const char *old_file, const char *new_file, struct Email *e)
Rename the file.
Definition: notmuch.c:1331

◆ nm_url_from_query()

char * nm_url_from_query ( struct Mailbox m,
char *  buf,
size_t  buflen 
)

Turn a query into a URL.

Parameters
mMailbox
bufBuffer for URL
buflenLength of buffer
Return values
ptrQuery as a URL
NULLError

Definition at line 1579 of file notmuch.c.

1580{
1581 mutt_debug(LL_DEBUG2, "(%s)\n", buf);
1582 struct NmMboxData *mdata = nm_mdata_get(m);
1583 char url[PATH_MAX + 1024 + 32]; /* path to DB + query + URL "decoration" */
1584 int added;
1585 bool using_default_data = false;
1586
1587 // No existing data. Try to get a default NmMboxData.
1588 if (!mdata)
1589 {
1591
1592 // Failed to get default data.
1593 if (!mdata)
1594 return NULL;
1595
1596 using_default_data = true;
1597 }
1598
1600 cs_subset_string(NeoMutt->sub, "nm_query_type"));
1601 mdata->query_type = nm_parse_type_from_query(buf, query_type);
1602
1603 const short c_nm_db_limit = cs_subset_number(NeoMutt->sub, "nm_db_limit");
1604 if (get_limit(mdata) == c_nm_db_limit)
1605 {
1606 added = snprintf(url, sizeof(url), "%s%s?type=%s&query=", NmUrlProtocol,
1608 }
1609 else
1610 {
1611 added = snprintf(url, sizeof(url), "%s%s?type=%s&limit=%d&query=", NmUrlProtocol,
1614 }
1615
1616 if (added >= sizeof(url))
1617 {
1618 // snprintf output was truncated, so can't create URL
1619 return NULL;
1620 }
1621
1622 url_pct_encode(&url[added], sizeof(url) - added, buf);
1623
1624 mutt_str_copy(buf, url, buflen);
1625 buf[buflen - 1] = '\0';
1626
1627 if (using_default_data)
1628 nm_mdata_free((void **) &mdata);
1629
1630 mutt_debug(LL_DEBUG1, "nm: url from query '%s'\n", buf);
1631 return buf;
1632}
void nm_mdata_free(void **ptr)
Free the private Mailbox data - Implements Mailbox::mdata_free() -.
Definition: mdata.c:45
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
Definition: string.c:575
static int get_limit(struct NmMboxData *mdata)
Get the database limit.
Definition: notmuch.c:414
static struct NmMboxData * nm_get_default_data(void)
Create a Mailbox with default Notmuch settings.
Definition: notmuch.c:176
const char NmUrlProtocol[]
Protocol string for Notmuch URLs.
Definition: notmuch.c:101
enum NmQueryType nm_string_to_query_type(const char *str)
Lookup a query type.
Definition: query.c:110
enum NmQueryType nm_parse_type_from_query(char *buf, enum NmQueryType fallback)
Parse a query type out of a query.
Definition: query.c:49
const char * nm_query_type_to_string(enum NmQueryType query_type)
Turn a query type into a string.
Definition: query.c:96
NmQueryType
Notmuch Query Types.
Definition: query.h:35
enum NmQueryType query_type
Messages or Threads.
Definition: mdata.h:39
void url_pct_encode(char *buf, size_t buflen, const char *src)
Percent-encode a string.
Definition: url.c:152
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ CompleteNmQueryOps

const struct CompleteOps CompleteNmQueryOps
extern

Auto-Completion of NmQuerys.

Definition at line 247 of file complete.c.

◆ CompleteNmTagOps

const struct CompleteOps CompleteNmTagOps
extern

Auto-Completion of NmTags.

Definition at line 254 of file complete.c.