changeset 110520:ec3a9ffbd128

appt.el fixes for bug#7019. * lisp/calendar/appt.el (appt-check): If not displaying the diary, use (diary 1) to only get the entries we need. (appt-make-list): Sort diary-list-entries, if we cannot guarantee that it is in day order. (Bug#7019)
author Glenn Morris <rgm@gnu.org>
date Tue, 14 Sep 2010 19:55:44 -0700
parents d649dba1ba8d
children 1cdff3b101d6
files lisp/ChangeLog lisp/calendar/appt.el
diffstat 2 files changed, 52 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Tue Sep 14 19:46:00 2010 -0700
+++ b/lisp/ChangeLog	Tue Sep 14 19:55:44 2010 -0700
@@ -1,5 +1,10 @@
 2010-09-15  Glenn Morris  <rgm@gnu.org>
 
+	* calendar/appt.el (appt-check): If not displaying the diary,
+	use (diary 1) to only get the entries we need.
+	(appt-make-list): Sort diary-list-entries, if we cannot guarantee
+	that it is in day order.  (Bug#7019)
+
 	* calendar/appt.el (appt-check): Rather than showing the diary,
 	just turn off invisible display, and only if needed.
 
--- a/lisp/calendar/appt.el	Tue Sep 14 19:46:00 2010 -0700
+++ b/lisp/calendar/appt.el	Tue Sep 14 19:55:44 2010 -0700
@@ -333,40 +333,42 @@
         (if (or force                      ; eg initialize, diary save
                 (null appt-prev-comp-time) ; first check
                 (< cur-comp-time appt-prev-comp-time)) ; new day
-            (condition-case nil
-                (if appt-display-diary
-                    (let ((diary-hook
-                           (if (assoc 'appt-make-list diary-hook)
-                               diary-hook
-                             (cons 'appt-make-list diary-hook))))
-                      (diary))
-                  (let* ((diary-display-function 'appt-make-list)
-                         (d-buff (find-buffer-visiting diary-file))
-                         (selective
-                          (if d-buff    ; diary buffer exists
-                              (with-current-buffer d-buff
-                                diary-selective-display)))
-                         d-buff2)
-                    ;; FIXME why not using diary-list-entries with
-                    ;; non-nil LIST-ONLY?
-                    (diary)
-                    ;; If the diary buffer existed before this command,
-                    ;; restore its display state.  Otherwise, kill it.
-                    (and (setq d-buff2 (find-buffer-visiting diary-file))
-                         (if d-buff
-                             (or selective
-                                 (with-current-buffer d-buff2
-                                   (if diary-selective-display
-                                       ;; diary-show-all-entries displays
-                                       ;; the diary buffer.
-                                       (diary-unhide-everything))))
-                           ;; FIXME does not kill any included diary files.
-                           ;; The real issue is that (diary) should not
-                           ;; have the side effect of visiting all the
-                           ;; diary files.  It is not really appt.el's job to
-                           ;; clean up this mess...
-                           (kill-buffer d-buff2)))))
-              (error nil)))
+            (ignore-errors
+              (if appt-display-diary
+                  (let ((diary-hook
+                         (if (assoc 'appt-make-list diary-hook)
+                             diary-hook
+                           (cons 'appt-make-list diary-hook))))
+                    (diary))
+                (let* ((diary-display-function 'appt-make-list)
+                       (d-buff (find-buffer-visiting diary-file))
+                       (selective
+                        (if d-buff    ; diary buffer exists
+                            (with-current-buffer d-buff
+                              diary-selective-display)))
+                       d-buff2)
+                  ;; Not displaying the diary, so we can ignore
+                  ;; diary-number-of-entries.  Since appt.el only
+                  ;; works on a daily basis, no need for more entries.
+                  ;; FIXME why not using diary-list-entries with
+                  ;; non-nil LIST-ONLY?
+                  (diary 1)
+                  ;; If the diary buffer existed before this command,
+                  ;; restore its display state.  Otherwise, kill it.
+                  (and (setq d-buff2 (find-buffer-visiting diary-file))
+                       (if d-buff
+                           (or selective
+                               (with-current-buffer d-buff2
+                                 (if diary-selective-display
+                                     ;; diary-show-all-entries displays
+                                     ;; the diary buffer.
+                                     (diary-unhide-everything))))
+                         ;; FIXME does not kill any included diary files.
+                         ;; The real issue is that (diary) should not
+                         ;; have the side effect of visiting all the
+                         ;; diary files.  It is not really appt.el's job to
+                         ;; clean up this mess...
+                         (kill-buffer d-buff2)))))))
         (setq appt-prev-comp-time cur-comp-time
               appt-mode-string nil
               appt-display-count nil)
@@ -582,6 +584,17 @@
               (let ((entry-list diary-entries-list)
                     (new-time-string "")
                     time-string)
+                ;; Below, we assume diary-entries-list was in date
+                ;; order.  It is, unless something on
+                ;; diary-list-entries-hook has changed it, eg
+                ;; diary-include-other-files (bug#7019).  It must be
+                ;; in date order if number = 1.
+                (and diary-list-entries-hook
+                     appt-display-diary
+                     (not (eq diary-number-of-entries 1))
+                     (not (memq (car (last diary-list-entries-hook))
+                                '(diary-sort-entries sort-diary-entries)))
+                     (setq entry-list (sort entry-list 'diary-entry-compare)))
                 ;; Skip diary entries for dates before today.
                 (while (and entry-list
                             (calendar-date-compare