[PATCH] Add configurable changed tag to messages that have been changed on disk
authorGaute Hope <eg@gaute.vetsj.com>
Sun, 6 Apr 2014 16:11:23 +0000 (18:11 +0200)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 18:01:21 +0000 (10:01 -0800)
d3/4ca7033f729b1dee659e790f4f5ac1b032af5b [new file with mode: 0644]

diff --git a/d3/4ca7033f729b1dee659e790f4f5ac1b032af5b b/d3/4ca7033f729b1dee659e790f4f5ac1b032af5b
new file mode 100644 (file)
index 0000000..dff2821
--- /dev/null
@@ -0,0 +1,368 @@
+Return-Path: <eg@gaute.vetsj.com>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 06615431FBC\r
+       for <notmuch@notmuchmail.org>; Sun,  6 Apr 2014 09:12:55 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+       tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id Z1fBRpAvTIbu for <notmuch@notmuchmail.org>;\r
+       Sun,  6 Apr 2014 09:12:47 -0700 (PDT)\r
+Received: from mail-we0-f171.google.com (mail-we0-f171.google.com\r
+       [74.125.82.171]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id D7A18431FB6\r
+       for <notmuch@notmuchmail.org>; Sun,  6 Apr 2014 09:12:46 -0700 (PDT)\r
+Received: by mail-we0-f171.google.com with SMTP id t61so5674112wes.16\r
+       for <notmuch@notmuchmail.org>; Sun, 06 Apr 2014 09:12:44 -0700 (PDT)\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+       d=1e100.net; s=20130820;\r
+       h=x-gm-message-state:from:to:cc:subject:date:message-id;\r
+       bh=xnlWSPwhR6JuK24gvecKiujzIIJJTGKqVWuvlipNrTs=;\r
+       b=BWCRKj7zlVxRuZv24KkyFYKLFkkzLlynPhJ4E1TCn5+xGP1+gbk4tHo1f7khGbDTe2\r
+       sG82IYt1bQYf1ILgSLSRWaLEdf1X54bo2rjs+xC1LvbmlWyqbi0K6gDoPiwrXCm6O+eK\r
+       CgjOxEWuabBoOpCpCTZeTA05MafQ1zaOhZP6SgBbK2lzWtXxwOT20pwdnAnDt5cCywn5\r
+       7M2fWeAvBLgPsVAirSEwy7NSIat1fALWq4lpiEoUESXcWo+YOjxLeYRBGxQbNKzx0dLP\r
+       5kWqLUR66ZfCp9n2kee6r7c/I+27i+U8bVP1412tyVESBVwMaQZaZUuszi2Ifuo1BhZH\r
+       vJ1g==\r
+X-Gm-Message-State:\r
+ ALoCoQk8QRRKz3SqUix/D50k1MZQ2lnvwQckV84OmQy2mmklENBMzDJrB8kUSOTrAx2KK2gtPD3T\r
+X-Received: by 10.194.48.80 with SMTP id j16mr36104947wjn.44.1396800764024;\r
+       Sun, 06 Apr 2014 09:12:44 -0700 (PDT)\r
+Received: from localhost ([188.113.84.221])\r
+       by mx.google.com with ESMTPSA id n41sm35458956eeg.4.2014.04.06.09.12.42\r
+       for <multiple recipients>\r
+       (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
+       Sun, 06 Apr 2014 09:12:43 -0700 (PDT)\r
+From: Gaute Hope <eg@gaute.vetsj.com>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH] Add configurable changed tag to messages that have been\r
+       changed on disk\r
+Date: Sun,  6 Apr 2014 18:11:23 +0200\r
+Message-Id: <1396800683-9164-1-git-send-email-eg@gaute.vetsj.com>\r
+X-Mailer: git-send-email 1.9.1\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sun, 06 Apr 2014 16:12:55 -0000\r
+\r
+When one of the source files for a message is changed on disk, renamed,\r
+deleted or a new source file is added. A configurable changed tag is\r
+is added. The tag can be configured under the option 'changed_tags' in\r
+the [new] section, the default is none. Tests have been updated to\r
+accept the new config option.\r
+\r
+notmuch-setup now asks for a changed tag after the new tags question.\r
+\r
+This could be useful for for example 'afew' to detect remote changes in\r
+IMAP folders and update the FolderNameFilter to also add tags or remove\r
+tags when a _existing_ message has been added to or removed from a\r
+maildir.\r
+---\r
+ notmuch-client.h    |  8 ++++++++\r
+ notmuch-config.c    | 42 ++++++++++++++++++++++++++++++++++++++----\r
+ notmuch-new.c       | 34 +++++++++++++++++++++++++++++-----\r
+ notmuch-setup.c     | 17 +++++++++++++++++\r
+ test/T030-config.sh |  1 +\r
+ test/T040-setup.sh  |  2 ++\r
+ 6 files changed, 95 insertions(+), 9 deletions(-)\r
+\r
+diff --git a/notmuch-client.h b/notmuch-client.h\r
+index d110648..8b60645 100644\r
+--- a/notmuch-client.h\r
++++ b/notmuch-client.h\r
+@@ -314,6 +314,14 @@ notmuch_config_set_new_ignore (notmuch_config_t *config,\r
+                              const char *new_ignore[],\r
+                              size_t length);\r
\r
++const char **\r
++notmuch_config_get_changed_tags (notmuch_config_t *config,\r
++                           size_t *length);\r
++void\r
++notmuch_config_set_changed_tags (notmuch_config_t *config,\r
++                           const char *changed_tags[],\r
++                           size_t length);\r
++\r
+ notmuch_bool_t\r
+ notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config);\r
\r
+diff --git a/notmuch-config.c b/notmuch-config.c\r
+index 8d28653..5ea0635 100644\r
+--- a/notmuch-config.c\r
++++ b/notmuch-config.c\r
+@@ -51,7 +51,11 @@ static const char new_config_comment[] =\r
+     "\n"\r
+     "\t       NOTE: *Every* file/directory that goes by one of those\n"\r
+     "\t       names will be ignored, independent of its depth/location\n"\r
+-    "\t       in the mail store.\n";\r
++    "\t       in the mail store.\n"\r
++    "\n"\r
++    "\tchanged_tags A list (separated by ';') of tags that will be\n"\r
++    "\t added to messages where a one or more of its source files have\n"\r
++    "\t have been changed (added, renamed or deleted).\n";\r
\r
+ static const char user_config_comment[] =\r
+     " User configuration\n"\r
+@@ -111,10 +115,15 @@ struct _notmuch_config {\r
+     char *user_primary_email;\r
+     const char **user_other_email;\r
+     size_t user_other_email_length;\r
++\r
+     const char **new_tags;\r
+     size_t new_tags_length;\r
+     const char **new_ignore;\r
+     size_t new_ignore_length;\r
++\r
++    const char **changed_tags;\r
++    size_t changed_tags_length;\r
++\r
+     notmuch_bool_t maildir_synchronize_flags;\r
+     const char **search_exclude_tags;\r
+     size_t search_exclude_tags_length;\r
+@@ -249,7 +258,7 @@ notmuch_config_open (void *ctx,\r
+       fprintf (stderr, "Out of memory.\n");\r
+       return NULL;\r
+     }\r
+-    \r
++\r
+     talloc_set_destructor (config, notmuch_config_destructor);\r
\r
+     if (filename) {\r
+@@ -273,6 +282,8 @@ notmuch_config_open (void *ctx,\r
+     config->new_tags_length = 0;\r
+     config->new_ignore = NULL;\r
+     config->new_ignore_length = 0;\r
++    config->changed_tags = NULL;\r
++    config->changed_tags_length = 0;\r
+     config->maildir_synchronize_flags = TRUE;\r
+     config->search_exclude_tags = NULL;\r
+     config->search_exclude_tags_length = 0;\r
+@@ -373,6 +384,10 @@ notmuch_config_open (void *ctx,\r
+       notmuch_config_set_new_ignore (config, NULL, 0);\r
+     }\r
\r
++    if (notmuch_config_get_changed_tags (config, &tmp) == NULL) {\r
++      notmuch_config_set_changed_tags (config, NULL, 0);\r
++    }\r
++\r
+     if (notmuch_config_get_search_exclude_tags (config, &tmp) == NULL) {\r
+       if (config->is_new) {\r
+           const char *tags[] = { "deleted", "spam" };\r
+@@ -422,7 +437,7 @@ notmuch_config_open (void *ctx,\r
+ }\r
\r
+ /* Close the given notmuch_config_t object, freeing all resources.\r
+- * \r
++ *\r
+  * Note: Any changes made to the configuration are *not* saved by this\r
+  * function. To save changes, call notmuch_config_save before\r
+  * notmuch_config_close.\r
+@@ -631,6 +646,14 @@ notmuch_config_get_new_ignore (notmuch_config_t *config, size_t *length)\r
+                            &(config->new_ignore_length), length);\r
+ }\r
\r
++const char **\r
++notmuch_config_get_changed_tags (notmuch_config_t *config,   size_t *length)\r
++{\r
++    return _config_get_list (config, "new", "changed_tags",\r
++                           &(config->changed_tags),\r
++                           &(config->changed_tags_length), length);\r
++}\r
++\r
+ void\r
+ notmuch_config_set_user_other_email (notmuch_config_t *config,\r
+                                    const char *list[],\r
+@@ -658,6 +681,15 @@ notmuch_config_set_new_ignore (notmuch_config_t *config,\r
+                    &(config->new_ignore));\r
+ }\r
\r
++void\r
++notmuch_config_set_changed_tags (notmuch_config_t *config,\r
++                                   const char *list[],\r
++                                   size_t length)\r
++{\r
++    _config_set_list (config, "new", "changed_tags", list, length,\r
++                   &(config->changed_tags));\r
++}\r
++\r
+ const char **\r
+ notmuch_config_get_search_exclude_tags (notmuch_config_t *config, size_t *length)\r
+ {\r
+@@ -714,17 +746,19 @@ notmuch_config_command_get (notmuch_config_t *config, char *item)\r
+     } else if (strcmp(item, "user.other_email") == 0) {\r
+       const char **other_email;\r
+       size_t i, length;\r
+-      \r
++\r
+       other_email = notmuch_config_get_user_other_email (config, &length);\r
+       for (i = 0; i < length; i++)\r
+           printf ("%s\n", other_email[i]);\r
+     } else if (strcmp(item, "new.tags") == 0) {\r
++\r
+       const char **tags;\r
+       size_t i, length;\r
\r
+       tags = notmuch_config_get_new_tags (config, &length);\r
+       for (i = 0; i < length; i++)\r
+           printf ("%s\n", tags[i]);\r
++\r
+     } else {\r
+       char **value;\r
+       size_t i, length;\r
+diff --git a/notmuch-new.c b/notmuch-new.c\r
+index 82acf69..db52961 100644\r
+--- a/notmuch-new.c\r
++++ b/notmuch-new.c\r
+@@ -50,6 +50,9 @@ typedef struct {\r
+     const char **new_ignore;\r
+     size_t new_ignore_length;\r
\r
++    const char **changed_tags;\r
++    size_t changed_tags_length;\r
++\r
+     int total_files;\r
+     int processed_files;\r
+     int added_messages, removed_messages, renamed_messages;\r
+@@ -274,8 +277,12 @@ add_file (notmuch_database_t *notmuch, const char *filename,\r
+       break;\r
+     /* Non-fatal issues (go on to next file). */\r
+     case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:\r
++      notmuch_message_freeze (message);\r
++      for (tag = state->changed_tags; *tag != NULL; tag++)\r
++          notmuch_message_add_tag (message, *tag);\r
+       if (state->synchronize_flags)\r
+           notmuch_message_maildir_flags_to_tags (message);\r
++      notmuch_message_thaw (message);\r
+       break;\r
+     case NOTMUCH_STATUS_FILE_NOT_EMAIL:\r
+       fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename);\r
+@@ -809,13 +816,25 @@ remove_filename (notmuch_database_t *notmuch,\r
\r
+     status = notmuch_database_remove_message (notmuch, path);\r
+     if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {\r
+-      add_files_state->renamed_messages++;\r
+-      if (add_files_state->synchronize_flags == TRUE)\r
+-          notmuch_message_maildir_flags_to_tags (message);\r
+-      status = NOTMUCH_STATUS_SUCCESS;\r
++\r
++    add_files_state->renamed_messages++;\r
++\r
++    /* add changed tags */\r
++    const char **tag;\r
++    for (tag = add_files_state->changed_tags; *tag != NULL; tag++)\r
++        notmuch_message_add_tag (message, *tag);\r
++\r
++    if (add_files_state->synchronize_flags == TRUE)\r
++        notmuch_message_maildir_flags_to_tags (message);\r
++\r
++    status = NOTMUCH_STATUS_SUCCESS;\r
++\r
+     } else if (status == NOTMUCH_STATUS_SUCCESS) {\r
+-      add_files_state->removed_messages++;\r
++\r
++      add_files_state->removed_messages++;\r
++\r
+     }\r
++\r
+     notmuch_message_destroy (message);\r
\r
+   DONE:\r
+@@ -946,8 +965,13 @@ notmuch_new_command (notmuch_config_t *config, int argc, char *argv[])\r
+     else if (verbose)\r
+       add_files_state.verbosity = VERBOSITY_VERBOSE;\r
\r
++    /* tags for added files */\r
+     add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);\r
+     add_files_state.new_ignore = notmuch_config_get_new_ignore (config, &add_files_state.new_ignore_length);\r
++\r
++    /* tags for changed files */\r
++    add_files_state.changed_tags = notmuch_config_get_changed_tags (config, &add_files_state.changed_tags_length);\r
++\r
+     add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);\r
+     db_path = notmuch_config_get_database_path (config);\r
\r
+diff --git a/notmuch-setup.c b/notmuch-setup.c\r
+index 36a6171..cf99ee0 100644\r
+--- a/notmuch-setup.c\r
++++ b/notmuch-setup.c\r
+@@ -131,6 +131,8 @@ notmuch_setup_command (notmuch_config_t *config,\r
+     unsigned int i;\r
+     const char **new_tags;\r
+     size_t new_tags_len;\r
++    const char **changed_tags;\r
++    size_t changed_tags_len;\r
+     const char **search_exclude_tags;\r
+     size_t search_exclude_tags_len;\r
\r
+@@ -206,6 +208,21 @@ notmuch_setup_command (notmuch_config_t *config,\r
+       g_ptr_array_free (tags, TRUE);\r
+     }\r
\r
++    changed_tags = notmuch_config_get_changed_tags (config, &changed_tags_len);\r
++\r
++    printf ("Tags to apply to all changed messages (separated by spaces) [");\r
++    print_tag_list (changed_tags, changed_tags_len);\r
++    prompt ("]: ");\r
++\r
++    if (strlen (response)) {\r
++      GPtrArray *tags = parse_tag_list (config, response);\r
++\r
++      notmuch_config_set_changed_tags (config, (const char **) tags->pdata,\r
++                                   tags->len);\r
++\r
++      g_ptr_array_free (tags, TRUE);\r
++    }\r
++\r
\r
+     search_exclude_tags = notmuch_config_get_search_exclude_tags (config, &search_exclude_tags_len);\r
\r
+diff --git a/test/T030-config.sh b/test/T030-config.sh\r
+index ca4cf33..d1e095b 100755\r
+--- a/test/T030-config.sh\r
++++ b/test/T030-config.sh\r
+@@ -52,6 +52,7 @@ user.primary_email=test_suite@notmuchmail.org\r
+ user.other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org\r
+ new.tags=unread;inbox;\r
+ new.ignore=\r
++new.changed_tags=\r
+ search.exclude_tags=\r
+ maildir.synchronize_flags=true\r
+ foo.string=this is another string value\r
+diff --git a/test/T040-setup.sh b/test/T040-setup.sh\r
+index 124ef1c..7e37ea1 100755\r
+--- a/test/T040-setup.sh\r
++++ b/test/T040-setup.sh\r
+@@ -11,6 +11,7 @@ another.suite@example.com\r
\r
+ /path/to/maildir\r
+ foo bar\r
++chaz\r
+ baz\r
+ EOF\r
+ output=$(notmuch --config=new-notmuch-config config list)\r
+@@ -21,6 +22,7 @@ user.primary_email=test.suite@example.com\r
+ user.other_email=another.suite@example.com;\r
+ new.tags=foo;bar;\r
+ new.ignore=\r
++new.changed_tags=chaz;\r
+ search.exclude_tags=baz;\r
+ maildir.synchronize_flags=true"\r
\r
+-- \r
+1.9.1\r
+\r