aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Love2000-09-20 16:54:57 +0000
committerDave Love2000-09-20 16:54:57 +0000
commit8b93df0128d3c27cc67aa77885d925ca991c0215 (patch)
treec075a34664f453e5da61d2aeebe4afc1141fe4ac
parent805b7fc07472cdd3d863b9ade9235d871c96d545 (diff)
downloademacs-8b93df0128d3c27cc67aa77885d925ca991c0215.tar.gz
emacs-8b93df0128d3c27cc67aa77885d925ca991c0215.zip
Merge from Gnus trunk.
-rw-r--r--lisp/gnus/ChangeLog150
-rw-r--r--lisp/gnus/gnus-art.el57
-rw-r--r--lisp/gnus/gnus-group.el16
-rw-r--r--lisp/gnus/gnus-msg.el7
-rw-r--r--lisp/gnus/gnus-sum.el25
-rw-r--r--lisp/gnus/gnus-topic.el43
-rw-r--r--lisp/gnus/gnus-util.el4
-rw-r--r--lisp/gnus/nnheader.el4
-rw-r--r--lisp/gnus/nnkiboze.el232
-rw-r--r--lisp/gnus/nnmail.el7
10 files changed, 396 insertions, 149 deletions
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index 0ed8e88e7d8..847ab7eb586 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,8 +1,158 @@
12000-09-20 Dave Love <fx@gnu.org>
2
3 * mail-source.el (mail-source-delete-incoming): Set to t, assuming
4 we'll be careful merging development changes.
5
6 * gnus-start.el (gnus-1) <gnus-simple-splash>: Don't test for X
7 specifically.
8
9 * gnus-ems.el (gnus-smiley-display): Autoload from smiley-ems.
10 (mouse-set-point, set-face-foreground)
11 (set-face-background, x-popup-menu) [not window-system]: Don't zap
12 them.
13
14 * mm-decode.el (mm-valid-and-fit-image-p): Use display-graphic-p.
15
16 * gnus.el (gnus-version-number): Start 5.9 series. Avoid some
17 redundant autoloads.
18
12000-09-20 Gerd Moellmann <gerd@gnu.org> 192000-09-20 Gerd Moellmann <gerd@gnu.org>
2 20
3 * gnus-ems.el (gnus-article-display-xface): Don't convert PBM 21 * gnus-ems.el (gnus-article-display-xface): Don't convert PBM
4 to XBM; we always have PBM support. 22 to XBM; we always have PBM support.
5 23
242000-09-19 ShengHuo ZHU <zsh@cs.rochester.edu>
25
26 * gnus-group.el (gnus-group-make-kiboze-group): Makedir.
27 * nnheader.el (nnheader-parse-nov): Remove Xref in mail-header-xref.
28 * gnus-sum.el (gnus-nov-parse-line): Ditto.
29 * nnkiboze.el (nnkiboze-file-coding-system): New.
30 (nnkiboze-retrieve-headers): Use it.
31 (nnkiboze-request-group): Ditto.
32 (nnkiboze-close-group): Ditto.
33 (nnkiboze-generate-group): Ditto.
34 (nnkiboze-enter-nov): Insert first Xref properly.
35
362000-09-19 Dave Love <fx@gnu.org>
37
38 * nnmail.el (nnmail-cache-accepted-message-ids): Default to nil.
39 (nnmail-get-new-mail): Test `sources' in top-level conditional.
40
41 * mail-source.el (mail-sources): Change default to '((file)).
42 Add useful custom type.
43
442000-09-18 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
45
46 * gnus-util.el (gnus-time-iso8601): Correct doc string (four digit
47 year).
48 (gnus-date-iso8601): Ditto.
49
502000-09-18 ShengHuo ZHU <zsh@cs.rochester.edu>
51
52 * mail-source.el (mail-source-fetch-imap): Disable multibyte.
53
542000-09-17 ShengHuo ZHU <zsh@cs.rochester.edu>
55
56 * rfc2047.el (rfc2047-q-encoding-alist): Remove = and _ from the
57 pattern. Avoid using 8 bit chars.
58 * qp.el (quoted-printable-encode-region): Avoid using 8 bit chars.
59
602000-09-16 ShengHuo ZHU <zsh@cs.rochester.edu>
61
62 * smiley.el (smiley-buffer-ems, smiley-create-glyph-ems,
63 smiley-toggle-extent-ems, smiley-toggle-extents-ems,
64 smiley-toggle-buffer-ems): New functions for Emacs 21. Toggle
65 functions are not implemented yet.
66
67 * dgnushack.el (dgnushack-compile): Remove smiley.el and
68 x-overlay.el from the FSF Emacs black list.
69
702000-09-15 ShengHuo ZHU <zsh@cs.rochester.edu>
71
72 * mm-decode.el (mm-inlined-types): Add application/emacs-lisp.
73 (mm-inline-media-tests): Ditto.
74 (mm-automatic-display): Ditto.
75 * mm-view.el (mm-display-inline-fontify): Generalize from
76 mm-display-patch-inline.
77 (mm-display-patch-inline): Use it.
78 (mm-display-elisp-inline): Ditto.
79
802000-09-15 ShengHuo ZHU <zsh@cs.rochester.edu>
81
82 * gnus-topic.el (gnus-topic-find-groups): Add recursive parameter.
83 (gnus-topic-unmark-topic): Ditto.
84 (gnus-topic-mark-topic): Ditto.
85 (gnus-topic-get-new-news-this-topic): Use it.
86
872000-09-15 09:01:40 ShengHuo ZHU <zsh@cs.rochester.edu>
88
89 * gnus-art.el (gnus-treat-display-xface): By default, Emacs 21
90 display xface.
91
922000-09-15 Katsumi Yamaoka <yamaoka@jpl.org>
93
94 * gnus-group.el (gnus-group-rename-group): Inhibit renaming of
95 zombie or killed groups.
96
972000-09-15 ShengHuo ZHU <zsh@cs.rochester.edu>
98
99 * mml.el (mml-preview): Reinsert unibyte content.
100 (mml-parse-1): Remove with-unibyte-current-buffer.
101 (mml-generate-mime-1): Ditto.
102 * gnus-msg.el (gnus-summary-mail-forward): Ditto.
103 * message.el (message-forward): Ditto.
104
1052000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
106
107 * gnus-art.el (article-de-quoted-unreadable): Guess charset from
108 original article buffer.
109 (article-de-base64-unreadable): Ditto.
110 (article-wash-html): Ditto.
111
1122000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
113
114 * gnus-msg.el (gnus-summary-mail-forward): Disable multibyte
115 unless forward-show-mml.
116
1172000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
118
119 * gnus-sum.el (gnus-summary-save-parts-type-history): New.
120 (gnus-summary-save-parts-last-directory): New.
121 (gnus-summary-save-parts): Save history.
122
1232000-09-14 Ben Gertzfield <che@debian.org>
124
125 * gnus-sum.el (gnus-summary-save-parts-default-mime): New
126 variable.
127 (gnus-summary-save-parts): Use it.
128
1292000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
130
131 * gnus-art.el (gnus-article-setup-buffer): Clean handle-alist.
132 * gnus-sum.el (gnus-summary-exit): Ditto.
133 (gnus-summary-exit-no-update): Ditto.
134 (gnus-summary-show-article): Ditto.
135
1362000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
137
138 * nndoc.el (nndoc-dissect-mime-parts-sub): Remove
139 Content-Disposition.
140
1412000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
142
143 * webmail.el: Hotmail updated. Add X-Gnus-Webmail.
144
1452000-09-14 ShengHuo ZHU <zsh@cs.rochester.edu>
146
147 * gnus-art.el (gnus-article-setup-buffer): Set
148 gnus-article-mime-handles to nil.
149 * gnus-sum.el (gnus-summary-exit): Ditto.
150 (gnus-summary-exit-no-update): Ditto.
151 (gnus-summary-show-article): Ditto.
152 (gnus-summary-save-parts): Use gnus-article-mime-handles if
153 dissected.
154 * mm-partial.el (mm-partial-find-parts): Remove redundancy.
155
62000-09-14 Dave Love <fx@gnu.org> 1562000-09-14 Dave Love <fx@gnu.org>
7 157
8 * gnus.el (gnus-charset): 158 * gnus.el (gnus-charset):
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index c552c966d10..4bc1e3fe708 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -871,8 +871,11 @@ See the manual for details."
871 :type gnus-article-treat-custom) 871 :type gnus-article-treat-custom)
872(put 'gnus-treat-overstrike 'highlight t) 872(put 'gnus-treat-overstrike 'highlight t)
873 873
874(defcustom gnus-treat-display-xface (if (and gnus-xemacs (featurep 'xface)) 874(defcustom gnus-treat-display-xface
875 'head nil) 875 (and (or (and (fboundp 'image-type-available-p)
876 (image-type-available-p 'xbm))
877 (and gnus-xemacs (featurep 'xface)))
878 'head)
876 "Display X-Face headers. 879 "Display X-Face headers.
877Valid values are nil, t, `head', `last', an integer or a predicate. 880Valid values are nil, t, `head', `last', an integer or a predicate.
878See the manual for details." 881See the manual for details."
@@ -1510,9 +1513,21 @@ If FORCE, decode the article whether it is marked as quoted-printable
1510or not." 1513or not."
1511 (interactive (list 'force)) 1514 (interactive (list 'force))
1512 (save-excursion 1515 (save-excursion
1513 (let ((buffer-read-only nil) 1516 (let ((buffer-read-only nil) type charset)
1514 (type (gnus-fetch-field "content-transfer-encoding")) 1517 (if (gnus-buffer-live-p gnus-original-article-buffer)
1515 (charset gnus-newsgroup-charset)) 1518 (with-current-buffer gnus-original-article-buffer
1519 (setq type
1520 (gnus-fetch-field "content-transfer-encoding"))
1521 (let* ((ct (gnus-fetch-field "content-type"))
1522 (ctl (and ct
1523 (ignore-errors
1524 (mail-header-parse-content-type ct)))))
1525 (setq charset (and ctl
1526 (mail-content-type-get ctl 'charset)))
1527 (if (stringp charset)
1528 (setq charset (intern (downcase charset)))))))
1529 (unless charset
1530 (setq charset gnus-newsgroup-charset))
1516 (when (or force 1531 (when (or force
1517 (and type (string-match "quoted-printable" (downcase type)))) 1532 (and type (string-match "quoted-printable" (downcase type))))
1518 (article-goto-body) 1533 (article-goto-body)
@@ -1523,9 +1538,21 @@ or not."
1523If FORCE, decode the article whether it is marked as base64 not." 1538If FORCE, decode the article whether it is marked as base64 not."
1524 (interactive (list 'force)) 1539 (interactive (list 'force))
1525 (save-excursion 1540 (save-excursion
1526 (let ((buffer-read-only nil) 1541 (let ((buffer-read-only nil) type charset)
1527 (type (gnus-fetch-field "content-transfer-encoding")) 1542 (if (gnus-buffer-live-p gnus-original-article-buffer)
1528 (charset gnus-newsgroup-charset)) 1543 (with-current-buffer gnus-original-article-buffer
1544 (setq type
1545 (gnus-fetch-field "content-transfer-encoding"))
1546 (let* ((ct (gnus-fetch-field "content-type"))
1547 (ctl (and ct
1548 (ignore-errors
1549 (mail-header-parse-content-type ct)))))
1550 (setq charset (and ctl
1551 (mail-content-type-get ctl 'charset)))
1552 (if (stringp charset)
1553 (setq charset (intern (downcase charset)))))))
1554 (unless charset
1555 (setq charset gnus-newsgroup-charset))
1529 (when (or force 1556 (when (or force
1530 (and type (string-match "base64" (downcase type)))) 1557 (and type (string-match "base64" (downcase type))))
1531 (article-goto-body) 1558 (article-goto-body)
@@ -1551,7 +1578,19 @@ If FORCE, decode the article whether it is marked as base64 not."
1551 (interactive) 1578 (interactive)
1552 (save-excursion 1579 (save-excursion
1553 (let ((buffer-read-only nil) 1580 (let ((buffer-read-only nil)
1554 (charset gnus-newsgroup-charset)) 1581 charset)
1582 (if (gnus-buffer-live-p gnus-original-article-buffer)
1583 (with-current-buffer gnus-original-article-buffer
1584 (let* ((ct (gnus-fetch-field "content-type"))
1585 (ctl (and ct
1586 (ignore-errors
1587 (mail-header-parse-content-type ct)))))
1588 (setq charset (and ctl
1589 (mail-content-type-get ctl 'charset)))
1590 (if (stringp charset)
1591 (setq charset (intern (downcase charset)))))))
1592 (unless charset
1593 (setq charset gnus-newsgroup-charset))
1555 (article-goto-body) 1594 (article-goto-body)
1556 (save-window-excursion 1595 (save-window-excursion
1557 (save-restriction 1596 (save-restriction
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index c4ee639c09e..0aead88df25 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -2046,10 +2046,12 @@ and NEW-NAME will be prompted for."
2046 2046
2047 (gnus-message 6 "Renaming group %s to %s..." group new-name) 2047 (gnus-message 6 "Renaming group %s to %s..." group new-name)
2048 (prog1 2048 (prog1
2049 (if (not (gnus-request-rename-group group new-name)) 2049 (if (progn
2050 (gnus-group-goto-group group)
2051 (not (when (< (gnus-group-group-level) gnus-level-zombie)
2052 (gnus-request-rename-group group new-name))))
2050 (gnus-error 3 "Couldn't rename group %s to %s" group new-name) 2053 (gnus-error 3 "Couldn't rename group %s to %s" group new-name)
2051 ;; We rename the group internally by killing it... 2054 ;; We rename the group internally by killing it...
2052 (gnus-group-goto-group group)
2053 (gnus-group-kill-group) 2055 (gnus-group-kill-group)
2054 ;; ... changing its name ... 2056 ;; ... changing its name ...
2055 (setcar (cdar gnus-list-of-killed-groups) new-name) 2057 (setcar (cdar gnus-list-of-killed-groups) new-name)
@@ -2335,9 +2337,13 @@ score file entries for articles to include in the group."
2335 (push (cons header regexps) scores)) 2337 (push (cons header regexps) scores))
2336 scores))) 2338 scores)))
2337 (gnus-group-make-group group "nnkiboze" address) 2339 (gnus-group-make-group group "nnkiboze" address)
2338 (with-temp-file (gnus-score-file-name (concat "nnkiboze:" group)) 2340 (let* ((score-file (gnus-score-file-name (concat "nnkiboze:" group)))
2339 (let (emacs-lisp-mode-hook) 2341 (score-dir (file-name-directory score-file)))
2340 (pp scores (current-buffer))))) 2342 (unless (file-exists-p score-dir)
2343 (make-directory score-dir))
2344 (with-temp-file score-file
2345 (let (emacs-lisp-mode-hook)
2346 (pp scores (current-buffer))))))
2341 2347
2342(defun gnus-group-add-to-virtual (n vgroup) 2348(defun gnus-group-add-to-virtual (n vgroup)
2343 "Add the current group to a virtual group." 2349 "Add the current group to a virtual group."
diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el
index e371db143f8..7f80f8ea049 100644
--- a/lisp/gnus/gnus-msg.el
+++ b/lisp/gnus/gnus-msg.el
@@ -723,19 +723,18 @@ If POST, post instead of mail."
723 text) 723 text)
724 (save-excursion 724 (save-excursion
725 (set-buffer gnus-original-article-buffer) 725 (set-buffer gnus-original-article-buffer)
726 (mm-with-unibyte-current-buffer 726 (setq text (buffer-string)))
727 (setq text (buffer-string))))
728 (set-buffer 727 (set-buffer
729 (gnus-get-buffer-create 728 (gnus-get-buffer-create
730 (generate-new-buffer-name " *Gnus forward*"))) 729 (generate-new-buffer-name " *Gnus forward*")))
731 (erase-buffer) 730 (erase-buffer)
732 (mm-disable-multibyte) 731 (unless message-forward-show-mml
732 (mm-disable-multibyte))
733 (insert text) 733 (insert text)
734 (goto-char (point-min)) 734 (goto-char (point-min))
735 (when (looking-at "From ") 735 (when (looking-at "From ")
736 (replace-match "X-From-Line: ") ) 736 (replace-match "X-From-Line: ") )
737 (when message-forward-show-mml 737 (when message-forward-show-mml
738 (mm-enable-multibyte)
739 (mime-to-mml)) 738 (mime-to-mml))
740 (message-forward post))))) 739 (message-forward post)))))
741 740
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 52d93cb3c18..999e3b039fe 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -885,6 +885,14 @@ For example: ((1 . cn-gb-2312) (2 . big5))."
885 :type '(choice (const nil) 885 :type '(choice (const nil)
886 integer)) 886 integer))
887 887
888(defcustom gnus-summary-save-parts-default-mime "image/.*"
889 "*A regexp to match MIME parts when saving multiple parts of a message
890with gnus-summary-save-parts (X m). This regexp will be used by default
891when prompting the user for which type of files to save."
892 :group 'gnus-summary
893 :type 'regexp)
894
895
888;;; Internal variables 896;;; Internal variables
889 897
890(defvar gnus-article-mime-handles nil) 898(defvar gnus-article-mime-handles nil)
@@ -902,6 +910,9 @@ For example: ((1 . cn-gb-2312) (2 . big5))."
902(defvar gnus-sort-gathered-threads-function 'gnus-thread-sort-by-number 910(defvar gnus-sort-gathered-threads-function 'gnus-thread-sort-by-number
903 "Function called to sort the articles within a thread after it has been gathered together.") 911 "Function called to sort the articles within a thread after it has been gathered together.")
904 912
913(defvar gnus-summary-save-parts-type-history nil)
914(defvar gnus-summary-save-parts-last-directory nil)
915
905;; Avoid highlighting in kill files. 916;; Avoid highlighting in kill files.
906(defvar gnus-summary-inhibit-highlight nil) 917(defvar gnus-summary-inhibit-highlight nil)
907(defvar gnus-newsgroup-selected-overlay nil) 918(defvar gnus-newsgroup-selected-overlay nil)
@@ -3300,7 +3311,9 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise."
3300 (nnheader-nov-read-integer) ; chars 3311 (nnheader-nov-read-integer) ; chars
3301 (nnheader-nov-read-integer) ; lines 3312 (nnheader-nov-read-integer) ; lines
3302 (unless (eobp) 3313 (unless (eobp)
3303 (nnheader-nov-field)) ; misc 3314 (if (looking-at "Xref: ")
3315 (goto-char (match-end 0)))
3316 (nnheader-nov-field)) ; Xref
3304 (nnheader-nov-parse-extra)))) ; extra 3317 (nnheader-nov-parse-extra)))) ; extra
3305 3318
3306 (widen)) 3319 (widen))
@@ -9195,8 +9208,14 @@ save those articles instead."
9195 "Save parts matching TYPE to DIR. 9208 "Save parts matching TYPE to DIR.
9196If REVERSE, save parts that do not match TYPE." 9209If REVERSE, save parts that do not match TYPE."
9197 (interactive 9210 (interactive
9198 (list (read-string "Save parts of type: " "image/.*") 9211 (list (read-string "Save parts of type: "
9199 (read-file-name "Save to directory: " nil nil t) 9212 (or (car gnus-summary-save-parts-type-history)
9213 gnus-summary-save-parts-default-mime)
9214 'gnus-summary-save-parts-type-history)
9215 (setq gnus-summary-save-parts-last-directory
9216 (read-file-name "Save to directory: "
9217 gnus-summary-save-parts-last-directory
9218 nil t))
9200 current-prefix-arg)) 9219 current-prefix-arg))
9201 (gnus-summary-iterate n 9220 (gnus-summary-iterate n
9202 (let ((gnus-display-mime-function nil) 9221 (let ((gnus-display-mime-function nil)
diff --git a/lisp/gnus/gnus-topic.el b/lisp/gnus/gnus-topic.el
index 2a320d40866..35324395bb7 100644
--- a/lisp/gnus/gnus-topic.el
+++ b/lisp/gnus/gnus-topic.el
@@ -192,8 +192,9 @@ If TOPIC, start with that topic."
192 (beginning-of-line) 192 (beginning-of-line)
193 (get-text-property (point) 'gnus-active))) 193 (get-text-property (point) 'gnus-active)))
194 194
195(defun gnus-topic-find-groups (topic &optional level all lowest) 195(defun gnus-topic-find-groups (topic &optional level all lowest recursive)
196 "Return entries for all visible groups in TOPIC." 196 "Return entries for all visible groups in TOPIC.
197If RECURSIVE is t, return groups in its subtopics too."
197 (let ((groups (cdr (assoc topic gnus-topic-alist))) 198 (let ((groups (cdr (assoc topic gnus-topic-alist)))
198 info clevel unread group params visible-groups entry active) 199 info clevel unread group params visible-groups entry active)
199 (setq lowest (or lowest 1)) 200 (setq lowest (or lowest 1))
@@ -231,7 +232,18 @@ If TOPIC, start with that topic."
231 (cdr (assq 'visible params))) 232 (cdr (assq 'visible params)))
232 ;; Add this group to the list of visible groups. 233 ;; Add this group to the list of visible groups.
233 (push (or entry group) visible-groups))) 234 (push (or entry group) visible-groups)))
234 (nreverse visible-groups))) 235 (setq visible-groups (nreverse visible-groups))
236 (when recursive
237 (if (eq recursive t)
238 (setq recursive (cdr (gnus-topic-find-topology topic))))
239 (mapcar (lambda (topic-topology)
240 (setq visible-groups
241 (nconc visible-groups
242 (gnus-topic-find-groups
243 (caar topic-topology)
244 level all lowest topic-topology))))
245 (cdr recursive)))
246 visible-groups))
235 247
236(defun gnus-topic-previous-topic (topic) 248(defun gnus-topic-previous-topic (topic)
237 "Return the previous topic on the same level as TOPIC." 249 "Return the previous topic on the same level as TOPIC."
@@ -1292,30 +1304,37 @@ If PERMANENT, make it stay shown in subsequent sessions as well."
1292 (setcar (cdr (cadr topic)) 'visible) 1304 (setcar (cdr (cadr topic)) 'visible)
1293 (gnus-group-list-groups))))) 1305 (gnus-group-list-groups)))))
1294 1306
1295(defun gnus-topic-mark-topic (topic &optional unmark) 1307(defun gnus-topic-mark-topic (topic &optional unmark recursive)
1296 "Mark all groups in the topic with the process mark." 1308 "Mark all groups in the TOPIC with the process mark.
1297 (interactive (list (gnus-group-topic-name))) 1309If RECURSIVE is t, mark its subtopics too."
1310 (interactive (list (gnus-group-topic-name)
1311 nil
1312 (and current-prefix-arg t)))
1298 (if (not topic) 1313 (if (not topic)
1299 (call-interactively 'gnus-group-mark-group) 1314 (call-interactively 'gnus-group-mark-group)
1300 (save-excursion 1315 (save-excursion
1301 (let ((groups (gnus-topic-find-groups topic gnus-level-killed t))) 1316 (let ((groups (gnus-topic-find-groups topic gnus-level-killed t nil
1317 recursive)))
1302 (while groups 1318 (while groups
1303 (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark) 1319 (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
1304 (gnus-info-group (nth 2 (pop groups))))))))) 1320 (gnus-info-group (nth 2 (pop groups)))))))))
1305 1321
1306(defun gnus-topic-unmark-topic (topic &optional unmark) 1322(defun gnus-topic-unmark-topic (topic &optional dummy recursive)
1307 "Remove the process mark from all groups in the topic." 1323 "Remove the process mark from all groups in the TOPIC.
1308 (interactive (list (gnus-group-topic-name))) 1324If RECURSIVE is t, unmark its subtopics too."
1325 (interactive (list (gnus-group-topic-name)
1326 nil
1327 (and current-prefix-arg t)))
1309 (if (not topic) 1328 (if (not topic)
1310 (call-interactively 'gnus-group-unmark-group) 1329 (call-interactively 'gnus-group-unmark-group)
1311 (gnus-topic-mark-topic topic t))) 1330 (gnus-topic-mark-topic topic t recursive)))
1312 1331
1313(defun gnus-topic-get-new-news-this-topic (&optional n) 1332(defun gnus-topic-get-new-news-this-topic (&optional n)
1314 "Check for new news in the current topic." 1333 "Check for new news in the current topic."
1315 (interactive "P") 1334 (interactive "P")
1316 (if (not (gnus-group-topic-p)) 1335 (if (not (gnus-group-topic-p))
1317 (gnus-group-get-new-news-this-group n) 1336 (gnus-group-get-new-news-this-group n)
1318 (gnus-topic-mark-topic (gnus-group-topic-name)) 1337 (gnus-topic-mark-topic (gnus-group-topic-name) nil (and n t))
1319 (gnus-group-get-new-news-this-group))) 1338 (gnus-group-get-new-news-this-group)))
1320 1339
1321(defun gnus-topic-move-matching (regexp topic &optional copyp) 1340(defun gnus-topic-move-matching (regexp topic &optional copyp)
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index 10f5076815e..72e4d031e1c 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -311,11 +311,11 @@ Cache the result as a text property stored in DATE."
311 time))))) 311 time)))))
312 312
313(defsubst gnus-time-iso8601 (time) 313(defsubst gnus-time-iso8601 (time)
314 "Return a string of TIME in YYMMDDTHHMMSS format." 314 "Return a string of TIME in YYYYMMDDTHHMMSS format."
315 (format-time-string "%Y%m%dT%H%M%S" time)) 315 (format-time-string "%Y%m%dT%H%M%S" time))
316 316
317(defun gnus-date-iso8601 (date) 317(defun gnus-date-iso8601 (date)
318 "Convert the DATE to YYMMDDTHHMMSS." 318 "Convert the DATE to YYYYMMDDTHHMMSS."
319 (condition-case () 319 (condition-case ()
320 (gnus-time-iso8601 (gnus-date-get-time date)) 320 (gnus-time-iso8601 (gnus-date-get-time date))
321 (error ""))) 321 (error "")))
diff --git a/lisp/gnus/nnheader.el b/lisp/gnus/nnheader.el
index a8c16c4777e..848d7e47a7a 100644
--- a/lisp/gnus/nnheader.el
+++ b/lisp/gnus/nnheader.el
@@ -332,7 +332,9 @@ on your system, you could say something like:
332 (nnheader-nov-read-integer) ; lines 332 (nnheader-nov-read-integer) ; lines
333 (if (eq (char-after) ?\n) 333 (if (eq (char-after) ?\n)
334 nil 334 nil
335 (nnheader-nov-field)) ; misc 335 (if (looking-at "Xref: ")
336 (goto-char (match-end 0)))
337 (nnheader-nov-field)) ; Xref
336 (nnheader-nov-parse-extra)))) ; extra 338 (nnheader-nov-parse-extra)))) ; extra
337 339
338(defun nnheader-insert-nov (header) 340(defun nnheader-insert-nov (header)
diff --git a/lisp/gnus/nnkiboze.el b/lisp/gnus/nnkiboze.el
index 864a18acb9e..d93800a5b97 100644
--- a/lisp/gnus/nnkiboze.el
+++ b/lisp/gnus/nnkiboze.el
@@ -36,6 +36,7 @@
36(require 'gnus) 36(require 'gnus)
37(require 'gnus-score) 37(require 'gnus-score)
38(require 'nnoo) 38(require 'nnoo)
39(require 'mm-util)
39(eval-when-compile (require 'cl)) 40(eval-when-compile (require 'cl))
40 41
41(nnoo-declare nnkiboze) 42(nnoo-declare nnkiboze)
@@ -57,6 +58,9 @@
57(defvoo nnkiboze-regexp nil 58(defvoo nnkiboze-regexp nil
58 "Regexp for matching component groups.") 59 "Regexp for matching component groups.")
59 60
61(defvoo nnkiboze-file-coding-system mm-text-coding-system
62 "Coding system for nnkiboze files.")
63
60 64
61 65
62(defconst nnkiboze-version "nnkiboze 1.0") 66(defconst nnkiboze-version "nnkiboze 1.0")
@@ -82,7 +86,8 @@
82 (save-excursion 86 (save-excursion
83 (set-buffer nntp-server-buffer) 87 (set-buffer nntp-server-buffer)
84 (erase-buffer) 88 (erase-buffer)
85 (nnheader-insert-file-contents nov) 89 (let ((nnheader-file-coding-system nnkiboze-file-coding-system))
90 (nnheader-insert-file-contents nov))
86 (nnheader-nov-delete-outside-range 91 (nnheader-nov-delete-outside-range
87 (car articles) (car (last articles))) 92 (car articles) (car (last articles)))
88 'nov)))))) 93 'nov))))))
@@ -121,7 +126,8 @@
121 (nnkiboze-request-scan group)) 126 (nnkiboze-request-scan group))
122 (if (not (file-exists-p nov-file)) 127 (if (not (file-exists-p nov-file))
123 (nnheader-report 'nnkiboze "Can't select group %s" group) 128 (nnheader-report 'nnkiboze "Can't select group %s" group)
124 (nnheader-insert-file-contents nov-file) 129 (let ((nnheader-file-coding-system nnkiboze-file-coding-system))
130 (nnheader-insert-file-contents nov-file))
125 (if (zerop (buffer-size)) 131 (if (zerop (buffer-size))
126 (nnheader-insert "211 0 0 0 %s\n" group) 132 (nnheader-insert "211 0 0 0 %s\n" group)
127 (goto-char (point-min)) 133 (goto-char (point-min))
@@ -138,15 +144,17 @@
138 ;; Remove NOV lines of articles that are marked as read. 144 ;; Remove NOV lines of articles that are marked as read.
139 (when (and (file-exists-p (nnkiboze-nov-file-name)) 145 (when (and (file-exists-p (nnkiboze-nov-file-name))
140 nnkiboze-remove-read-articles) 146 nnkiboze-remove-read-articles)
141 (with-temp-file (nnkiboze-nov-file-name) 147 (let ((coding-system-for-write nnkiboze-file-coding-system))
142 (let ((cur (current-buffer))) 148 (with-temp-file (nnkiboze-nov-file-name)
143 (nnheader-insert-file-contents (nnkiboze-nov-file-name)) 149 (let ((cur (current-buffer))
144 (goto-char (point-min)) 150 (nnheader-file-coding-system nnkiboze-file-coding-system))
145 (while (not (eobp)) 151 (nnheader-insert-file-contents (nnkiboze-nov-file-name))
146 (if (not (gnus-article-read-p (read cur))) 152 (goto-char (point-min))
147 (forward-line 1) 153 (while (not (eobp))
148 (gnus-delete-line)))))) 154 (if (not (gnus-article-read-p (read cur)))
149 (setq nnkiboze-current-group nil)) 155 (forward-line 1)
156 (gnus-delete-line))))))
157 (setq nnkiboze-current-group nil)))
150 158
151(deffoo nnkiboze-open-server (server &optional defs) 159(deffoo nnkiboze-open-server (server &optional defs)
152 (unless (assq 'nnkiboze-regexp defs) 160 (unless (assq 'nnkiboze-regexp defs)
@@ -233,93 +241,94 @@ Finds out what articles are to be part of the nnkiboze groups."
233 ;; Load the kiboze newsrc file for this group. 241 ;; Load the kiboze newsrc file for this group.
234 (when (file-exists-p newsrc-file) 242 (when (file-exists-p newsrc-file)
235 (load newsrc-file)) 243 (load newsrc-file))
236 (with-temp-file nov-file 244 (let ((coding-system-for-write nnkiboze-file-coding-system))
237 (when (file-exists-p nov-file) 245 (with-temp-file nov-file
238 (insert-file-contents nov-file)) 246 (when (file-exists-p nov-file)
239 (setq nov-buffer (current-buffer)) 247 (insert-file-contents nov-file))
240 ;; Go through the active hashtb and add new all groups that match the 248 (setq nov-buffer (current-buffer))
241 ;; kiboze regexp. 249 ;; Go through the active hashtb and add new all groups that match the
242 (mapatoms 250 ;; kiboze regexp.
243 (lambda (group) 251 (mapatoms
244 (and (string-match nnkiboze-regexp 252 (lambda (group)
245 (setq gname (symbol-name group))) ; Match 253 (and (string-match nnkiboze-regexp
246 (not (assoc gname nnkiboze-newsrc)) ; It isn't registered 254 (setq gname (symbol-name group))) ; Match
247 (numberp (car (symbol-value group))) ; It is active 255 (not (assoc gname nnkiboze-newsrc)) ; It isn't registered
248 (or (> nnkiboze-level 7) 256 (numberp (car (symbol-value group))) ; It is active
249 (and (setq glevel (nth 1 (nth 2 (gnus-gethash 257 (or (> nnkiboze-level 7)
250 gname gnus-newsrc-hashtb)))) 258 (and (setq glevel (nth 1 (nth 2 (gnus-gethash
251 (>= nnkiboze-level glevel))) 259 gname gnus-newsrc-hashtb))))
252 (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes 260 (>= nnkiboze-level glevel)))
253 (push (cons gname (1- (car (symbol-value group)))) 261 (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes
254 nnkiboze-newsrc))) 262 (push (cons gname (1- (car (symbol-value group))))
255 gnus-active-hashtb) 263 nnkiboze-newsrc)))
256 ;; `newsrc' is set to the list of groups that possibly are 264 gnus-active-hashtb)
257 ;; component groups to this kiboze group. This list has elements 265 ;; `newsrc' is set to the list of groups that possibly are
258 ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest 266 ;; component groups to this kiboze group. This list has elements
259 ;; number that has been kibozed in GROUP in this kiboze group. 267 ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest
260 (setq newsrc nnkiboze-newsrc) 268 ;; number that has been kibozed in GROUP in this kiboze group.
261 (while newsrc 269 (setq newsrc nnkiboze-newsrc)
262 (if (not (setq active (gnus-gethash 270 (while newsrc
263 (caar newsrc) gnus-active-hashtb))) 271 (if (not (setq active (gnus-gethash
264 ;; This group isn't active after all, so we remove it from 272 (caar newsrc) gnus-active-hashtb)))
265 ;; the list of component groups. 273 ;; This group isn't active after all, so we remove it from
266 (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc)) 274 ;; the list of component groups.
267 (setq lowest (cdar newsrc)) 275 (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc))
268 ;; Ok, we have a valid component group, so we jump to it. 276 (setq lowest (cdar newsrc))
269 (switch-to-buffer gnus-group-buffer) 277 ;; Ok, we have a valid component group, so we jump to it.
270 (gnus-group-jump-to-group (caar newsrc)) 278 (switch-to-buffer gnus-group-buffer)
271 (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc)) 279 (gnus-group-jump-to-group (caar newsrc))
272 (setq ginfo (gnus-get-info (gnus-group-group-name)) 280 (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc))
273 orig-info (gnus-copy-sequence ginfo) 281 (setq ginfo (gnus-get-info (gnus-group-group-name))
274 num-unread (car (gnus-gethash (caar newsrc) 282 orig-info (gnus-copy-sequence ginfo)
275 gnus-newsrc-hashtb))) 283 num-unread (car (gnus-gethash (caar newsrc)
276 (unwind-protect 284 gnus-newsrc-hashtb)))
277 (progn 285 (unwind-protect
278 ;; We set all list of article marks to nil. Since we operate 286 (progn
279 ;; on copies of the real lists, we can destroy anything we 287 ;; We set all list of article marks to nil. Since we operate
280 ;; want here. 288 ;; on copies of the real lists, we can destroy anything we
281 (when (nth 3 ginfo) 289 ;; want here.
282 (setcar (nthcdr 3 ginfo) nil)) 290 (when (nth 3 ginfo)
283 ;; We set the list of read articles to be what we expect for 291 (setcar (nthcdr 3 ginfo) nil))
284 ;; this kiboze group -- either nil or `(1 . LOWEST)'. 292 ;; We set the list of read articles to be what we expect for
285 (when ginfo 293 ;; this kiboze group -- either nil or `(1 . LOWEST)'.
286 (setcar (nthcdr 2 ginfo) 294 (when ginfo
287 (and (not (= lowest 1)) (cons 1 lowest)))) 295 (setcar (nthcdr 2 ginfo)
288 (when (and (or (not ginfo) 296 (and (not (= lowest 1)) (cons 1 lowest))))
289 (> (length (gnus-list-of-unread-articles 297 (when (and (or (not ginfo)
290 (car ginfo))) 298 (> (length (gnus-list-of-unread-articles
291 0)) 299 (car ginfo)))
292 (progn 300 0))
293 (ignore-errors 301 (progn
294 (gnus-group-select-group nil)) 302 (ignore-errors
295 (eq major-mode 'gnus-summary-mode))) 303 (gnus-group-select-group nil))
296 ;; We are now in the group where we want to be. 304 (eq major-mode 'gnus-summary-mode)))
297 (setq method (gnus-find-method-for-group 305 ;; We are now in the group where we want to be.
298 gnus-newsgroup-name)) 306 (setq method (gnus-find-method-for-group
299 (when (eq method gnus-select-method) 307 gnus-newsgroup-name))
300 (setq method nil)) 308 (when (eq method gnus-select-method)
301 ;; We go through the list of scored articles. 309 (setq method nil))
302 (while gnus-newsgroup-scored 310 ;; We go through the list of scored articles.
303 (when (> (caar gnus-newsgroup-scored) lowest) 311 (while gnus-newsgroup-scored
304 ;; If it has a good score, then we enter this article 312 (when (> (caar gnus-newsgroup-scored) lowest)
305 ;; into the kiboze group. 313 ;; If it has a good score, then we enter this article
306 (nnkiboze-enter-nov 314 ;; into the kiboze group.
307 nov-buffer 315 (nnkiboze-enter-nov
308 (gnus-summary-article-header 316 nov-buffer
309 (caar gnus-newsgroup-scored)) 317 (gnus-summary-article-header
310 gnus-newsgroup-name)) 318 (caar gnus-newsgroup-scored))
311 (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored))) 319 gnus-newsgroup-name))
312 ;; That's it. We exit this group. 320 (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
313 (when (eq major-mode 'gnus-summary-mode) 321 ;; That's it. We exit this group.
314 (kill-buffer (current-buffer))))) 322 (when (eq major-mode 'gnus-summary-mode)
315 ;; Restore the proper info. 323 (kill-buffer (current-buffer)))))
316 (when ginfo 324 ;; Restore the proper info.
317 (setcdr ginfo (cdr orig-info))) 325 (when ginfo
318 (setcar (gnus-gethash (caar newsrc) gnus-newsrc-hashtb) 326 (setcdr ginfo (cdr orig-info)))
319 num-unread))) 327 (setcar (gnus-gethash (caar newsrc) gnus-newsrc-hashtb)
320 (setcdr (car newsrc) (car active)) 328 num-unread)))
321 (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc)) 329 (setcdr (car newsrc) (car active))
322 (setq newsrc (cdr newsrc)))) 330 (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc))
331 (setq newsrc (cdr newsrc)))))
323 ;; We save the kiboze newsrc for this group. 332 ;; We save the kiboze newsrc for this group.
324 (with-temp-file newsrc-file 333 (with-temp-file newsrc-file
325 (insert "(setq nnkiboze-newsrc '") 334 (insert "(setq nnkiboze-newsrc '")
@@ -343,19 +352,22 @@ Finds out what articles are to be part of the nnkiboze groups."
343 (forward-line 1)) 352 (forward-line 1))
344 (setq article 1)) 353 (setq article 1))
345 (mail-header-set-number oheader article) 354 (mail-header-set-number oheader article)
346 (nnheader-insert-nov oheader) 355 (with-temp-buffer
347 (search-backward "\t" nil t 2) 356 (insert (mail-header-xref oheader))
348 (if (re-search-forward " [^ ]+:[0-9]+" nil t) 357 (goto-char (point-min))
349 (goto-char (match-beginning 0)) 358 (if (re-search-forward " [^ ]+:[0-9]+" nil t)
359 (goto-char (match-beginning 0))
350 (forward-char 1)) 360 (forward-char 1))
351 ;; The first Xref has to be the group this article 361 ;; The first Xref has to be the group this article
352 ;; really came for - this is the article nnkiboze 362 ;; really came for - this is the article nnkiboze
353 ;; will request when it is asked for the article. 363 ;; will request when it is asked for the article.
354 (insert " " group ":" 364 (insert " " group ":"
355 (int-to-string (mail-header-number header)) " ") 365 (int-to-string (mail-header-number header)) " ")
356 (while (re-search-forward " [^ ]+:[0-9]+" nil t) 366 (while (re-search-forward " [^ ]+:[0-9]+" nil t)
357 (goto-char (1+ (match-beginning 0))) 367 (goto-char (1+ (match-beginning 0)))
358 (insert prefix))))) 368 (insert prefix))
369 (mail-header-set-xref oheader (buffer-string)))
370 (nnheader-insert-nov oheader))))
359 371
360(defun nnkiboze-nov-file-name (&optional suffix) 372(defun nnkiboze-nov-file-name (&optional suffix)
361 (concat (file-name-as-directory nnkiboze-directory) 373 (concat (file-name-as-directory nnkiboze-directory)
diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el
index be8984866d7..9ccf564b365 100644
--- a/lisp/gnus/nnmail.el
+++ b/lisp/gnus/nnmail.el
@@ -185,7 +185,7 @@ The return value should be `delete' or a group name (a string)."
185 :group 'nnmail 185 :group 'nnmail
186 :type 'boolean) 186 :type 'boolean)
187 187
188(defcustom nnmail-spool-file '((file)) 188(defcustom nnmail-spool-file nil
189 "*Where the mail backends will look for incoming mail. 189 "*Where the mail backends will look for incoming mail.
190This variable is a list of mail source specifiers. 190This variable is a list of mail source specifiers.
191This variable is obsolete; `mail-sources' should be used instead." 191This variable is obsolete; `mail-sources' should be used instead."
@@ -226,7 +226,7 @@ links, you could set this variable to `copy-file' instead."
226 '(nnheader-ms-strip-cr) 226 '(nnheader-ms-strip-cr)
227 nil) 227 nil)
228 "*Hook that will be run after the incoming mail has been transferred. 228 "*Hook that will be run after the incoming mail has been transferred.
229The incoming mail is moved from `nnmail-spool-file' (which normally is 229The incoming mail is moved from the specified spool file (which normally is
230something like \"/usr/spool/mail/$user\") to the user's home 230something like \"/usr/spool/mail/$user\") to the user's home
231directory. This hook is called after the incoming mail box has been 231directory. This hook is called after the incoming mail box has been
232emptied, and can be used to call any mail box programs you have 232emptied, and can be used to call any mail box programs you have
@@ -1513,7 +1513,8 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
1513 (new 0) 1513 (new 0)
1514 (total 0) 1514 (total 0)
1515 incoming incomings source) 1515 incoming incomings source)
1516 (when (nnmail-get-value "%s-get-new-mail" method) 1516 (when (and (nnmail-get-value "%s-get-new-mail" method)
1517 sources)
1517 (while (setq source (pop sources)) 1518 (while (setq source (pop sources))
1518 ;; Be compatible with old values. 1519 ;; Be compatible with old values.
1519 (cond 1520 (cond