* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program. If not, see http://www.gnu.org/licenses/ .
+ * along with this program. If not, see https://www.gnu.org/licenses/ .
*
* Author: Carl Worth <cworth@cworth.org>
*/
#include <gmime/gmime.h>
#include <glib.h> /* GHashTable */
-struct visible _notmuch_thread {
+#define EMPTY_STRING(s) ((s)[0] == '\0')
+
+struct _notmuch_thread {
notmuch_database_t *notmuch;
char *thread_id;
char *subject;
GHashTable *message_hash;
int total_messages;
+ int total_files;
int matched_messages;
time_t oldest;
time_t newest;
g_hash_table_unref (thread->message_hash);
if (thread->authors_array) {
- g_ptr_array_free (thread->authors_array, TRUE);
+ g_ptr_array_free (thread->authors_array, true);
thread->authors_array = NULL;
}
if (thread->matched_authors_array) {
- g_ptr_array_free (thread->matched_authors_array, TRUE);
+ g_ptr_array_free (thread->matched_authors_array, true);
thread->matched_authors_array = NULL;
}
first_non_matched_author = 0;
}
- g_ptr_array_free (thread->authors_array, TRUE);
+ g_ptr_array_free (thread->authors_array, true);
thread->authors_array = NULL;
- g_ptr_array_free (thread->matched_authors_array, TRUE);
+ g_ptr_array_free (thread->matched_authors_array, true);
thread->matched_authors_array = NULL;
+
+ if (!thread->authors)
+ thread->authors = talloc_strdup(thread, "");
}
/* clean up the ugly "Lastname, Firstname" format that some mail systems
InternetAddress *address;
const char *from, *author;
char *clean_author;
- notmuch_bool_t message_excluded = FALSE;
+ bool message_excluded = false;
if (omit_exclude != NOTMUCH_EXCLUDE_FALSE) {
for (tags = notmuch_message_get_tags (message);
term != NULL;
term = term->next)
{
- /* We ignore initial 'K'. */
- if (strcmp(tag, (term->string + 1)) == 0) {
- message_excluded = TRUE;
+ /* Check for an empty string, and then ignore initial 'K'. */
+ if (*(term->string) && strcmp(tag, (term->string + 1)) == 0) {
+ message_excluded = true;
break;
}
}
_notmuch_message_list_add_message (thread->message_list,
talloc_steal (thread, message));
thread->total_messages++;
+ thread->total_files += notmuch_message_count_files (message);
g_hash_table_insert (thread->message_hash,
xstrdup (notmuch_message_get_message_id (message)),
address = internet_address_list_get_address (list, 0);
if (address) {
author = internet_address_get_name (address);
- if (author == NULL) {
+ /* We treat quoted empty names as if they were empty. */
+ if (author == NULL || author[0] == '\0') {
InternetAddressMailbox *mailbox;
mailbox = INTERNET_ADDRESS_MAILBOX (address);
author = internet_address_mailbox_get_addr (mailbox);
/* Mark excluded messages. */
if (message_excluded)
- notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED, TRUE);
+ notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED, true);
}
static void
cleaned_subject = talloc_strdup (thread, subject);
}
- if (thread->subject)
- talloc_free (thread->subject);
+ if (! EMPTY_STRING(cleaned_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
if (date > thread->newest || ! thread->matched_messages) {
thread->newest = date;
- if (sort != NOTMUCH_SORT_OLDEST_FIRST)
+ const char *cur_subject = notmuch_thread_get_subject(thread);
+ if (sort != NOTMUCH_SORT_OLDEST_FIRST || EMPTY_STRING(cur_subject))
_thread_set_subject_from_message (thread, message);
}
notmuch_messages_t *messages;
notmuch_message_t *message;
+ notmuch_status_t status;
seed_message = _notmuch_message_create (local, notmuch, seed_doc_id, NULL);
if (! seed_message)
free, NULL);
thread->total_messages = 0;
+ thread->total_files = 0;
thread->matched_messages = 0;
thread->oldest = 0;
thread->newest = 0;
* oldest or newest subject is desired. */
notmuch_query_set_sort (thread_id_query, NOTMUCH_SORT_OLDEST_FIRST);
- for (messages = notmuch_query_search_messages (thread_id_query);
+ status = notmuch_query_search_messages (thread_id_query, &messages);
+ if (status)
+ goto DONE;
+
+ for (;
notmuch_messages_valid (messages);
notmuch_messages_move_to_next (messages))
{
return thread->total_messages;
}
+int
+notmuch_thread_get_total_files (notmuch_thread_t *thread)
+{
+ return thread->total_files;
+}
+
int
notmuch_thread_get_matched_messages (notmuch_thread_t *thread)
{