Name thread based on matching msgs instead of first msg.

At the moment all threads are named based on the name of the first message
in the thread. However, this can cause problems if people either start
new threads by replying-all (as unfortunately, many out there do) or
change the subject of their mails to reflect a shift in a thread on a
list.

This patch names threads based on (a) 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 message as the subject. If the
search order is newest-first it chooses the newest one.

Reply prefixes ("Re: ", "Aw: ", "Sv: ", "Vs: ") are ignored
(case-insensitively) so a Re: won't change the subject.

Note that this adds a "sort" argument to _notmuch_thread_create and
_thread_add_matched_message, so that when constructing the thread we can
be aware of the sort order.

Signed-off-by: Jesse Rosenthal <jrosenthal@jhu.edu>
This commit is contained in:
Jesse Rosenthal 2010-04-17 13:59:22 -04:00 committed by Carl Worth
parent 2186cac8e7
commit 4971b85641
3 changed files with 32 additions and 6 deletions

View file

@ -205,7 +205,8 @@ notmuch_thread_t *
_notmuch_thread_create (void *ctx, _notmuch_thread_create (void *ctx,
notmuch_database_t *notmuch, notmuch_database_t *notmuch,
const char *thread_id, const char *thread_id,
const char *query_string); const char *query_string,
notmuch_sort_t sort);
/* message.cc */ /* message.cc */

View file

@ -299,7 +299,8 @@ notmuch_threads_get (notmuch_threads_t *threads)
return _notmuch_thread_create (threads->query, return _notmuch_thread_create (threads->query,
threads->query->notmuch, threads->query->notmuch,
threads->thread_id, threads->thread_id,
threads->query->query_string); threads->query->query_string,
threads->query->sort);
} }
void void

View file

@ -129,7 +129,8 @@ _thread_add_message (notmuch_thread_t *thread,
static void static void
_thread_add_matched_message (notmuch_thread_t *thread, _thread_add_matched_message (notmuch_thread_t *thread,
notmuch_message_t *message) notmuch_message_t *message,
notmuch_sort_t sort)
{ {
time_t date; time_t date;
notmuch_message_t *hashed_message; notmuch_message_t *hashed_message;
@ -142,6 +143,28 @@ _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;
const char *subject;
const char *cleaned_subject;
subject = notmuch_message_get_header (message, "subject");
if ((strncasecmp (subject, "Re: ", 4) == 0) ||
(strncasecmp (subject, "Aw: ", 4) == 0) ||
(strncasecmp (subject, "Vs: ", 4) == 0) ||
(strncasecmp (subject, "Sv: ", 4) == 0)) {
cleaned_subject = talloc_strndup (thread,
subject + 4,
strlen(subject) - 4);
} else {
cleaned_subject = talloc_strdup (thread, subject);
}
if ((sort == NOTMUCH_SORT_OLDEST_FIRST && date <= thread->newest) ||
(sort != NOTMUCH_SORT_OLDEST_FIRST && date == thread->newest)) {
thread->subject = talloc_strdup (thread, cleaned_subject);
}
thread->matched_messages++; thread->matched_messages++;
if (g_hash_table_lookup_extended (thread->message_hash, if (g_hash_table_lookup_extended (thread->message_hash,
@ -209,7 +232,8 @@ notmuch_thread_t *
_notmuch_thread_create (void *ctx, _notmuch_thread_create (void *ctx,
notmuch_database_t *notmuch, notmuch_database_t *notmuch,
const char *thread_id, const char *thread_id,
const char *query_string) const char *query_string,
notmuch_sort_t sort)
{ {
notmuch_thread_t *thread; notmuch_thread_t *thread;
const char *thread_id_query_string; const char *thread_id_query_string;
@ -296,7 +320,7 @@ _notmuch_thread_create (void *ctx,
_thread_add_message (thread, message); _thread_add_message (thread, message);
if (! matched_is_subset_of_thread) if (! matched_is_subset_of_thread)
_thread_add_matched_message (thread, message); _thread_add_matched_message (thread, message, sort);
_notmuch_message_close (message); _notmuch_message_close (message);
} }
@ -323,7 +347,7 @@ _notmuch_thread_create (void *ctx,
notmuch_messages_move_to_next (messages)) notmuch_messages_move_to_next (messages))
{ {
message = notmuch_messages_get (messages); message = notmuch_messages_get (messages);
_thread_add_matched_message (thread, message); _thread_add_matched_message (thread, message, sort);
_notmuch_message_close (message); _notmuch_message_close (message);
} }