thread.cc: Avoid empty thread names if possible.

Currently the thread is named based on either the oldest or newest
matching message (depending on the search order). If this message has
an empty subject, though, the thread will show up with an empty
subject in the search results. (See the thread starting with
`id:1412371140-21051-1-git-send-email-david@tethera.net` for an
example.)

This changes the behavior so it will use a non-empty name for the
thread if possible. We name threads based on (a) non-empty matches for
the query, and (b) the search order. If the search order is
oldest-first (as in the default inbox) it chooses the oldest matching
non-empty message as the subject. If the search order is newest-first
it chooses the newest one.
This commit is contained in:
Jesse Rosenthal 2014-10-29 16:51:43 -04:00 committed by David Bremner
parent 71fb37d482
commit 67e368ac7b

View file

@ -24,6 +24,8 @@
#include <gmime/gmime.h> #include <gmime/gmime.h>
#include <glib.h> /* GHashTable */ #include <glib.h> /* GHashTable */
#define EMPTY_STRING(s) ((s)[0] == '\0')
struct visible _notmuch_thread { struct visible _notmuch_thread {
notmuch_database_t *notmuch; notmuch_database_t *notmuch;
char *thread_id; char *thread_id;
@ -332,10 +334,12 @@ _thread_set_subject_from_message (notmuch_thread_t *thread,
cleaned_subject = talloc_strdup (thread, subject); cleaned_subject = talloc_strdup (thread, subject);
} }
if (thread->subject) if (! EMPTY_STRING(cleaned_subject)) {
talloc_free (thread->subject); if (thread->subject)
talloc_free (thread->subject);
thread->subject = talloc_strdup (thread, cleaned_subject); thread->subject = talloc_strdup (thread, cleaned_subject);
}
} }
/* Add a message to this thread which is known to match the original /* Add a message to this thread which is known to match the original
@ -349,8 +353,10 @@ _thread_add_matched_message (notmuch_thread_t *thread,
{ {
time_t date; time_t date;
notmuch_message_t *hashed_message; notmuch_message_t *hashed_message;
const char *cur_subject;
date = notmuch_message_get_date (message); date = notmuch_message_get_date (message);
cur_subject = notmuch_thread_get_subject(thread);
if (date < thread->oldest || ! thread->matched_messages) { if (date < thread->oldest || ! thread->matched_messages) {
thread->oldest = date; thread->oldest = date;
@ -360,7 +366,7 @@ _thread_add_matched_message (notmuch_thread_t *thread,
if (date > thread->newest || ! thread->matched_messages) { if (date > thread->newest || ! thread->matched_messages) {
thread->newest = date; thread->newest = date;
if (sort != NOTMUCH_SORT_OLDEST_FIRST) if (sort != NOTMUCH_SORT_OLDEST_FIRST || EMPTY_STRING(cur_subject))
_thread_set_subject_from_message (thread, message); _thread_set_subject_from_message (thread, message);
} }