(let ((old (sort (mapcar 'car gnus-newsgroup-data) '<))
older len)
(setq older
-;;; Some nntp servers lie about their active range. When this happens, the active range can be in the millions.
-;;; (gnus-sorted-difference
-;;; (gnus-uncompress-range (list gnus-newsgroup-active))
-;;; old)
+ ;; Some nntp servers lie about their active range. When this happens, the active
+ ;; range can be in the millions.
+ ;; Use a compressed range to avoid creating a huge list.
(gnus-range-difference (list gnus-newsgroup-active) old))
(setq len (gnus-range-length older))
(cond
((null older) nil)
((numberp all)
(if (< all len)
- (let ((older-range (nreverse older)))
- (setq older nil)
-
- (while (> all 0)
- (let* ((r (pop older-range))
- (min (if (numberp r) r (car r)))
- (max (if (numberp r) r (cdr r))))
- (while (and (<= min max)
- (> all 0))
- (push max older)
- (setq all (1- all)
- max (1- max))))))
- (setq older (gnus-uncompress-range older))))
- (all nil)
+ (let ((older-range (nreverse older)))
+ (setq older nil)
+
+ (while (> all 0)
+ (let* ((r (pop older-range))
+ (min (if (numberp r) r (car r)))
+ (max (if (numberp r) r (cdr r))))
+ (while (and (<= min max)
+ (> all 0))
+ (push max older)
+ (setq all (1- all)
+ max (1- max))))))
+ (setq older (gnus-uncompress-range older))))
+ (all
+ (setq older (gnus-uncompress-range older)))
(t
- (if (and (numberp gnus-large-newsgroup)
+ (when (and (numberp gnus-large-newsgroup)
(> len gnus-large-newsgroup))
(let* ((cursor-in-echo-area nil)
(initial (gnus-parameter-large-newsgroup-initial
(unless (string-match "^[ \t]*$" input)
(setq all (string-to-number input))
(if (< all len)
- (let ((older-range (nreverse older)))
- (setq older nil)
-
- (while (> all 0)
- (let* ((r (pop older-range))
- (min (if (numberp r) r (car r)))
- (max (if (numberp r) r (cdr r))))
- (while (and (<= min max)
- (> all 0))
- (push max older)
- (setq all (1- all)
- max (1- max))))))
- (setq older (gnus-uncompress-range older))))))))
+ (let ((older-range (nreverse older)))
+ (setq older nil)
+
+ (while (> all 0)
+ (let* ((r (pop older-range))
+ (min (if (numberp r) r (car r)))
+ (max (if (numberp r) r (cdr r))))
+ (while (and (<= min max)
+ (> all 0))
+ (push max older)
+ (setq all (1- all)
+ max (1- max))))))))))
+ (setq older (gnus-uncompress-range older))))
(if (not older)
(message "No old news.")
(gnus-summary-insert-articles older)