From 6cef2340dbe05120373134e301f842a0cfd147cb Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Sun, 25 Mar 2012 22:18:45 +0300 Subject: [PATCH] [PATCH v2 3/3] cli: refactor "notmuch restore" message tagging into a separate function --- 55/843a9fc41f566f4058e0b3960cb817cc8b6f04 | 254 ++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 55/843a9fc41f566f4058e0b3960cb817cc8b6f04 diff --git a/55/843a9fc41f566f4058e0b3960cb817cc8b6f04 b/55/843a9fc41f566f4058e0b3960cb817cc8b6f04 new file mode 100644 index 000000000..d26530baf --- /dev/null +++ b/55/843a9fc41f566f4058e0b3960cb817cc8b6f04 @@ -0,0 +1,254 @@ +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 9B41B431FBF + for ; Sun, 25 Mar 2012 12:19:04 -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 dmZkproJ7BTN for ; + Sun, 25 Mar 2012 12:19:02 -0700 (PDT) +Received: from mail-lpp01m010-f53.google.com (mail-lpp01m010-f53.google.com + [209.85.215.53]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id DA772431FC9 + for ; Sun, 25 Mar 2012 12:19:00 -0700 (PDT) +Received: by mail-lpp01m010-f53.google.com with SMTP id c1so3755652lah.26 + for ; Sun, 25 Mar 2012 12:19:00 -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=AJ9+WRqb66WzxQqfmZhdToi+tz7frzO3owJaCAzw6FY=; + b=CBPvjNkL/OPI3AyMSoc/IoQECDSH1t8RY+AUJUMFbArba4Znrd7eJyZdOm6UPQ3x2P + aLR/0jlMZW6kfByLJ8XsSmIcUrv0y48TjfJTagWrOCsJx+tw4RSr1d1cq5Wh6EjjTNAS + y5nhWxkx8Kx15q6GJtr7dgekYYjvH6NDR2dEhpPhCy6KuCscex7ODrYP5zNcLaMElgJs + SwpUsrgQJD661NHLIdJ7xByihkaNcimdLRQ/WYoRHz6NZp9Um2F4eVqdSq94mCmExKAx + 0rLKzxZjpl92KIsgur1FLHeZGvnProyKQwFKQ33StTX5OscvIRfYqFyIXcZUBsSze+dF + nBZQ== +Received: by 10.112.38.170 with SMTP id h10mr4706096lbk.73.1332703140476; + Sun, 25 Mar 2012 12:19:00 -0700 (PDT) +Received: from localhost (dsl-hkibrasgw4-fe50f800-253.dhcp.inet.fi. + [84.248.80.253]) + by mx.google.com with ESMTPS id pw4sm14836501lab.8.2012.03.25.12.18.58 + (version=SSLv3 cipher=OTHER); Sun, 25 Mar 2012 12:18:59 -0700 (PDT) +From: Jani Nikula +To: notmuch@notmuchmail.org +Subject: [PATCH v2 3/3] cli: refactor "notmuch restore" message tagging into a + separate function +Date: Sun, 25 Mar 2012 22:18:45 +0300 +Message-Id: + <4e41657c8c748db5b29aaa627eebed5c2618d56a.1332702915.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: + ALoCoQk76XxzqWex54pW3ZTr1UbDHnFxFosj+caKd3Gvh8J9ghbLUwcZMw517kjKSqJAgcICe/QF +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: Sun, 25 Mar 2012 19:19:04 -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..2e965af 100644 +--- a/notmuch-restore.c ++++ b/notmuch-restore.c +@@ -21,6 +21,81 @@ + #include "notmuch-client.h" + + int ++tag_message (void *ctx, 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[]) + { + notmuch_config_t *config; +@@ -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 (ctx, 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 + -- 2.26.2