From 11abff8e05954174244715859f788753aea77859 Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Tue, 21 Aug 2007 04:52:22 +0000 Subject: [PATCH] Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 245) - Update from CVS 2007-08-17 Katsumi Yamaoka * lisp/gnus/gnus-art.el (gnus-article-summary-command-nosave) (gnus-article-read-summary-keys): Don't use 3rd arg of pop-to-buffer. 2007-08-14 Katsumi Yamaoka * lisp/gnus/gnus.el (gnus-maximum-newsgroup): New variable. * lisp/gnus/gnus-agent.el (gnus-agent-fetch-headers): Limit the range of articles according to gnus-maximum-newsgroup. * lisp/gnus/gnus-sum.el (gnus-articles-to-read, gnus-list-of-unread-articles) (gnus-list-of-read-articles, gnus-sequence-of-unread-articles): Limit the range of articles according to gnus-maximum-newsgroup. 2007-08-14 Katsumi Yamaoka * man/gnus.texi (Selecting a Group): Mention gnus-maximum-newsgroup. Revision: emacs@sv.gnu.org/emacs--rel--22--patch-96 --- lisp/gnus/ChangeLog | 16 ++++++++++++++++ lisp/gnus/gnus-agent.el | 9 ++++++++- lisp/gnus/gnus-art.el | 11 ++++------- lisp/gnus/gnus-sum.el | 37 +++++++++++++++++++++++++++---------- lisp/gnus/gnus.el | 11 +++++++++++ man/ChangeLog | 4 ++++ man/gnus.texi | 18 ++++++++++++++++++ 7 files changed, 88 insertions(+), 18 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 7fd187a4aeb..201b7fefdcb 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,19 @@ +2007-08-17 Katsumi Yamaoka + + * gnus-art.el (gnus-article-summary-command-nosave) + (gnus-article-read-summary-keys): Don't use 3rd arg of pop-to-buffer. + +2007-08-14 Katsumi Yamaoka + + * gnus.el (gnus-maximum-newsgroup): New variable. + + * gnus-agent.el (gnus-agent-fetch-headers): Limit the range of articles + according to gnus-maximum-newsgroup. + + * gnus-sum.el (gnus-articles-to-read, gnus-list-of-unread-articles) + (gnus-list-of-read-articles, gnus-sequence-of-unread-articles): Limit + the range of articles according to gnus-maximum-newsgroup. + 2007-08-10 Katsumi Yamaoka * nntp.el (nntp-xref-number-is-evil): New server variable. diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el index 7b98b1e045a..347b57983e6 100644 --- a/lisp/gnus/gnus-agent.el +++ b/lisp/gnus/gnus-agent.el @@ -1765,7 +1765,14 @@ article numbers will be returned." (gnus-agent-find-parameter group 'agent-predicate))))) (articles (if fetch-all - (gnus-uncompress-range (gnus-active group)) + (if gnus-maximum-newsgroup + (let ((active (gnus-active group))) + (gnus-uncompress-range + (cons (max (car active) + (- (cdr active) + gnus-maximum-newsgroup -1)) + (cdr active)))) + (gnus-uncompress-range (gnus-active group))) (gnus-list-of-unread-articles group))) (gnus-decode-encoded-word-function 'identity) (gnus-decode-encoded-address-function 'identity) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 6ccba3b108f..696222e0043 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -5607,7 +5607,7 @@ not have a face in `gnus-article-boring-faces'." "Execute the last keystroke in the summary buffer." (interactive) (let (func) - (pop-to-buffer gnus-article-current-summary nil (not (featurep 'xemacs))) + (pop-to-buffer gnus-article-current-summary) (setq func (lookup-key (current-local-map) (this-command-keys))) (call-interactively func))) @@ -5646,8 +5646,7 @@ not have a face in `gnus-article-boring-faces'." (member keys nosave-in-article)) (let (func) (save-window-excursion - (pop-to-buffer gnus-article-current-summary - nil (not (featurep 'xemacs))) + (pop-to-buffer gnus-article-current-summary) ;; We disable the pick minor mode commands. (let (gnus-pick-mode) (setq func (lookup-key (current-local-map) keys)))) @@ -5659,16 +5658,14 @@ not have a face in `gnus-article-boring-faces'." (call-interactively func) (setq new-sum-point (point))) (when (member keys nosave-but-article) - (pop-to-buffer gnus-article-buffer - nil (not (featurep 'xemacs))))) + (pop-to-buffer gnus-article-buffer))) ;; These commands should restore window configuration. (let ((obuf (current-buffer)) (owin (current-window-configuration)) (opoint (point)) win func in-buffer selected new-sum-start new-sum-hscroll) (cond (not-restore-window - (pop-to-buffer gnus-article-current-summary - nil (not (featurep 'xemacs)))) + (pop-to-buffer gnus-article-current-summary)) ((setq win (get-buffer-window gnus-article-current-summary)) (select-window win)) (t diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 708689fef9e..851ec88c96f 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -5472,7 +5472,13 @@ If SELECT-ARTICLES, only select those articles from GROUP." ;; articles in the group, or (if that's nil), the ;; articles in the cache. (or - (gnus-uncompress-range (gnus-active group)) + (if gnus-maximum-newsgroup + (let ((active (gnus-active group))) + (gnus-uncompress-range + (cons (max (car active) + (- (cdr active) gnus-maximum-newsgroup -1)) + (cdr active)))) + (gnus-uncompress-range (gnus-active group))) (gnus-cache-articles-in-group group)) ;; Select only the "normal" subset of articles. (gnus-sorted-nunion @@ -6534,23 +6540,26 @@ displayed, no centering will be performed." (let* ((read (gnus-info-read (gnus-get-info group))) (active (or (gnus-active group) (gnus-activate-group group))) (last (cdr active)) + (bottom (if gnus-maximum-newsgroup + (max (car active) (- last gnus-maximum-newsgroup -1)) + (car active))) first nlast unread) ;; If none are read, then all are unread. (if (not read) - (setq first (car active)) + (setq first bottom) ;; If the range of read articles is a single range, then the ;; first unread article is the article after the last read ;; article. Sounds logical, doesn't it? (if (and (not (listp (cdr read))) - (or (< (car read) (car active)) + (or (< (car read) bottom) (progn (setq read (list read)) nil))) - (setq first (max (car active) (1+ (cdr read)))) + (setq first (max bottom (1+ (cdr read)))) ;; `read' is a list of ranges. (when (/= (setq nlast (or (and (numberp (car read)) (car read)) (caar read))) 1) - (setq first (car active))) + (setq first bottom)) (while read (when first (while (< first nlast) @@ -6575,7 +6584,12 @@ displayed, no centering will be performed." (gnus-list-range-difference (gnus-list-range-difference (gnus-sorted-complement - (gnus-uncompress-range active) + (gnus-uncompress-range + (if gnus-maximum-newsgroup + (cons (max (car active) + (- (cdr active) gnus-maximum-newsgroup -1)) + (cdr active)) + active)) (gnus-list-of-unread-articles group)) (cdr (assq 'dormant marked))) (cdr (assq 'tick marked)))))) @@ -6587,23 +6601,26 @@ displayed, no centering will be performed." (let* ((read (gnus-info-read (gnus-get-info group))) (active (or (gnus-active group) (gnus-activate-group group))) (last (cdr active)) + (bottom (if gnus-maximum-newsgroup + (max (car active) (- last gnus-maximum-newsgroup -1)) + (car active))) first nlast unread) ;; If none are read, then all are unread. (if (not read) - (setq first (car active)) + (setq first bottom) ;; If the range of read articles is a single range, then the ;; first unread article is the article after the last read ;; article. Sounds logical, doesn't it? (if (and (not (listp (cdr read))) - (or (< (car read) (car active)) + (or (< (car read) bottom) (progn (setq read (list read)) nil))) - (setq first (max (car active) (1+ (cdr read)))) + (setq first (max bottom (1+ (cdr read)))) ;; `read' is a list of ranges. (when (/= (setq nlast (or (and (numberp (car read)) (car read)) (caar read))) 1) - (setq first (car active))) + (setq first bottom)) (while read (when first (push (cons first nlast) unread)) diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index 0e8e9908cf4..3f75bba6d1c 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -1501,6 +1501,17 @@ If it is nil, no confirmation is required." :type '(choice (const :tag "No limit" nil) integer)) +(defcustom gnus-maximum-newsgroup nil + "The maximum number of articles a newsgroup. +If this is a number, old articles in a newsgroup exceeding this number +are silently ignored. If it is nil, no article is ignored. Note that +setting this variable to a number might prevent you from reading very +old articles." + :group 'gnus-group-select + :version "22.2" + :type '(choice (const :tag "No limit" nil) + integer)) + (defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix))) "*Non-nil means that the default name of a file to save articles in is the group name. If it's nil, the directory form of the group name is used instead. diff --git a/man/ChangeLog b/man/ChangeLog index 6c27e3b7bb0..47109be64de 100644 --- a/man/ChangeLog +++ b/man/ChangeLog @@ -1,3 +1,7 @@ +2007-08-14 Katsumi Yamaoka + + * gnus.texi (Selecting a Group): Mention gnus-maximum-newsgroup. + 2007-08-17 Eli Zaretskii * basic.texi (Position Info): Add index entry for face at point. diff --git a/man/gnus.texi b/man/gnus.texi index 94144b65e3f..7cabf674102 100644 --- a/man/gnus.texi +++ b/man/gnus.texi @@ -2153,6 +2153,24 @@ most recently will be fetched. @code{gnus-large-newsgroup}, but is only used for ephemeral newsgroups. +@vindex gnus-maximum-newsgroup +In groups in some news servers, there might be a big gap between a few +very old articles that will never be expired and the recent ones. In +such a case, the server will return the data like @code{(1 . 30000000)} +for the @code{LIST ACTIVE group} command, for example. Even if there +are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't +know it at first and prepares for getting 30000000 articles. However, +it will consume hundreds megabytes of memories and might make Emacs get +stuck as the case may be. If you use such news servers, set the +variable @code{gnus-maximum-newsgroup} to a positive number. The value +means that Gnus ignores articles other than this number of the latest +ones in every group. For instance, the value 10000 makes Gnus get only +the articles 29990001-30000000 (if the latest article number is 30000000 +in a group). Note that setting this variable to a number might prevent +you from reading very old articles. The default value of the variable +@code{gnus-maximum-newsgroup} is @code{nil}, which means Gnus never +ignores old articles. + @vindex gnus-select-group-hook @vindex gnus-auto-select-first @vindex gnus-auto-select-subject -- 2.39.5