* mu4e-server.c: when flagging based on message-id, update /all/ matching
messages
this is a common case when sending messages to ourselves (maybe through a
mailing list), where there would a message in inbox and sentbox with the
same id. we set the flag on both
This commit is contained in:
@ -239,8 +239,8 @@ get_docid_from_msgid (MuQuery *query, const char *str, GError **err)
|
|||||||
|
|
||||||
|
|
||||||
/* get a *list* of all messages with the given message id */
|
/* get a *list* of all messages with the given message id */
|
||||||
G_GNUC_UNUSED static GSList*
|
static GSList*
|
||||||
get_docid_from_msgid_list (MuQuery *query, const char *str, GError **err)
|
get_docids_from_msgids (MuQuery *query, const char *str, GError **err)
|
||||||
{
|
{
|
||||||
gchar *querystr;
|
gchar *querystr;
|
||||||
MuMsgIter *iter;
|
MuMsgIter *iter;
|
||||||
@ -248,7 +248,8 @@ get_docid_from_msgid_list (MuQuery *query, const char *str, GError **err)
|
|||||||
|
|
||||||
querystr = g_strdup_printf ("msgid:%s", str);
|
querystr = g_strdup_printf ("msgid:%s", str);
|
||||||
iter = mu_query_run (query, querystr, FALSE,
|
iter = mu_query_run (query, querystr, FALSE,
|
||||||
MU_MSG_FIELD_ID_NONE, FALSE, 1, err);
|
MU_MSG_FIELD_ID_NONE, FALSE,-1 /*unlimited*/,
|
||||||
|
err);
|
||||||
g_free (querystr);
|
g_free (querystr);
|
||||||
|
|
||||||
if (!iter || mu_msg_iter_is_done (iter)) {
|
if (!iter || mu_msg_iter_is_done (iter)) {
|
||||||
@ -257,12 +258,12 @@ get_docid_from_msgid_list (MuQuery *query, const char *str, GError **err)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (lst = NULL; !mu_msg_iter_is_done (iter); mu_msg_iter_next(iter)) {
|
lst = NULL;
|
||||||
unsigned docid;
|
do {
|
||||||
docid = mu_msg_iter_get_docid (iter);
|
|
||||||
lst = g_slist_prepend
|
lst = g_slist_prepend
|
||||||
(lst, GUINT_TO_POINTER(docid));
|
(lst,
|
||||||
}
|
GSIZE_TO_POINTER(mu_msg_iter_get_docid (iter)));
|
||||||
|
} while (mu_msg_iter_next (iter));
|
||||||
|
|
||||||
mu_msg_iter_destroy (iter);
|
mu_msg_iter_destroy (iter);
|
||||||
|
|
||||||
@ -500,8 +501,6 @@ print_sexps (MuMsgIter *iter, int maxnum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static MuError
|
static MuError
|
||||||
save_part (MuMsg *msg, unsigned index, GSList *args, GError **err)
|
save_part (MuMsg *msg, unsigned index, GSList *args, GError **err)
|
||||||
{
|
{
|
||||||
@ -803,9 +802,14 @@ do_move (MuStore *store, unsigned docid, MuMsg *msg, const char *maildir,
|
|||||||
gchar *sexp;
|
gchar *sexp;
|
||||||
gboolean different_mdir;
|
gboolean different_mdir;
|
||||||
|
|
||||||
/* are we moving to a different mdir, or is it just flags? */
|
if (!maildir) {
|
||||||
different_mdir =
|
maildir = mu_msg_get_maildir (msg);
|
||||||
(g_strcmp0 (maildir, mu_msg_get_maildir(msg)) != 0);
|
different_mdir = FALSE;
|
||||||
|
} else {
|
||||||
|
/* are we moving to a different mdir, or is it just flags? */
|
||||||
|
different_mdir =
|
||||||
|
(g_strcmp0 (maildir, mu_msg_get_maildir(msg)) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (!mu_msg_move_to_maildir (msg, maildir, flags, TRUE, err))
|
if (!mu_msg_move_to_maildir (msg, maildir, flags, TRUE, err))
|
||||||
return MU_G_ERROR_CODE (err);
|
return MU_G_ERROR_CODE (err);
|
||||||
@ -830,6 +834,59 @@ do_move (MuStore *store, unsigned docid, MuMsg *msg, const char *maildir,
|
|||||||
return MU_OK;
|
return MU_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* when called with a msgid, we need to take care of possibly multiple
|
||||||
|
* message with this message id. this is a common case when sending
|
||||||
|
* messages to ourselves (maybe through a mailing list), where there
|
||||||
|
* would a message in inbox and sentbox with the same id. we set the
|
||||||
|
* flag on both */
|
||||||
|
static gboolean
|
||||||
|
move_msgid_maybe (MuStore *store, MuQuery *query, GSList *args, GError **err)
|
||||||
|
{
|
||||||
|
const char *maildir, *msgid, *flagstr;
|
||||||
|
GSList *docids, *cur;
|
||||||
|
MuFlags flags;
|
||||||
|
|
||||||
|
maildir = get_string_from_args (args, "maildir", TRUE, err);
|
||||||
|
msgid = get_string_from_args (args, "msgid", TRUE, err);
|
||||||
|
flagstr = get_string_from_args (args, "flags", TRUE, err);
|
||||||
|
|
||||||
|
/* you cannot use 'maildir' for multiple messages at once */
|
||||||
|
if (!msgid || !flagstr || maildir )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
docids = get_docids_from_msgids (query, msgid, err);
|
||||||
|
if (!docids) {
|
||||||
|
print_and_clear_g_error (err);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (cur = docids; cur; cur = g_slist_next(cur)) {
|
||||||
|
MuMsg *msg;
|
||||||
|
unsigned docid = (GPOINTER_TO_SIZE(cur->data));
|
||||||
|
if (!(msg = mu_store_get_msg (store, docid, err))) {
|
||||||
|
print_and_clear_g_error (err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (flagstr)
|
||||||
|
flags = get_flags (mu_msg_get_path(msg), flagstr);
|
||||||
|
else
|
||||||
|
flags = mu_msg_get_flags (msg);
|
||||||
|
if (flags == MU_FLAG_INVALID) {
|
||||||
|
print_error (MU_ERROR_IN_PARAMETERS, "invalid flags");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
do_move (store, docid, msg, NULL, flags, err);
|
||||||
|
mu_msg_unref (msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_free (docids);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 'move' moves a message to a different maildir and/or changes its
|
* 'move' moves a message to a different maildir and/or changes its
|
||||||
* flags. parameters are *either* a 'docid:' or 'msgid:' pointing to
|
* flags. parameters are *either* a 'docid:' or 'msgid:' pointing to
|
||||||
@ -847,6 +904,11 @@ cmd_move (MuStore *store, MuQuery *query, GSList *args, GError **err)
|
|||||||
MuFlags flags;
|
MuFlags flags;
|
||||||
const char *maildir, *flagstr;
|
const char *maildir, *flagstr;
|
||||||
|
|
||||||
|
/* check if the move is based on the message id; if so, handle
|
||||||
|
* it in move_msgid_maybe */
|
||||||
|
if (move_msgid_maybe (store, query, args, err))
|
||||||
|
return MU_OK;
|
||||||
|
|
||||||
maildir = get_string_from_args (args, "maildir", TRUE, err);
|
maildir = get_string_from_args (args, "maildir", TRUE, err);
|
||||||
flagstr = get_string_from_args (args, "flags", TRUE, err);
|
flagstr = get_string_from_args (args, "flags", TRUE, err);
|
||||||
|
|
||||||
@ -1074,7 +1136,6 @@ handle_args (MuStore *store, MuQuery *query, GSList *args, GError **err)
|
|||||||
{ "compose", cmd_compose },
|
{ "compose", cmd_compose },
|
||||||
{ "extract", cmd_extract },
|
{ "extract", cmd_extract },
|
||||||
{ "find", cmd_find },
|
{ "find", cmd_find },
|
||||||
/* { "flag", cmd_flag }, */
|
|
||||||
{ "index", cmd_index },
|
{ "index", cmd_index },
|
||||||
{ "mkdir", cmd_mkdir },
|
{ "mkdir", cmd_mkdir },
|
||||||
{ "move", cmd_move },
|
{ "move", cmd_move },
|
||||||
|
|||||||
Reference in New Issue
Block a user