From: Jani Nikula Date: Mon, 26 Mar 2012 21:04:11 +0000 (+0300) Subject: [PATCH v3 4/4] cli: refactor "notmuch restore" message tagging into a separate function X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=792458092f70e2851de87ad614d559d0b171806e;p=notmuch-archives.git [PATCH v3 4/4] cli: refactor "notmuch restore" message tagging into a separate function --- diff --git a/50/a7f8556b38b790bf89ab5a4556186981085d01 b/50/a7f8556b38b790bf89ab5a4556186981085d01 new file mode 100644 index 000000000..2f061cd95 --- /dev/null +++ b/50/a7f8556b38b790bf89ab5a4556186981085d01 @@ -0,0 +1,255 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 56BED431FAF + for ; Mon, 26 Mar 2012 14:04:32 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id sKa5cwRN89ih for ; + Mon, 26 Mar 2012 14:04:30 -0700 (PDT) +Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com + [209.85.217.181]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id 51A6D431FBC + for ; Mon, 26 Mar 2012 14:04:30 -0700 (PDT) +Received: by mail-lb0-f181.google.com with SMTP id k6so4671094lbo.26 + for ; Mon, 26 Mar 2012 14:04:29 -0700 (PDT) +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=google.com; s=20120113; + h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references + :in-reply-to:references:x-gm-message-state; + bh=NbxBC2Q6wsUiVSAxHgQmlCZt5DEP72f9wsAhbaQEXU4=; + b=NUzT/SswmIKb1xfmTlGUjSwI8bxgFC5Gulz0/CettLlKNbi9YGNHGhaxqgveSo4Y4d + URZkCaSIWry+HNG4MH5km+BiekLR0RwjNJNMeZIo/ScZbkvMe9FH38LG6pTvzhHy/USe + OCaw74x0lSBCtnfYx56JwJRgE9gX+xnw9hpDKN0LGmkQtsqKn3mwttCeQ53j/RLNHYjh + fS0zsM87FyFfYUFi5o5dkaAz+HJgkjX4WXzVuEzroeMQEWpaCaZzpn29lu0f3Fro0fj8 + 7Ob85ZGXdwx8kI/T78NdEBfUsbtqCbfDERm7rj5YCu1GIkJMeqmHyVWDKx3dhMQ9cd8O + LaCQ== +Received: by 10.152.127.136 with SMTP id ng8mr17304075lab.16.1332795869902; + Mon, 26 Mar 2012 14:04:29 -0700 (PDT) +Received: from localhost (dsl-hkibrasgw4-fe50f800-253.dhcp.inet.fi. + [84.248.80.253]) + by mx.google.com with ESMTPS id cr11sm23301458lbb.0.2012.03.26.14.04.27 + (version=SSLv3 cipher=OTHER); Mon, 26 Mar 2012 14:04:28 -0700 (PDT) +From: Jani Nikula +To: notmuch@notmuchmail.org +Subject: [PATCH v3 4/4] cli: refactor "notmuch restore" message tagging into a + separate function +Date: Tue, 27 Mar 2012 00:04:11 +0300 +Message-Id: + <62224861c399973dc60f33e616a61b0d641b0cab.1332795415.git.jani@nikula.org> +X-Mailer: git-send-email 1.7.5.4 +In-Reply-To: +References: +In-Reply-To: +References: +X-Gm-Message-State: + ALoCoQlEAVp9ZAewx8KVONkZE1AhzFlvmaL2iqaYkxCagCdKR3lgDvg7hQmNDfvRfQPw3o4+/9wI +Cc: tomi.ollila@iki.fi +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Mon, 26 Mar 2012 21:04:32 -0000 + +Refactor to make tagging code easier to reuse in the future. No +functional changes. + +Signed-off-by: Jani Nikula +--- + notmuch-restore.c | 148 ++++++++++++++++++++++++++++------------------------- + 1 files changed, 78 insertions(+), 70 deletions(-) + +diff --git a/notmuch-restore.c b/notmuch-restore.c +index 87d9772..d3b9246 100644 +--- a/notmuch-restore.c ++++ b/notmuch-restore.c +@@ -20,6 +20,81 @@ + + #include "notmuch-client.h" + ++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; ++} ++ + int + notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) + { +@@ -88,11 +163,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) + + while ((line_len = getline (&line, &line_size, input)) != -1) { + regmatch_t match[3]; +- char *message_id, *file_tags, *tag, *next; +- notmuch_message_t *message = NULL; +- notmuch_status_t status; +- notmuch_tags_t *db_tags; +- char *db_tags_str; ++ char *message_id, *file_tags; + + chomp_newline (line); + +@@ -109,72 +180,9 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) + file_tags = xstrndup (line + match[2].rm_so, + match[2].rm_eo - match[2].rm_so); + +- 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)); +- goto NEXT_LINE; +- } +- +- /* In order to detect missing messages, this check/optimization is +- * intentionally done *after* first finding the message. */ +- if (accumulate && (file_tags == NULL || *file_tags == '\0')) +- { +- goto NEXT_LINE; +- } +- +- db_tags_str = NULL; +- for (db_tags = notmuch_message_get_tags (message); +- notmuch_tags_valid (db_tags); +- notmuch_tags_move_to_next (db_tags)) +- { +- const char *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 NEXT_LINE; +- } +- +- notmuch_message_freeze (message); +- +- if (!accumulate) +- 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)); +- } +- } +- +- notmuch_message_thaw (message); +- +- if (synchronize_flags) +- notmuch_message_tags_to_maildir_flags (message); ++ tag_message (notmuch, message_id, file_tags, !accumulate, ++ synchronize_flags); + +- NEXT_LINE: +- if (message) +- notmuch_message_destroy (message); +- message = NULL; + free (message_id); + free (file_tags); + } +-- +1.7.5.4 +