emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] master 4dfaa46 3/3: Fix creation of nngnorb/nnir groups


From: Eric Abrahamsen
Subject: [elpa] master 4dfaa46 3/3: Fix creation of nngnorb/nnir groups
Date: Tue, 14 Mar 2017 17:50:50 -0400 (EDT)

branch: master
commit 4dfaa46497aac97abfbdefcc3429c7951afbc917
Author: Eric Abrahamsen <address@hidden>
Commit: Eric Abrahamsen <address@hidden>

    Fix creation of nngnorb/nnir groups
    
    * packages/gnorb/gnorb-gnus.el (gnorb-gnus-search-messages): We were
      locating the nngnorb server incorrectly, and also feeding it to nnir
      incorrectly. This was preventing persistent groups from working
      correctly.
    * packages/gnorb/nngnorb.el (nnir-run-gnorb): Streamline the searching
      process. This should eliminate some redundancy, hopefully going a
      bit faster.
    * packages/gnorb/gnorb-utils.el (gnorb-msg-id-to-group): Do not cache
      article numbers in the registry -- numbers are not consistent across
      Gnus installations. This may slow down searches somewhat,
      unfortunately, but nnir's own caching mechanisms should help.
---
 packages/gnorb/gnorb-gnus.el  | 48 ++++++++++---------------
 packages/gnorb/gnorb-utils.el | 15 ++++----
 packages/gnorb/nngnorb.el     | 82 ++++++++++++++++++++-----------------------
 3 files changed, 65 insertions(+), 80 deletions(-)

