diff lisp/gnus/gnus-sum.el @ 108949:234c5347118d

Synch with Gnus trunk. 2010-06-10 Dan Christensen <jdc@uwo.ca> * gnus-util.el (gnus-user-date): Use gnus-date-get-time. (gnus-dd-mmm): Use gnus-date-get-time. * gnus-sum.el (gnus-thread-latest-date): Use gnus-date-get-time and simplify logic. (gnus-summary-limit-to-age): Use gnus-date-get-time. (gnus-sort-threads): emit message if gnus-sort-threads-loop used.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Thu, 10 Jun 2010 00:30:13 +0000
parents b7c1f69ad104
children fa4400531412
line wrap: on
line diff
--- a/lisp/gnus/gnus-sum.el	Wed Jun 09 22:49:43 2010 +0000
+++ b/lisp/gnus/gnus-sum.el	Thu Jun 10 00:30:13 2010 +0000
@@ -4819,7 +4819,8 @@
 	  ;; Even after binding max-lisp-eval-depth, the recursive
 	  ;; sorter might fail for very long threads.  In that case,
 	  ;; try using a (less well-tested) non-recursive sorter.
-	  (error (gnus-sort-threads-loop
+	  (error (gnus-message 9 "Sorting threads with loop...")
+		 (gnus-sort-threads-loop
 		  threads (gnus-make-sort-function
 			   gnus-thread-sort-functions))))
       (gnus-message 8 "Sorting threads...done"))))
@@ -4986,22 +4987,17 @@
   "Sort threads such that the thread with the most recently dated article comes first."
   (> (gnus-thread-latest-date h1) (gnus-thread-latest-date h2)))
 
+; Since this is called not only to sort the top-level threads, but
+; also in recursive sorts to order the articles within a thread, each
+; article will be processed many times.  Thus it speeds things up
+; quite a bit to use gnus-date-get-time, which caches the time value.
 (defun gnus-thread-latest-date (thread)
   "Return the highest article date in THREAD."
-  (let ((previous-time 0))
-    (apply 'max
-	   (mapcar
-	    (lambda (header)
-	      (setq previous-time
-		    (condition-case ()
-			(gnus-float-time (mail-header-parse-date
-					  (mail-header-date header)))
-		      (error previous-time))))
-	    (sort
-	     (message-flatten-list thread)
-	     (lambda (h1 h2)
-	       (< (mail-header-number h1)
-		  (mail-header-number h2))))))))
+  (apply 'max
+	 (mapcar (lambda (header) (gnus-float-time
+				   (gnus-date-get-time
+				    (mail-header-date header))))
+		 (message-flatten-list thread))))
 
 (defun gnus-thread-total-score-1 (root)
   ;; This function find the total score of the thread below ROOT.
@@ -8236,9 +8232,7 @@
 	  (when (and (vectorp (gnus-data-header d))
 		     (setq date (mail-header-date (gnus-data-header d))))
 	    (setq is-younger (time-less-p
-			      (time-since (condition-case ()
-					      (date-to-time date)
-					    (error '(0 0))))
+			      (time-since (gnus-date-get-time date))
 			      cutoff))
 	    (when (if younger-p
 		      is-younger