コード例 #1
0
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;
}
コード例 #2
0
ファイル: tag-util.c プロジェクト: MatthewMDavis/notmuch
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;

}