diff --git a/packages/gnorb/gnorb-gnus.el b/packages/gnorb/gnorb-gnus.el
index dd46351..e500bd4 100644
--- a/packages/gnorb/gnorb-gnus.el
+++ b/packages/gnorb/gnorb-gnus.el
@@ -669,40 +669,30 @@ server. There must be an active \"nngnorb\" server for 
this to
 work."
   (interactive)
   (require 'nnir)
-  (let ((nnir-address
-        (or (gnus-method-to-server '(nngnorb))
-            (user-error
-             "Please add a \"nngnorb\" backend to your gnus installation.")))
-       name method spec)
-    (when (version= "5.13" gnus-version-number)
-      (with-no-warnings                  ; All these variables are available.
-       (setq nnir-current-query nil
-             nnir-current-server nil
-             nnir-current-group-marked nil
-             nnir-artlist nil)))
-    ;; In 24.4, the group name is mostly decorative, but in 24.3, the
-    ;; actual query is held there.
-    (setq name (if (version= "5.13" gnus-version-number)
-                  (concat "nnir:" (prin1-to-string `((query ,str))))
-                (if persist
-                    (read-string
-                     (format "Name for group (default %s): " head-text)
-                     nil head-text t)
-                  (concat "gnorb-" str))))
-    (setq method (if (version= "5.13" gnus-version-number)
-                    (list 'nnir nnir-address)
-                  (list 'nnir "Gnorb")))
-    (setq spec
-         (list
-          (cons 'nnir-specs (list (cons 'nnir-query-spec `((query . ,str)))
-                                  (cons 'nnir-group-spec `((,nnir-address 
nil)))))
-          (cons 'nnir-artlist nil)))
+  (let* ((nnir-address
+         (or (catch 'found
+               (dolist (s gnus-server-method-cache)
+                 (when (eq 'nngnorb (cadr s))
+                   (throw 'found (car s)))))
+             (user-error
+              "Please add a \"nngnorb\" backend to your gnus installation.")))
+        (name (if persist
+                  (read-string
+                   (format "Name for group (default %s): " head-text)
+                   nil nil head-text)
+                (concat "gnorb-" str)))
+        (method (list 'nnir nnir-address))
+        (spec (list
+               (cons 'nnir-specs (list (cons 'nnir-query-spec `((query . 
,str)))
+                                       (cons 'nnir-group-spec `((,nnir-address 
,(list name))))))
+               (cons 'nnir-artlist nil)))
+        nnir-current-query nnir-current-server nnir-current-group-marked 
nnir-artlist)
     (if persist
        (progn
          (switch-to-buffer gnus-group-buffer)
          (gnus-group-make-group name method nil spec)
          (gnus-group-select-group))
-     (gnus-group-read-ephemeral-group name method nil ret nil nil spec))))
+      (gnus-group-read-ephemeral-group name method nil ret nil nil spec))))
 
 (defun gnorb-gnus-summary-mode-hook ()
   "Check if we've entered a Gnorb-generated group, and activate
diff --git a/packages/gnorb/gnorb-utils.el b/packages/gnorb/gnorb-utils.el
index 14fb981..60e57b4 100644
--- a/packages/gnorb/gnorb-utils.el
+++ b/packages/gnorb/gnorb-utils.el
@@ -507,14 +507,13 @@ methods?"
                       (not
                        (string-match-p
                         "\\(nnir\\|nnvirtual\\|UNKNOWN\\)"
-                        server-group)))
-             (setq check
-                   (ignore-errors
-                     (gnus-request-head msg-id server-group)))
-             (when check
-               (gnus-registry-set-id-key msg-id 'group (list server-group))
-               (gnus-registry-set-id-key msg-id 'artno (list (cdr check)))
-               (throw 'found (car check)))))))
+                        server-group))
+                      (setq check
+                            (ignore-errors
+                              (gnus-request-head msg-id server-group))))
+
+             (gnus-registry-set-id-key msg-id 'group (list server-group))
+             (throw 'found (car check))))))
       nil)))
 
 (defun gnorb-collect-ids (&optional id)
diff --git a/packages/gnorb/nngnorb.el b/packages/gnorb/nngnorb.el
index 4d17c9b..172dbab 100644
--- a/packages/gnorb/nngnorb.el
+++ b/packages/gnorb/nngnorb.el
@@ -75,14 +75,10 @@ are displayed in an ephemeral group.
 Otherwise, the query string can be a tags match string, a la the
 Org agenda tags search. All headings matched by this string will
 be scanned for gnus messages, and those messages displayed."
-  ;; During the transition period between using message-ids stored in
-  ;; a property, and the new registry-based system, we're going to use
-  ;; both methods to collect relevant messages. This could be a little
-  ;; slower, but for the time being it will be safer.
   (save-window-excursion
     (let ((q (cdr (assq 'query query)))
          (buf (get-buffer-create nnir-tmp-buffer))
-         msg-ids org-ids links vectors)
+         msg-ids org-ids links messages vectors)
       (with-current-buffer buf
        (erase-buffer)
        (setq nngnorb-attachment-file-list nil))
@@ -130,47 +126,47 @@ be scanned for gnus messages, and those messages 
displayed."
                'agenda)))
       (with-current-buffer buf
        (goto-char (point-min))
-       (setq links (plist-get (gnorb-scan-links (point-max) 'gnus)
-                              :gnus))
-       (goto-char (point-min))
-       (while (re-search-forward
-               (concat ":" gnorb-org-msg-id-key ": \\([^\n]+\\)")
-               (point-max) t)
-         (setq msg-ids (append (split-string (match-string 1)) msg-ids))))
-      ;; Here's where we maybe do some duplicate work using the
-      ;; registry. Take our org ids and find all relevant message ids.
-      (dolist (i (delq nil org-ids))
-       (let ((rel-msg-id (gnorb-registry-org-id-search i)))
-         (when rel-msg-id
-           (setq msg-ids (append (delq nil rel-msg-id) msg-ids)))))
+       (setq links (append (plist-get (gnorb-scan-links (point-max) 'gnus)
+                                      :gnus)
+                           links))
+
+       (goto-char (point-min)))
+      ;; First add all links to messages (elements of messages should
+      ;; look like (group-name message-id)).
+      (dolist (l links)
+       (push (list (car (split-string link "#"))
+                   (org-link-unescape
+                    (nth 1 (split-string link "#"))))
+             messages))
+
+      ;; Then use the registry to turn list of org-ids into list of
+      ;; msg-ids.
+      (dolist (i (delq nil (delete-dups org-ids)))
+       (when-let ((rel-msg-id (gnorb-registry-org-id-search i)))
+         (setq msg-ids (append (delq nil rel-msg-id) msg-ids))))
+
+      ;; Then find the group for each msg-id, and add the results to
+      ;; messages.
       (when msg-ids
-       (dolist (id msg-ids)
-         (let ((link (gnorb-msg-id-to-link id)))
-           (when link
-             (push link links)))))
-      (setq links (sort (delete-dups links) 'string<))
+       (dolist (id (delete-dups msg-ids))
+         (when-let ((group (gnorb-msg-id-to-group id)))
+           (push (list group id) messages))))
+
+      (setq messages (sort messages (lambda (l r)
+                                     (string< (car l) (car r)))))
+
       (unless (gnus-alive-p)
        (gnus))
-      (dolist (m links (when vectors
-                        (reverse vectors)))
-       (let (server-group msg-id artno check)
-         (setq m (org-link-unescape m))
-         (when (string-match "\\`\\([^#]+\\)\\(#\\(.*\\)\\)?" m)
-           (setq server-group (match-string 1 m)
-                 msg-id (gnorb-bracket-message-id
-                         (match-string 3 m))
-                 artno (or (car (gnus-registry-get-id-key msg-id 'artno))
-                           (when (setq check
-                                       (cdr (ignore-errors
-                                              (gnus-request-head
-                                               msg-id server-group))))
-                             (gnus-registry-set-id-key
-                              msg-id 'artno
-                              (list check))
-                             check)))
-           (when artno
-             (when (and (integerp artno) (> artno 0))
-               (push (vector server-group artno 100) vectors)))))))))
+
+      (dolist (m messages (when vectors
+                           (reverse vectors)))
+       (let ((artno
+              (cdr-safe (ignore-errors
+                          (gnus-request-head
+                           (nth 1 m) (car m))))))
+
+         (when (and artno (integerp artno) (> artno 0))
+           (push (vector (car m) artno 100) vectors)))))))
 
 (defvar gnorb-summary-minor-mode-map (make-sparse-keymap)
   "Keymap for use in Gnorb's *Summary* minor mode.")



reply via email to

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