Function: nnselect-request-update-info

nnselect-request-update-info is a byte-compiled function defined in nnselect.el.gz.

Signature

(nnselect-request-update-info GROUP INFO &optional SERVER)

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/nnselect.el.gz
(deffoo nnselect-request-update-info (group info &optional _server)
  (let* ((group (nnselect-add-prefix group))
         (gnus-newsgroup-selection
          (or gnus-newsgroup-selection (nnselect-get-artlist group)))
         newmarks)
    (when gnus-newsgroup-selection
      (gnus-info-set-marks info nil)
      (setf (gnus-info-read info) nil)
      (pcase-dolist (`(,artgroup . ,nartids)
                     (ids-by-group
                      (number-sequence 1 (nnselect-artlist-length
                                          gnus-newsgroup-selection))))
        (let* ((gnus-newsgroup-active nil)
               (idmap (make-hash-table :test 'eql))
               (gactive (sort (mapcar 'cdr nartids) #'<))
               (group-info (gnus-get-info artgroup))
               (marks (gnus-info-marks group-info)))
          (pcase-dolist (`(,val . ,key) nartids)
            (puthash key val idmap))
          (setf (gnus-info-read info)
                (range-add-list
                 (gnus-info-read info)
                 (sort (mapcar (lambda (art) (gethash art idmap))
                               (gnus-sorted-intersection
                                gactive
                                (range-uncompress (gnus-info-read group-info))))
                       #'<)))
          (pcase-dolist (`(,type . ,mark-list) marks)
            (let ((mark-type (gnus-article-mark-to-type type)) new)
              (when
                  (setq new
                        (if (not mark-list)  nil
                          (cond
                           ((eq mark-type 'tuple)
                            (delq nil
                                  (mapcar
                                   (lambda (mark)
                                     (let ((id (gethash (car mark) idmap)))
                                       (when id (cons id (cdr mark)))))
                                   mark-list)))
                           (t
                            (mapcar (lambda (art) (gethash art idmap))
                                    (gnus-sorted-intersection
                                     gactive (range-uncompress mark-list)))))))
                (let ((previous (alist-get type newmarks)))
                  (if previous
                      (nconc previous new)
                    (push (cons type new) newmarks))))))))

      ;; Clean up the marks: compress lists;
      (pcase-dolist (`(,type . ,mark-list) newmarks)
        (let ((mark-type (gnus-article-mark-to-type type)))
          (unless (eq mark-type 'tuple)
            (setf (alist-get type newmarks)
                  (gnus-compress-sequence (sort mark-list #'<))))))
      ;; and ensure an unexist key.
      (unless (assq 'unexist newmarks)
        (push (cons 'unexist nil) newmarks))

      (gnus-info-set-marks info newmarks)
      (gnus-set-active group (cons 1 (nnselect-artlist-length
                                      gnus-newsgroup-selection))))))