aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>2016-04-08 22:54:52 -0300
committerDavid Bremner <david@tethera.net>2016-04-15 07:13:49 -0300
commite366bb222722d6a635b736e875b760d82b46d1f5 (patch)
tree68dd640bf735f8a64747f7cef6d5460b234231be
parent1695415039803fd3b317bccbb3ceca0472bed373 (diff)
complete ghost-on-removal-when-shared-thread-exists
To fully complete the ghost-on-removal-when-shared-thread-exists proposal, we need to clear all ghost messages when the last active message is removed from a thread. Amended by db: Remove the last test of T530, as it no longer makes sense if we are garbage collecting ghost messages.
-rw-r--r--lib/message.cc20
-rwxr-xr-xtest/T530-upgrade.sh21
-rwxr-xr-xtest/T590-thread-breakage.sh6
3 files changed, 21 insertions, 26 deletions
diff --git a/lib/message.cc b/lib/message.cc
index b9404538..68393055 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -1098,6 +1098,26 @@ _notmuch_message_delete (notmuch_message_t *message)
notmuch_message_destroy (ghost);
status = COERCE_STATUS (private_status, "Error converting to ghost message");
+ } else {
+ /* the thread is empty; drop all ghost messages from it */
+ notmuch_messages_t *messages;
+ status = _notmuch_query_search_documents (query,
+ "ghost",
+ &messages);
+ if (status == NOTMUCH_STATUS_SUCCESS) {
+ notmuch_status_t last_error = NOTMUCH_STATUS_SUCCESS;
+ while (notmuch_messages_valid (messages)) {
+ message = notmuch_messages_get (messages);
+ status = _notmuch_message_delete (message);
+ if (status) /* we'll report the last failure we see;
+ * if there is more than one failure, we
+ * forget about previous ones */
+ last_error = status;
+ notmuch_message_destroy (message);
+ notmuch_messages_move_to_next (messages);
+ }
+ status = last_error;
+ }
}
notmuch_query_destroy (query);
return status;
diff --git a/test/T530-upgrade.sh b/test/T530-upgrade.sh
index 7faf03d3..a3a7d39c 100755
--- a/test/T530-upgrade.sh
+++ b/test/T530-upgrade.sh
@@ -116,25 +116,4 @@ MAIL_DIR/bar/new/21:2,
MAIL_DIR/bar/new/22:2,
MAIL_DIR/cur/51:2,"
-# Ghost messages are difficult to test since they're nearly invisible.
-# However, if the upgrade works correctly, the ghost message should
-# retain the right thread ID even if all of the original messages in
-# the thread are deleted. That's what we test. This won't detect if
-# the upgrade just plain didn't happen, but it should detect if
-# something went wrong.
-test_begin_subtest "ghost message retains thread ID"
-# Upgrade database
-notmuch new
-# Get thread ID of real message
-thread=$(notmuch search --output=threads id:4EFC743A.3060609@april.org)
-# Delete all real messages in that thread
-rm $(notmuch search --output=files $thread)
-notmuch new
-# "Deliver" ghost message
-add_message '[subject]=Ghost' '[id]=4EFC3931.6030007@april.org'
-# If the ghost upgrade worked, the new message should be attached to
-# the existing thread ID.
-nthread=$(notmuch search --output=threads id:4EFC3931.6030007@april.org)
-test_expect_equal "$thread" "$nthread"
-
test_done
diff --git a/test/T590-thread-breakage.sh b/test/T590-thread-breakage.sh
index 4385c066..6e4031af 100755
--- a/test/T590-thread-breakage.sh
+++ b/test/T590-thread-breakage.sh
@@ -119,10 +119,6 @@ notmuch new >/dev/null
test_thread_count 0 'All messages gone: no threads'
test_content_count apple 0
test_content_count banana 0
-test_begin_subtest 'No ghosts should remain after full thread deletion'
-# this is known to fail; we are leaking ghost messages deliberately
-test_subtest_known_broken
-ghosts=$(../ghost-report ${MAIL_DIR}/.notmuch/xapian)
-test_expect_equal "$ghosts" "0"
+test_ghost_count 0 'No ghosts should remain after full thread deletion'
test_done