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.
This commit is contained in:
Daniel Kahn Gillmor 2016-04-08 22:54:52 -03:00 committed by David Bremner
parent 1695415039
commit e366bb2227
3 changed files with 21 additions and 26 deletions

View file

@ -1098,6 +1098,26 @@ _notmuch_message_delete (notmuch_message_t *message)
notmuch_message_destroy (ghost); notmuch_message_destroy (ghost);
status = COERCE_STATUS (private_status, "Error converting to ghost message"); 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); notmuch_query_destroy (query);
return status; return status;

View file

@ -116,25 +116,4 @@ MAIL_DIR/bar/new/21:2,
MAIL_DIR/bar/new/22:2, MAIL_DIR/bar/new/22:2,
MAIL_DIR/cur/51: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 test_done

View file

@ -119,10 +119,6 @@ notmuch new >/dev/null
test_thread_count 0 'All messages gone: no threads' test_thread_count 0 'All messages gone: no threads'
test_content_count apple 0 test_content_count apple 0
test_content_count banana 0 test_content_count banana 0
test_begin_subtest 'No ghosts should remain after full thread deletion' test_ghost_count 0 '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_done test_done