emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 808817d: Be more graceful about handling Gnus search errors


From: Eric Abrahamsen
Subject: master 808817d: Be more graceful about handling Gnus search errors
Date: Thu, 10 Dec 2020 20:58:17 -0500 (EST)

branch: master
commit 808817d76f0c1e1d7f9d9f60f1f6f72773d71d5f
Author: Eric Abrahamsen <eric@ericabrahamsen.net>
Commit: Eric Abrahamsen <eric@ericabrahamsen.net>

    Be more graceful about handling Gnus search errors
    
    One search may be applied to several servers: don't let one server's
    error derail the whole process.
    
    * lisp/gnus/gnus-search.el (gnus-search-config-error): Define new
    error.
    (gnus-search-run-search, gnus-search-server-to-engine): Raise this
    specific error as appropriate.
    (gnus-search-run-query): Catch this error and effectively demote it.
---
 lisp/gnus/gnus-search.el | 41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
index 89d8cff..0e67fac 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -105,6 +105,8 @@
 
 (define-error 'gnus-search-parse-error "Gnus search parsing error")
 
+(define-error 'gnus-search-config-error "Gnus search configuration error")
+
 ;;; User Customizable Variables:
 
 (defgroup gnus-search nil
@@ -1852,8 +1854,10 @@ Assume \"size\" key is equal to \"larger\"."
         (grouplist (or groups (gnus-search-get-active server)))
         (buffer (slot-value engine 'proc-buffer)))
     (unless directory
-      (error "No directory found in method specification of server %s"
-            server))
+      (signal 'gnus-search-config-error
+             (list (format-message
+                    "No directory found in definition of server %s"
+                    server))))
     (apply
      'vconcat
      (mapcar (lambda (x)
@@ -1885,7 +1889,9 @@ Assume \"size\" key is equal to \"larger\"."
                                            group nil t)))
                                    group))))))
                     (unless group
-                      (error "Cannot locate directory for group"))
+                      (signal 'gnus-search-config-error
+                              (list
+                               "Cannot locate directory for group")))
                     (save-excursion
                       (apply
                        'call-process "find" nil t
@@ -1934,12 +1940,19 @@ Assume \"size\" key is equal to \"larger\"."
         (limit (alist-get 'limit prepared-query)))
     (mapc
      (pcase-lambda (`(,server . ,groups))
-       (let ((search-engine (gnus-search-server-to-engine server)))
-        (setq results
-              (vconcat
-               (gnus-search-run-search
-                search-engine server prepared-query groups)
-               results))))
+       (condition-case err
+          (let ((search-engine (gnus-search-server-to-engine server)))
+            (setq results
+                  (vconcat
+                   (gnus-search-run-search
+                    search-engine server prepared-query groups)
+                   results)))
+        (gnus-search-config-error
+         (if (< 1 (length (alist-get 'search-group-spec specs)))
+             (apply #'nnheader-message 4
+                    "Search engine for %s improperly configured: %s"
+                    server (cdr err))
+           (signal 'gnus-search-config-error err)))))
      (alist-get 'search-group-spec specs))
     ;; Some search engines do their own limiting, but some don't, so
     ;; do it again here.  This is bad because, if the user is
@@ -1949,7 +1962,7 @@ Assume \"size\" key is equal to \"larger\"."
     ;; from a later group entirely.
     (if limit
        (seq-subseq results 0 (min limit (length results)))
-     results)))
+      results)))
 
 (defun gnus-search-prepare-query (query-spec)
   "Accept a search query in raw format, and prepare it.
@@ -2023,11 +2036,13 @@ remaining string, then adds all that to the top-level 
spec."
              (condition-case nil
                  (setf (slot-value inst key) value)
                ((invalid-slot-name invalid-slot-type)
-                (nnheader-message
-                 5 "Invalid search engine parameter: (%s %s)"
+                (nnheader-report 'search
+                 "Invalid search engine parameter: (%s %s)"
                  key value)))))
          (push (cons srv inst) gnus-search-engine-instance-alist))
-      (error "No search engine defined for %s" srv))
+      (signal 'gnus-search-config-error
+             (list (format-message
+                    "No search engine configured for %s" srv))))
     inst))
 
 (declare-function gnus-registry-get-id-key "gnus-registry" (id key))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]