--- /dev/null
+Return-Path: <amthrax@drake.mit.edu>\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 84DD3429E2B\r
+ for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:07:27 -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 OnsD6EdvPy4E for <notmuch@notmuchmail.org>;\r
+ Sat, 11 Jun 2011 13:07:27 -0700 (PDT)\r
+Received: from dmz-mailsec-scanner-3.mit.edu (DMZ-MAILSEC-SCANNER-3.MIT.EDU\r
+ [18.9.25.14])\r
+ by olra.theworths.org (Postfix) with ESMTP id D6F46431FB6\r
+ for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:07:26 -0700 (PDT)\r
+X-AuditID: 1209190e-b7c39ae000000a8c-b9-4df3caedecc7\r
+Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])\r
+ by dmz-mailsec-scanner-3.mit.edu (Symantec Messaging Gateway) with SMTP\r
+ id 09.7A.02700.DEAC3FD4; Sat, 11 Jun 2011 16:07:09 -0400 (EDT)\r
+Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])\r
+ by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id p5BK7QrI030878; \r
+ Sat, 11 Jun 2011 16:07:26 -0400\r
+Received: from drake.mit.edu\r
+ (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com\r
+ [209.6.116.242]) (authenticated bits=0)\r
+ (User authenticated as amdragon@ATHENA.MIT.EDU)\r
+ by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id p5BK7PAn006058\r
+ (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
+ Sat, 11 Jun 2011 16:07:26 -0400 (EDT)\r
+Received: from amthrax by drake.mit.edu with local (Exim 4.76)\r
+ (envelope-from <amthrax@drake.mit.edu>)\r
+ id 1QVUSr-0000Ie-69; Sat, 11 Jun 2011 16:07:25 -0400\r
+From: Austin Clements <amdragon@MIT.EDU>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 15/17] new: Synchronize maildir flags eagerly.\r
+Date: Sat, 11 Jun 2011 16:04:41 -0400\r
+Message-Id: <1307822683-848-16-git-send-email-amdragon@mit.edu>\r
+X-Mailer: git-send-email 1.7.5.1\r
+In-Reply-To: <1307822683-848-1-git-send-email-amdragon@mit.edu>\r
+References: <87ei34rnc5.fsf@yoom.home.cworth.org>\r
+ <1307822683-848-1-git-send-email-amdragon@mit.edu>\r
+X-Brightmail-Tracker:\r
+ H4sIAAAAAAAAA+NgFtrPIsWRmVeSWpSXmKPExsUixG6novv21Gdfg4Y2MYvrN2cyOzB6PFt1\r
+ izmAMYrLJiU1J7MstUjfLoEr48zlc4wFb+QrPs+cwtTA+EKyi5GTQ0LAROJk8xwmCFtM4sK9\r
+ 9WxdjFwcQgL7GCWmbpnGDOFsYJQ49nIqE4Rzn0libcd/KGc+o8TdfU3sIP1sAhoS2/YvZwSx\r
+ RQSkJXbenc3axcjBwSygJvGnSwUkLCxgJ/F7xXdWEJtFQFXi+ff3YK28AvYSV+Z/YYU4Q0Hi\r
+ ypV5LCA2J1B83sGrYLaQQJrEklu72Scw8i9gZFjFKJuSW6Wbm5iZU5yarFucnJiXl1qka6yX\r
+ m1mil5pSuokRFDacknw7GL8eVDrEKMDBqMTDq7f2s68Qa2JZcWXuIUZJDiYlUV6dE0AhvqT8\r
+ lMqMxOKM+KLSnNTiQ4wSHMxKIrzr2z/5CvGmJFZWpRblw6SkOViUxHlnSqr7CgmkJ5akZqem\r
+ FqQWwWRlODiUJHglgfEhJFiUmp5akZaZU4KQZuLgBBnOAzT86EmgGt7igsTc4sx0iPwpRl2O\r
+ xxs2HWIUYsnLz0uVEudVBxkkAFKUUZoHNwcW768YxYHeEub9ATKKB5gq4Ca9AlrCBLREoBRs\r
+ SUkiQkqqgVFpQeikjU+ZOhm2/WibJ5Oxstvjzc6Zd5XOzNI6+3LaorW7rVUPPj2zZ8nXN24Z\r
+ +ilnbfNecfPs3nztukXnXdfQ84lxSYbch5sSF9+dbhxY9vYEgzOv+PyWSr9p3mub9oS79ZxP\r
+ axZ49e10Dk+EG9+N9yvfx9hOnrYvPkbJ63/zmaW2x9Jutz1XYinOSDTUYi4qTgQAUrt5ZdIC AAA=\r
+Cc: Austin Clements <amdragon@mit.edu>\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: Sat, 11 Jun 2011 20:07:27 -0000\r
+\r
+Because flag synchronization is stateless, it can be performed at any\r
+time as long as it's guaranteed to be performed after any change to a\r
+message's filename list. Take advantage of this to synchronize tags\r
+immediately after a filename is added or removed.\r
+\r
+This does not yet make adding or removing a message atomic, but it is\r
+a big step toward atomicity because it reduces the window where the\r
+database tags are inconsistent from nearly the entire notmuch-new to\r
+just around when the message is added or removed.\r
+---\r
+ notmuch-new.c | 42 ++++++++----------------------------------\r
+ 1 files changed, 8 insertions(+), 34 deletions(-)\r
+\r
+diff --git a/notmuch-new.c b/notmuch-new.c\r
+index dc349f6..b24eb51 100644\r
+--- a/notmuch-new.c\r
++++ b/notmuch-new.c\r
+@@ -50,7 +50,6 @@ typedef struct {\r
+ _filename_list_t *directory_mtimes;\r
+ \r
+ notmuch_bool_t synchronize_flags;\r
+- _filename_list_t *message_ids_to_sync;\r
+ } add_files_state_t;\r
+ \r
+ static volatile sig_atomic_t do_print_progress = 0;\r
+@@ -443,11 +442,8 @@ add_files_recursive (notmuch_database_t *notmuch,\r
+ break;\r
+ /* Non-fatal issues (go on to next file) */\r
+ case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:\r
+- /* Defer sync of maildir flags until after old filenames\r
+- * are removed in the case of a rename. */\r
+ if (state->synchronize_flags == TRUE)\r
+- _filename_list_add (state->message_ids_to_sync,\r
+- notmuch_message_get_message_id (message));\r
++ notmuch_message_maildir_flags_to_tags (message);\r
+ break;\r
+ case NOTMUCH_STATUS_FILE_NOT_EMAIL:\r
+ fprintf (stderr, "Note: Ignoring non-mail file: %s\n",\r
+@@ -703,11 +699,16 @@ remove_filename (notmuch_database_t *notmuch,\r
+ add_files_state_t *add_files_state)\r
+ {\r
+ notmuch_status_t status;\r
++ notmuch_message_t *message;\r
++ message = notmuch_database_find_message_by_filename (notmuch, path);\r
+ status = notmuch_database_remove_message (notmuch, path);\r
+- if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)\r
++ if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {\r
+ add_files_state->renamed_messages++;\r
+- else\r
++ if (add_files_state->synchronize_flags == TRUE)\r
++ notmuch_message_maildir_flags_to_tags (message);\r
++ } else\r
+ add_files_state->removed_messages++;\r
++ notmuch_message_destroy (message);\r
+ return status;\r
+ }\r
+ \r
+@@ -782,7 +783,6 @@ notmuch_new_command (void *ctx, int argc, char *argv[])\r
+ \r
+ add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);\r
+ add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);\r
+- add_files_state.message_ids_to_sync = _filename_list_create (ctx);\r
+ db_path = notmuch_config_get_database_path (config);\r
+ \r
+ dot_notmuch_path = talloc_asprintf (ctx, "%s/%s", db_path, ".notmuch");\r
+@@ -883,32 +883,6 @@ notmuch_new_command (void *ctx, int argc, char *argv[])\r
+ talloc_free (add_files_state.removed_directories);\r
+ talloc_free (add_files_state.directory_mtimes);\r
+ \r
+- /* Now that removals are done (hence the database is aware of all\r
+- * renames), we can synchronize maildir_flags to tags for all\r
+- * messages that had new filenames appear on this run. */\r
+- gettimeofday (&tv_start, NULL);\r
+- if (add_files_state.synchronize_flags) {\r
+- _filename_node_t *node;\r
+- notmuch_message_t *message;\r
+- for (node = add_files_state.message_ids_to_sync->head, i = 0;\r
+- node;\r
+- node = node->next, i++)\r
+- {\r
+- message = notmuch_database_find_message (notmuch, node->filename);\r
+- notmuch_message_maildir_flags_to_tags (message);\r
+- notmuch_message_destroy (message);\r
+- if (do_print_progress) {\r
+- do_print_progress = 0;\r
+- generic_print_progress (\r
+- "Synchronized tags for", "messages",\r
+- tv_start, i, add_files_state.message_ids_to_sync->count);\r
+- }\r
+- }\r
+- }\r
+-\r
+- talloc_free (add_files_state.message_ids_to_sync);\r
+- add_files_state.message_ids_to_sync = NULL;\r
+-\r
+ if (timer_is_active)\r
+ stop_progress_printing_timer ();\r
+ \r
+-- \r
+1.7.5.1\r
+\r