static int tag_message (notmuch_database_t *notmuch, const char *message_id, char *file_tags, notmuch_bool_t remove_all, notmuch_bool_t synchronize_flags) { notmuch_status_t status; notmuch_tags_t *db_tags; char *db_tags_str; notmuch_message_t *message = NULL; const char *tag; char *next; int ret = 0; status = notmuch_database_find_message (notmuch, message_id, &message); if (status || message == NULL) { fprintf (stderr, "Warning: Cannot apply tags to %smessage: %s\n", message ? "" : "missing ", message_id); if (status) fprintf (stderr, "%s\n", notmuch_status_to_string(status)); return 1; } /* In order to detect missing messages, this check/optimization is * intentionally done *after* first finding the message. */ if (!remove_all && (file_tags == NULL || *file_tags == '\0')) goto DONE; db_tags_str = NULL; for (db_tags = notmuch_message_get_tags (message); notmuch_tags_valid (db_tags); notmuch_tags_move_to_next (db_tags)) { tag = notmuch_tags_get (db_tags); if (db_tags_str) db_tags_str = talloc_asprintf_append (db_tags_str, " %s", tag); else db_tags_str = talloc_strdup (message, tag); } if (((file_tags == NULL || *file_tags == '\0') && (db_tags_str == NULL || *db_tags_str == '\0')) || (file_tags && db_tags_str && strcmp (file_tags, db_tags_str) == 0)) goto DONE; notmuch_message_freeze (message); if (remove_all) notmuch_message_remove_all_tags (message); next = file_tags; while (next) { tag = strsep (&next, " "); if (*tag == '\0') continue; status = notmuch_message_add_tag (message, tag); if (status) { fprintf (stderr, "Error applying tag %s to message %s:\n", tag, message_id); fprintf (stderr, "%s\n", notmuch_status_to_string (status)); ret = 1; } } notmuch_message_thaw (message); if (synchronize_flags) notmuch_message_tags_to_maildir_flags (message); DONE: if (message) notmuch_message_destroy (message); return ret; }
notmuch_status_t tag_op_list_apply (notmuch_message_t *message, tag_op_list_t *list, tag_op_flag_t flags) { size_t i; notmuch_status_t status = 0; tag_operation_t *tag_ops = list->ops; if (! (flags & TAG_FLAG_PRE_OPTIMIZED) && ! makes_changes (message, list, flags)) return NOTMUCH_STATUS_SUCCESS; status = notmuch_message_freeze (message); if (status) { message_error (message, status, "freezing message"); return status; } if (flags & TAG_FLAG_REMOVE_ALL) { status = notmuch_message_remove_all_tags (message); if (status) { message_error (message, status, "removing all tags"); return status; } } for (i = 0; i < list->count; i++) { if (tag_ops[i].remove) { status = notmuch_message_remove_tag (message, tag_ops[i].tag); if (status) { message_error (message, status, "removing tag %s", tag_ops[i].tag); return status; } } else { status = notmuch_message_add_tag (message, tag_ops[i].tag); if (status) { message_error (message, status, "adding tag %s", tag_ops[i].tag); return status; } } } status = notmuch_message_thaw (message); if (status) { message_error (message, status, "thawing message"); return status; } if (flags & TAG_FLAG_MAILDIR_SYNC) { status = notmuch_message_tags_to_maildir_flags (message); if (status) { message_error (message, status, "synching tags to maildir"); return status; } } return NOTMUCH_STATUS_SUCCESS; }