NeoMutt  2024-02-01-23-g345d7b
Teaching an old dog new tricks
No Matches

Save the tags to a message. More...

+ Collaboration diagram for tags_commit():


static int comp_tags_commit (struct Mailbox *m, struct Email *e, const char *buf)
 Save the tags to a message - Implements MxOps::tags_commit() -.
static int imap_tags_commit (struct Mailbox *m, struct Email *e, const char *buf)
 Save the tags to a message - Implements MxOps::tags_commit() -.
static int nm_tags_commit (struct Mailbox *m, struct Email *e, const char *buf)
 Save the tags to a message - Implements MxOps::tags_commit() -.

Detailed Description

Save the tags to a message.

bufBuffer containing tags
Return values
m is not NULL
e is not NULL
buf is not NULL

Function Documentation

◆ comp_tags_commit()

static int comp_tags_commit ( struct Mailbox m,
struct Email e,
const char *  buf 

Save the tags to a message - Implements MxOps::tags_commit() -.

Definition at line 854 of file compress.c.

856 if (!m->compress_info)
857 return 0;
859 struct CompressInfo *ci = m->compress_info;
861 const struct MxOps *ops = ci->child_ops;
862 if (!ops || !ops->tags_commit)
863 return 0;
865 return ops->tags_commit(m, e, buf);
Private data for compress.
Definition: lib.h:46
const struct MxOps * child_ops
callbacks of de-compressed file
Definition: lib.h:51
void * compress_info
Compressed mbox module private data.
Definition: mailbox.h:121
Definition: mxapi.h:91
int(* tags_commit)(struct Mailbox *m, struct Email *e, const char *buf)
Definition: mxapi.h:323

◆ imap_tags_commit()

static int imap_tags_commit ( struct Mailbox m,
struct Email e,
const char *  buf 

Save the tags to a message - Implements MxOps::tags_commit() -.

This method update the server flags on the server by removing the last know custom flags of a header and adds the local flags

If everything success we push the local flags to the last know custom flags (flags_remote).

Also this method check that each flags is support by the server first and remove unsupported one.

Definition at line 2274 of file imap.c.

2276 char uid[11] = { 0 };
2280 if (*buf == '\0')
2281 buf = NULL;
2283 if (!(adata->mailbox->rights & MUTT_ACL_WRITE))
2284 return 0;
2286 snprintf(uid, sizeof(uid), "%u", imap_edata_get(e)->uid);
2288 /* Remove old custom flags */
2289 if (imap_edata_get(e)->flags_remote)
2290 {
2291 struct Buffer cmd = buf_make(128); // just a guess
2292 buf_addstr(&cmd, "UID STORE ");
2293 buf_addstr(&cmd, uid);
2294 buf_addstr(&cmd, " -FLAGS.SILENT (");
2295 buf_addstr(&cmd, imap_edata_get(e)->flags_remote);
2296 buf_addstr(&cmd, ")");
2298 /* Should we return here, or we are fine and we could
2299 * continue to add new flags */
2300 int rc = imap_exec(adata,, IMAP_CMD_NO_FLAGS);
2301 buf_dealloc(&cmd);
2302 if (rc != IMAP_EXEC_SUCCESS)
2303 {
2304 return -1;
2305 }
2306 }
2308 /* Add new custom flags */
2309 if (buf)
2310 {
2311 struct Buffer cmd = buf_make(128); // just a guess
2312 buf_addstr(&cmd, "UID STORE ");
2313 buf_addstr(&cmd, uid);
2314 buf_addstr(&cmd, " +FLAGS.SILENT (");
2315 buf_addstr(&cmd, buf);
2316 buf_addstr(&cmd, ")");
2318 int rc = imap_exec(adata,, IMAP_CMD_NO_FLAGS);
2319 buf_dealloc(&cmd);
2320 if (rc != IMAP_EXEC_SUCCESS)
2321 {
2322 mutt_debug(LL_DEBUG1, "fail to add new flags\n");
2323 return -1;
2324 }
2325 }
2327 /* We are good sync them */
2328 mutt_debug(LL_DEBUG1, "NEW TAGS: %s\n", buf);
2329 driver_tags_replace(&e->tags, buf);
2330 FREE(&imap_edata_get(e)->flags_remote);
2331 struct Buffer *flags_remote = buf_pool_get();
2332 driver_tags_get_with_hidden(&e->tags, flags_remote);
2333 imap_edata_get(e)->flags_remote = buf_strdup(flags_remote);
2334 buf_pool_release(&flags_remote);
2336 return 0;
void buf_dealloc(struct Buffer *buf)
Release the memory allocated by a buffer.
Definition: buffer.c:394
struct Buffer buf_make(size_t size)
Make a new buffer on the stack.
Definition: buffer.c:75
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:243
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition: buffer.c:588
Write to a message (for flagging or linking threads)
Definition: mailbox.h:71
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
int imap_msg_save_hcache(struct Mailbox *m, struct Email *e)
Save message to the header cache - Implements MxOps::msg_save_hcache() -.
Definition: message.c:2190
struct ImapAccountData * imap_adata_get(struct Mailbox *m)
Get the Account data for this mailbox.
Definition: adata.c:123
int imap_exec(struct ImapAccountData *adata, const char *cmdstr, ImapCmdFlags flags)
Execute a command and wait for the response from the server.
Definition: command.c:1307
struct ImapEmailData * imap_edata_get(struct Email *e)
Get the private data for this Email.
Definition: edata.c:67
No flags are set.
Definition: private.h:71
Imap command executed or queued successfully.
Definition: private.h:82
Log at debug level 1.
Definition: logging2.h:43
#define FREE(x)
Definition: memory.h:45
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 * adata
Private data (for Mailbox backends)
Definition: account.h:42
String manipulation buffer.
Definition: buffer.h:36
char * data
Pointer to data.
Definition: buffer.h:37
struct TagList tags
For drivers that support server tagging.
Definition: email.h:72
IMAP-specific Account data -.
Definition: adata.h:40
char * buf
Definition: adata.h:59
char * flags_remote
Definition: edata.h:49
bool driver_tags_replace(struct TagList *tl, const char *tags)
Replace all tags.
Definition: tags.c:201
void driver_tags_get_with_hidden(struct TagList *tl, struct Buffer *tags)
Get all tags, also hidden ones, separated by space.
Definition: tags.c:174
+ Here is the call graph for this function:

◆ nm_tags_commit()

static int nm_tags_commit ( struct Mailbox m,
struct Email e,
const char *  buf 

Save the tags to a message - Implements MxOps::tags_commit() -.

Definition at line 2412 of file notmuch.c.

2414 if (*buf == '\0')
2415 return 0; /* no tag change, so nothing to do */
2417 struct NmMboxData *mdata = nm_mdata_get(m);
2418 if (!mdata)
2419 return -1;
2421 notmuch_database_t *db = NULL;
2422 notmuch_message_t *msg = NULL;
2423 int rc = -1;
2425 if (!(db = nm_db_get(m, true)) || !(msg = get_nm_message(db, e)))
2426 goto done;
2428 mutt_debug(LL_DEBUG1, "nm: tags modify: '%s'\n", buf);
2430 update_tags(msg, buf);
2431 update_email_flags(m, e, buf);
2432 update_email_tags(e, msg);
2435 rc = 0;
2436 e->changed = true;
2438 nm_db_release(m);
2439 if (e->changed)
2440 {
2441 mdata->mtime.tv_sec = mutt_date_now();
2442 mdata->mtime.tv_nsec = 0;
2443 }
2444 mutt_debug(LL_DEBUG1, "nm: tags modify done [rc=%d]\n", rc);
2445 return rc;
void mutt_set_header_color(struct Mailbox *m, struct Email *e)
Select a colour for a message.
Definition: dlg_index.c:1366
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:455
notmuch_database_t * nm_db_get(struct Mailbox *m, bool writable)
Get the Notmuch database.
Definition: db.c:208
int nm_db_release(struct Mailbox *m)
Close the Notmuch database.
Definition: db.c:232
struct NmMboxData * nm_mdata_get(struct Mailbox *m)
Get the Notmuch Mailbox data.
Definition: mdata.c:96
static notmuch_message_t * get_nm_message(notmuch_database_t *db, struct Email *e)
Find a Notmuch message.
Definition: notmuch.c:1047
static int update_tags(notmuch_message_t *msg, const char *tag_str)
Update the tags on a message.
Definition: notmuch.c:1105
static int update_email_tags(struct Email *e, notmuch_message_t *msg)
Update the Email's tags from Notmuch.
Definition: notmuch.c:481
static int update_email_flags(struct Mailbox *m, struct Email *e, const char *tag_str)
Update the Email's flags.
Definition: notmuch.c:1159
bool changed
Email has been edited.
Definition: email.h:77
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: