[notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-23 Thread Jesse Rosenthal
On Tue, 23 Mar 2010 13:31:09 -0400, James Vasile  
wrote:
> Just out of curiosity, what are Aw, Sv and Vs used for?  Are they just
> "re" in different languages?

Yep -- these were the only common ones I came across. If anyone knows of
any others in common use, I can add 'em in. 


[notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-23 Thread James Vasile
On Mon, 22 Mar 2010 23:09:15 -0400, Jesse Rosenthal  
wrote:
> Reply prefixes ("Re: ", "Aw: ", "Sv: ", "Vs: ") are ignored

Just out of curiosity, what are Aw, Sv and Vs used for?  Are they just
"re" in different languages?

Thanks.


[notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-23 Thread Jesse Rosenthal

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 matches for the query, and 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.
---
 lib/notmuch-private.h |3 ++-
 lib/query.cc  |3 ++-
 lib/thread.cc |   30 +++---
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index d52d84d..94cce1b 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -205,7 +205,8 @@ notmuch_thread_t *
 _notmuch_thread_create (void *ctx,
notmuch_database_t *notmuch,
const char *thread_id,
-   const char *query_string);
+   const char *query_string,
+   notmuch_sort_t sort);

 /* message.cc */

diff --git a/lib/query.cc b/lib/query.cc
index 9266d35..946f367 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -297,7 +297,8 @@ notmuch_threads_get (notmuch_threads_t *threads)
 return _notmuch_thread_create (threads->query,
   threads->query->notmuch,
   threads->thread_id,
-  threads->query->query_string);
+  threads->query->query_string,
+  threads->query->sort);
 }

 void
diff --git a/lib/thread.cc b/lib/thread.cc
index ec80f85..9ba7b70 100644
--- a/lib/thread.cc
+++ b/lib/thread.cc
@@ -129,7 +129,8 @@ _thread_add_message (notmuch_thread_t *thread,

 static void
 _thread_add_matched_message (notmuch_thread_t *thread,
-notmuch_message_t *message)
+notmuch_message_t *message,
+notmuch_sort_t sort)
 {
 time_t date;
 notmuch_message_t *hashed_message;
@@ -142,6 +143,28 @@ _thread_add_matched_message (notmuch_thread_t *thread,
 if (date > thread->newest || ! thread->matched_messages)
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++;

 if (g_hash_table_lookup_extended (thread->message_hash,
@@ -209,7 +232,8 @@ notmuch_thread_t *
 _notmuch_thread_create (void *ctx,
notmuch_database_t *notmuch,
const char *thread_id,
-   const char *query_string)
+   const char *query_string,
+   notmuch_sort_t sort)
 {
 notmuch_thread_t *thread;
 const char *thread_id_query_string, *matched_query_string;
@@ -284,7 +308,7 @@ _notmuch_thread_create (void *ctx,
 notmuch_messages_move_to_next (messages))
 {
message = notmuch_messages_get (messages);
-   _thread_add_matched_message (thread, message);
+   _thread_add_matched_message (thread, message, sort);
_notmuch_message_close (message);
 }

-- 
1.6.3.3



Re: [notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-23 Thread James Vasile
On Mon, 22 Mar 2010 23:09:15 -0400, Jesse Rosenthal jrosent...@jhu.edu wrote:
 Reply prefixes (Re: , Aw: , Sv: , Vs: ) are ignored

Just out of curiosity, what are Aw, Sv and Vs used for?  Are they just
re in different languages?

Thanks.
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


Re: [notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-23 Thread Sandra Snan
On Tue, 23 Mar 2010 13:31:09 -0400, James Vasile ja...@hackervisions.org 
wrote:
 Just out of curiosity, what are Aw, Sv and Vs used for?  Are they just
 re in different languages?

That’s right. http://en.wikipedia.org/wiki/List_of_e-mail_subject_abbreviations

Sandra
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


Re: [notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-23 Thread Jesse Rosenthal
On Tue, 23 Mar 2010 13:31:09 -0400, James Vasile ja...@hackervisions.org 
wrote:
 Just out of curiosity, what are Aw, Sv and Vs used for?  Are they just
 re in different languages?

Yep -- these were the only common ones I came across. If anyone knows of
any others in common use, I can add 'em in. 
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[notmuch] [PATCH] Name thread based on matching msgs instead of first msg.

2010-03-22 Thread Jesse Rosenthal

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 matches for the query, and 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.
---
 lib/notmuch-private.h |3 ++-
 lib/query.cc  |3 ++-
 lib/thread.cc |   30 +++---
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index d52d84d..94cce1b 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -205,7 +205,8 @@ notmuch_thread_t *
 _notmuch_thread_create (void *ctx,
notmuch_database_t *notmuch,
const char *thread_id,
-   const char *query_string);
+   const char *query_string,
+   notmuch_sort_t sort);
 
 /* message.cc */
 
diff --git a/lib/query.cc b/lib/query.cc
index 9266d35..946f367 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -297,7 +297,8 @@ notmuch_threads_get (notmuch_threads_t *threads)
 return _notmuch_thread_create (threads-query,
   threads-query-notmuch,
   threads-thread_id,
-  threads-query-query_string);
+  threads-query-query_string,
+  threads-query-sort);
 }
 
 void
diff --git a/lib/thread.cc b/lib/thread.cc
index ec80f85..9ba7b70 100644
--- a/lib/thread.cc
+++ b/lib/thread.cc
@@ -129,7 +129,8 @@ _thread_add_message (notmuch_thread_t *thread,
 
 static void
 _thread_add_matched_message (notmuch_thread_t *thread,
-notmuch_message_t *message)
+notmuch_message_t *message,
+notmuch_sort_t sort)
 {
 time_t date;
 notmuch_message_t *hashed_message;
@@ -142,6 +143,28 @@ _thread_add_matched_message (notmuch_thread_t *thread,
 if (date  thread-newest || ! thread-matched_messages)
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++;
 
 if (g_hash_table_lookup_extended (thread-message_hash,
@@ -209,7 +232,8 @@ notmuch_thread_t *
 _notmuch_thread_create (void *ctx,
notmuch_database_t *notmuch,
const char *thread_id,
-   const char *query_string)
+   const char *query_string,
+   notmuch_sort_t sort)
 {
 notmuch_thread_t *thread;
 const char *thread_id_query_string, *matched_query_string;
@@ -284,7 +308,7 @@ _notmuch_thread_create (void *ctx,
 notmuch_messages_move_to_next (messages))
 {
message = notmuch_messages_get (messages);
-   _thread_add_matched_message (thread, message);
+   _thread_add_matched_message (thread, message, sort);
_notmuch_message_close (message);
 }
 
-- 
1.6.3.3

___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch