*** pub/qgnus/lisp/gnus-art.el Wed Feb 11 15:04:40 1998 --- qgnus/lisp/gnus-art.el Fri Feb 13 22:39:01 1998 *************** *** 2597,2602 **** --- 2597,2603 ---- (when (and (not force) (gnus-group-read-only-p)) (error "The current newsgroup does not support article editing")) + (gnus-article-date-original) (gnus-article-edit-article `(lambda (no-highlight) (gnus-summary-edit-article-done *************** *** 3187,3197 **** (defun gnus-button-url (address) "Browse ADDRESS." ! (funcall browse-url-browser-function address)) (defun gnus-button-embedded-url (address) "Browse ADDRESS." ! (funcall browse-url-browser-function (gnus-strip-whitespace address))) ;;; Next/prev buttons in the article buffer. --- 3188,3204 ---- (defun gnus-button-url (address) "Browse ADDRESS." ! ;; In Emacs 20, `browse-url-browser-function' may be an alist. ! (if (listp browse-url-browser-function) ! (browse-url address) ! (funcall browse-url-browser-function address))) (defun gnus-button-embedded-url (address) "Browse ADDRESS." ! ;; In Emacs 20, `browse-url-browser-function' may be an alist. ! (if (listp browse-url-browser-function) ! (browse-url (gnus-strip-whitespace address)) ! (funcall browse-url-browser-function (gnus-strip-whitespace address)))) ;;; Next/prev buttons in the article buffer. *** pub/qgnus/lisp/gnus-async.el Sat Sep 13 20:30:22 1997 --- qgnus/lisp/gnus-async.el Fri Feb 13 22:39:01 1998 *************** *** 77,82 **** --- 77,83 ---- (defvar gnus-async-article-alist nil) (defvar gnus-async-article-semaphore '(nil)) (defvar gnus-async-fetch-list nil) + (defvar gnus-asynch-obarray nil) (defvar gnus-async-prefetch-headers-buffer " *Async Prefetch Headers*") (defvar gnus-async-header-prefetched nil) *************** *** 120,126 **** gnus-async-header-prefetched nil)) (defun gnus-async-set-buffer () ! (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t)) (defun gnus-async-halt-prefetch () "Stop prefetching." --- 121,130 ---- gnus-async-header-prefetched nil)) (defun gnus-async-set-buffer () ! (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t) ! (unless gnus-asynch-obarray ! (set (make-local-variable 'gnus-asynch-obarray) ! (gnus-make-hashtable 1023)))) (defun gnus-async-halt-prefetch () "Stop prefetching." *************** *** 209,215 **** (when arg (gnus-async-set-buffer) (gnus-async-with-semaphore ! (push (list ',(intern (format "%s-%d" group article)) ,mark (set-marker (make-marker) (point-max)) ,group ,article) gnus-async-article-alist))) --- 213,220 ---- (when arg (gnus-async-set-buffer) (gnus-async-with-semaphore ! (push (list ',(intern (format "%s-%d" group article) ! gnus-asynch-obarray) ,mark (set-marker (make-marker) (point-max)) ,group ,article) gnus-async-article-alist))) *************** *** 259,266 **** (defun gnus-async-prefetched-article-entry (group article) "Return the entry for ARTICLE in GROUP iff it has been prefetched." ! (let ((entry (assq (intern (format "%s-%d" group article)) ! gnus-async-article-alist))) ;; Perhaps something has emptied the buffer? (if (and entry (= (cadr entry) (caddr entry))) --- 264,274 ---- (defun gnus-async-prefetched-article-entry (group article) "Return the entry for ARTICLE in GROUP iff it has been prefetched." ! (let ((entry (save-excursion ! (gnus-async-set-buffer) ! (assq (intern (format "%s-%d" group article) ! gnus-asynch-obarray) ! gnus-async-article-alist)))) ;; Perhaps something has emptied the buffer? (if (and entry (= (cadr entry) (caddr entry))) *** pub/qgnus/lisp/gnus-cite.el Sat Dec 6 17:45:09 1997 --- qgnus/lisp/gnus-cite.el Fri Feb 13 22:39:01 1998 *************** *** 571,578 **** (defun gnus-cite-parse-maybe (&optional force) ;; Parse if the buffer has changes since last time. ! (if (and (not force) (equal gnus-cite-article gnus-article-current)) () ;;Reset parser information. (setq gnus-cite-prefix-alist nil gnus-cite-attribution-alist nil --- 571,580 ---- (defun gnus-cite-parse-maybe (&optional force) ;; Parse if the buffer has changes since last time. ! (if (and (not force) ! (equal gnus-cite-article gnus-article-current)) () + (gnus-cite-localize) ;;Reset parser information. (setq gnus-cite-prefix-alist nil gnus-cite-attribution-alist nil *************** *** 906,915 **** (setq prefix (car entry)))) prefix)) ! (gnus-add-shutdown 'gnus-cache-close 'gnus) ! ! (defun gnus-cache-close () ! (setq gnus-cite-prefix-alist nil)) (gnus-ems-redefine) --- 908,921 ---- (setq prefix (car entry)))) prefix)) ! (defun gnus-cite-localize () ! "Make the citation variables local to the article buffer." ! (let ((vars '(gnus-cite-article ! gnus-cite-overlay-list gnus-cite-prefix-alist ! gnus-cite-attribution-alist gnus-cite-loose-prefix-alist ! gnus-cite-loose-attribution-alist))) ! (while vars ! (make-local-variable (pop vars))))) (gnus-ems-redefine) *** pub/qgnus/lisp/gnus-cus.el Sat Nov 22 18:55:04 1997 --- qgnus/lisp/gnus-cus.el Fri Feb 13 22:39:02 1998 *************** *** 287,298 **** `gnus-thread-score-function' says how to compute the total score for a thread.") ! (files (repeat :tag "Files" file) "\ The value of this entry should be any number of file names. These files are assumed to be score files as well, and will be loaded the same way this one was.") ! (exclude-files (repeat :tag "Exclude-files" file) "\ The clue of this entry should be any number of files. These files will not be loaded, even though they would normally be so, for some reason or other.") --- 287,298 ---- `gnus-thread-score-function' says how to compute the total score for a thread.") ! (files (repeat :inline t :tag "Files" file) "\ The value of this entry should be any number of file names. These files are assumed to be score files as well, and will be loaded the same way this one was.") ! (exclude-files (repeat :inline t :tag "Exclude-files" file) "\ The clue of this entry should be any number of files. These files will not be loaded, even though they would normally be so, for some reason or other.") *** pub/qgnus/lisp/gnus-draft.el Sun Feb 8 18:14:33 1998 --- qgnus/lisp/gnus-draft.el Fri Feb 13 22:39:02 1998 *************** *** 53,59 **** (easy-menu-define gnus-draft-menu gnus-draft-mode-map "" '("Drafts" ! ["Toggle whether to send" gnus-draft-toggle-sending t])))) (defun gnus-draft-mode (&optional arg) "Minor mode for providing a draft summary buffers. --- 53,62 ---- (easy-menu-define gnus-draft-menu gnus-draft-mode-map "" '("Drafts" ! ["Toggle whether to send" gnus-draft-toggle-sending t] ! ["Edit" gnus-draft-edit-message t] ! ["Send selected message(s)" gnus-draft-send-message t] ! ["Send all messages" gnus-draft-send-all-messages t])))) (defun gnus-draft-mode (&optional arg) "Minor mode for providing a draft summary buffers. *** pub/qgnus/lisp/gnus-sum.el Wed Feb 11 15:04:51 1998 --- qgnus/lisp/gnus-sum.el Fri Feb 13 22:39:08 1998 *************** *** 2173,2182 **** --- 2173,2184 ---- (gnus-summary-last-subject)))) (defmacro gnus-summary-article-header (&optional number) + "Return the header of article NUMBER." `(gnus-data-header (gnus-data-find ,(or number '(gnus-summary-article-number))))) (defmacro gnus-summary-thread-level (&optional number) + "Return the level of thread that starts with article NUMBER." `(if (and (eq gnus-summary-make-false-root 'dummy) (get-text-property (point) 'gnus-intangible)) 0 *************** *** 2184,2193 **** --- 2186,2197 ---- ,(or number '(gnus-summary-article-number)))))) (defmacro gnus-summary-article-mark (&optional number) + "Return the mark of article NUMBER." `(gnus-data-mark (gnus-data-find ,(or number '(gnus-summary-article-number))))) (defmacro gnus-summary-article-pos (&optional number) + "Return the position of the line of article NUMBER." `(gnus-data-pos (gnus-data-find ,(or number '(gnus-summary-article-number))))) *************** *** 2210,2215 **** --- 2214,2220 ---- gnus-summary-default-score 0)) (defun gnus-summary-article-children (&optional number) + "Return a list of article numbers that are children of article NUMBER." (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)))) (level (gnus-data-level (car data))) l children) *************** *** 2221,2226 **** --- 2226,2232 ---- (nreverse children))) (defun gnus-summary-article-parent (&optional number) + "Return the article number of the parent of article NUMBER." (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)) (gnus-data-list t))) (level (gnus-data-level (car data)))) *************** *** 2245,2250 **** --- 2251,2261 ---- (= mark gnus-expirable-mark)))) (defmacro gnus-article-mark (number) + "Return the MARK of article NUMBER. + This macro should only be used when computing the mark the \"first\" + time; i.e., when generating the summary lines. After that, + `gnus-summary-article-mark' should be used to examine the + marks of articles." `(cond ((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark) ((memq ,number gnus-newsgroup-undownloaded) gnus-undownloaded-mark) *************** *** 5068,5073 **** --- 5079,5086 ---- (gnus-dup-enter-articles)) (when gnus-use-trees (gnus-tree-close group)) + ;; Remove entries for this group. + (nnmail-purge-split-history group) ;; Make all changes in this group permanent. (unless quit-config (run-hooks 'gnus-exit-group-hook) *************** *** 7035,7040 **** --- 7048,7056 ---- (gnus-request-replace-article article gnus-newsgroup-name (current-buffer))))) + ;;;!!!Why is this necessary? + (set-buffer gnus-summary-buffer) + (gnus-summary-goto-subject article) (when (eq action 'move) (gnus-summary-mark-article article gnus-canceled-mark)))) *** pub/qgnus/lisp/gnus.el Wed Feb 11 15:04:55 1998 --- qgnus/lisp/gnus.el Fri Feb 13 22:39:10 1998 *************** *** 246,252 **** :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "0.24" "Version number for this version of Gnus.") (defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number) --- 246,252 ---- :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) ! (defconst gnus-version-number "0.25" "Version number for this version of Gnus.") (defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number) *************** *** 1529,1534 **** --- 1529,1535 ---- ("pp" pp pp-to-string pp-eval-expression) ("ps-print" ps-print-preprint) ("mail-extr" mail-extract-address-components) + ("browse-url" browse-url) ("message" :interactive t message-send-and-exit message-yank-original) ("nnmail" nnmail-split-fancy nnmail-article-group nnmail-date-to-time) *** pub/qgnus/lisp/message.el Wed Feb 11 15:04:57 1998 --- qgnus/lisp/message.el Fri Feb 13 22:39:12 1998 *************** *** 320,329 **** variable `mail-header-separator'. Legal values include `message-send-mail-with-sendmail' (the default), ! `message-send-mail-with-mh' and `message-send-mail-with-qmail'." :type '(radio (function-item message-send-mail-with-sendmail) (function-item message-send-mail-with-mh) (function-item message-send-mail-with-qmail) (function :tag "Other")) :group 'message-sending :group 'message-mail) --- 320,331 ---- variable `mail-header-separator'. Legal values include `message-send-mail-with-sendmail' (the default), ! `message-send-mail-with-mh', `message-send-mail-with-qmail' and ! `smtpmail-send-it'." :type '(radio (function-item message-send-mail-with-sendmail) (function-item message-send-mail-with-mh) (function-item message-send-mail-with-qmail) + (function-item smtpmail-send-it) (function :tag "Other")) :group 'message-sending :group 'message-mail) *************** *** 1807,1812 **** --- 1809,1815 ---- (defun message-dont-send () "Don't send the message you have been editing." (interactive) + (save-buffer) (let ((actions message-postpone-actions)) (message-bury (current-buffer)) (message-do-actions actions))) *************** *** 1983,1989 **** (save-excursion (set-buffer errbuf) (erase-buffer)))) ! (let ((default-directory "/")) (apply 'call-process-region (append (list (point-min) (point-max) (if (boundp 'sendmail-program) --- 1986,1993 ---- (save-excursion (set-buffer errbuf) (erase-buffer)))) ! (let ((default-directory "/") ! (coding-system-for-write 'binary)) (apply 'call-process-region (append (list (point-min) (point-max) (if (boundp 'sendmail-program) *************** *** 2031,2057 **** (run-hooks 'message-send-mail-hook) ;; send the message (case ! (apply ! 'call-process-region 1 (point-max) message-qmail-inject-program ! nil nil nil ! ;; qmail-inject's default behaviour is to look for addresses on the ! ;; command line; if there're none, it scans the headers. ! ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin. ! ;; ! ;; in general, ALL of qmail-inject's defaults are perfect for simply ! ;; reading a formatted (i. e., at least a To: or Resent-To header) ! ;; message from stdin. ! ;; ! ;; qmail also has the advantage of not having been raped by ! ;; various vendors, so we don't have to allow for that, either -- ! ;; compare this with message-send-mail-with-sendmail and weep ! ;; for sendmail's lost innocence. ! ;; ! ;; all this is way cool coz it lets us keep the arguments entirely ! ;; free for -inject-arguments -- a big win for the user and for us ! ;; since we don't have to play that double-guessing game and the user ! ;; gets full control (no gestapo'ish -f's, for instance). --sj ! message-qmail-inject-args) ;; qmail-inject doesn't say anything on it's stdout/stderr, ;; we have to look at the retval instead (0 nil) --- 2035,2062 ---- (run-hooks 'message-send-mail-hook) ;; send the message (case ! (let ((coding-system-for-write 'binary)) ! (apply ! 'call-process-region 1 (point-max) message-qmail-inject-program ! nil nil nil ! ;; qmail-inject's default behaviour is to look for addresses on the ! ;; command line; if there're none, it scans the headers. ! ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin. ! ;; ! ;; in general, ALL of qmail-inject's defaults are perfect for simply ! ;; reading a formatted (i. e., at least a To: or Resent-To header) ! ;; message from stdin. ! ;; ! ;; qmail also has the advantage of not having been raped by ! ;; various vendors, so we don't have to allow for that, either -- ! ;; compare this with message-send-mail-with-sendmail and weep ! ;; for sendmail's lost innocence. ! ;; ! ;; all this is way cool coz it lets us keep the arguments entirely ! ;; free for -inject-arguments -- a big win for the user and for us ! ;; since we don't have to play that double-guessing game and the user ! ;; gets full control (no gestapo'ish -f's, for instance). --sj ! message-qmail-inject-args)) ;; qmail-inject doesn't say anything on it's stdout/stderr, ;; we have to look at the retval instead (0 nil) *** pub/qgnus/lisp/nndoc.el Sun Jan 4 11:12:06 1998 --- qgnus/lisp/nndoc.el Fri Feb 13 22:39:13 1998 *************** *** 43,48 **** --- 43,53 ---- (defvoo nndoc-post-type 'mail "*Whether the nndoc group is `mail' or `post'.") + (defvoo nndoc-open-document-hook 'nnheader-ms-strip-cr + "Hook run after opening a document. + The default function removes all trailing carriage returns + from the document.") + (defvar nndoc-type-alist `((mmdf (article-begin . "^\^A\^A\^A\^A\n") *************** *** 86,93 **** (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n\n+")) (prepare-body-function . nndoc-unquote-dashes) (body-end-function . nndoc-digest-body-end) ! (head-end . "^ ?$") ! (body-begin . "^ ?\n") (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") (subtype digest guess)) (slack-digest --- 91,98 ---- (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n\n+")) (prepare-body-function . nndoc-unquote-dashes) (body-end-function . nndoc-digest-body-end) ! (head-end . "^ *$") ! (body-begin . "^ *\n") (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") (subtype digest guess)) (slack-digest *************** *** 279,285 **** (erase-buffer) (if (stringp nndoc-address) (nnheader-insert-file-contents nndoc-address) ! (insert-buffer-substring nndoc-address))))) ;; Initialize the nndoc structures according to this new document. (when (and nndoc-current-buffer (not nndoc-dissection-alist)) --- 284,291 ---- (erase-buffer) (if (stringp nndoc-address) (nnheader-insert-file-contents nndoc-address) ! (insert-buffer-substring nndoc-address)) ! (run-hooks 'nndoc-open-document-hook)))) ;; Initialize the nndoc structures according to this new document. (when (and nndoc-current-buffer (not nndoc-dissection-alist)) *** pub/qgnus/lisp/nnfolder.el Tue Nov 25 16:08:53 1997 --- qgnus/lisp/nnfolder.el Fri Feb 13 22:39:13 1998 *************** *** 329,404 **** (nnmail-save-active nnfolder-group-alist nnfolder-active-file) (nconc rest articles)))) ! (deffoo nnfolder-request-move-article ! (article group server accept-form &optional last) ! (let ((buf (get-buffer-create " *nnfolder move*")) ! result) ! (and ! (nnfolder-request-article article group server) ! (save-excursion ! (set-buffer buf) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (insert-buffer-substring nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward ! (concat "^" nnfolder-article-marker) ! (save-excursion (search-forward "\n\n" nil t) (point)) t) ! (delete-region (progn (beginning-of-line) (point)) ! (progn (forward-line 1) (point)))) ! (setq result (eval accept-form)) ! (kill-buffer buf) ! result) ! (save-excursion ! (nnfolder-possibly-change-group group server) ! (set-buffer nnfolder-current-buffer) ! (goto-char (point-min)) ! (when (search-forward (nnfolder-article-string article) nil t) ! (nnfolder-delete-mail)) ! (when last ! (nnfolder-save-buffer) ! (nnfolder-adjust-min-active group) ! (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))) ! result)) (deffoo nnfolder-request-accept-article (group &optional server last) ! (nnfolder-possibly-change-group group server) ! (nnmail-check-syntax) ! (let ((buf (current-buffer)) ! result art-group) ! (goto-char (point-min)) ! (when (looking-at "X-From-Line: ") ! (replace-match "From ")) ! (and ! (nnfolder-request-list) ! (save-excursion ! (set-buffer buf) ! (goto-char (point-min)) ! (search-forward "\n\n" nil t) ! (forward-line -1) ! (while (re-search-backward (concat "^" nnfolder-article-marker) nil t) ! (delete-region (point) (progn (forward-line 1) (point)))) ! (when nnmail-cache-accepted-message-ids ! (nnmail-cache-insert (nnmail-fetch-field "message-id"))) ! (setq result (if (stringp group) ! (list (cons group (nnfolder-active-number group))) ! (setq art-group ! (nnmail-article-group 'nnfolder-active-number)))) ! (if (and (null result) ! (yes-or-no-p "Moved to `junk' group; delete article? ")) ! (setq result 'junk) ! (setq result ! (car (nnfolder-save-mail result))))) ! (when last (save-excursion ! (nnfolder-possibly-change-folder (or (caar art-group) group)) ! (nnfolder-save-buffer) (when nnmail-cache-accepted-message-ids ! (nnmail-cache-close))))) ! (nnmail-save-active nnfolder-group-alist nnfolder-active-file) ! (unless result ! (nnheader-report 'nnfolder "Couldn't store article")) ! result)) (deffoo nnfolder-request-replace-article (article group buffer) (nnfolder-possibly-change-group group) --- 329,406 ---- (nnmail-save-active nnfolder-group-alist nnfolder-active-file) (nconc rest articles)))) ! (deffoo nnfolder-request-move-article (article group server ! accept-form &optional last) ! (save-excursion ! (let ((buf (get-buffer-create " *nnfolder move*")) ! result) ! (and ! (nnfolder-request-article article group server) ! (save-excursion ! (set-buffer buf) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (insert-buffer-substring nntp-server-buffer) ! (goto-char (point-min)) ! (while (re-search-forward ! (concat "^" nnfolder-article-marker) ! (save-excursion (search-forward "\n\n" nil t) (point)) t) ! (delete-region (progn (beginning-of-line) (point)) ! (progn (forward-line 1) (point)))) ! (setq result (eval accept-form)) ! (kill-buffer buf) ! result) ! (save-excursion ! (nnfolder-possibly-change-group group server) ! (set-buffer nnfolder-current-buffer) ! (goto-char (point-min)) ! (when (search-forward (nnfolder-article-string article) nil t) ! (nnfolder-delete-mail)) ! (when last ! (nnfolder-save-buffer) ! (nnfolder-adjust-min-active group) ! (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))) ! result))) (deffoo nnfolder-request-accept-article (group &optional server last) ! (save-excursion ! (nnfolder-possibly-change-group group server) ! (nnmail-check-syntax) ! (let ((buf (current-buffer)) ! result art-group) ! (goto-char (point-min)) ! (when (looking-at "X-From-Line: ") ! (replace-match "From ")) ! (and ! (nnfolder-request-list) (save-excursion ! (set-buffer buf) ! (goto-char (point-min)) ! (search-forward "\n\n" nil t) ! (forward-line -1) ! (while (re-search-backward (concat "^" nnfolder-article-marker) nil t) ! (delete-region (point) (progn (forward-line 1) (point)))) (when nnmail-cache-accepted-message-ids ! (nnmail-cache-insert (nnmail-fetch-field "message-id"))) ! (setq result (if (stringp group) ! (list (cons group (nnfolder-active-number group))) ! (setq art-group ! (nnmail-article-group 'nnfolder-active-number)))) ! (if (and (null result) ! (yes-or-no-p "Moved to `junk' group; delete article? ")) ! (setq result 'junk) ! (setq result ! (car (nnfolder-save-mail result))))) ! (when last ! (save-excursion ! (nnfolder-possibly-change-folder (or (caar art-group) group)) ! (nnfolder-save-buffer) ! (when nnmail-cache-accepted-message-ids ! (nnmail-cache-close))))) ! (nnmail-save-active nnfolder-group-alist nnfolder-active-file) ! (unless result ! (nnheader-report 'nnfolder "Couldn't store article")) ! result))) (deffoo nnfolder-request-replace-article (article group buffer) (nnfolder-possibly-change-group group) *************** *** 537,543 **** (setq nnfolder-current-group group) (when (or (not nnfolder-current-buffer) ! (not (verify-visited-file-modtime nnfolder-current-buffer))) (save-excursion (setq file (nnfolder-group-pathname group)) ;; See whether we need to create the new file. --- 539,546 ---- (setq nnfolder-current-group group) (when (or (not nnfolder-current-buffer) ! (not (verify-visited-file-modtime ! nnfolder-current-buffer))) (save-excursion (setq file (nnfolder-group-pathname group)) ;; See whether we need to create the new file. *** pub/qgnus/lisp/nnmail.el Sun Jan 4 14:35:30 1998 --- qgnus/lisp/nnmail.el Fri Feb 13 22:39:15 1998 *************** *** 1547,1555 **** (defun nnmail-get-new-mail (method exit-func temp &optional group spool-func) "Read new incoming mail." - ;; Nix out the previous split history. - (unless group - (setq nnmail-split-history nil)) (let* ((spools (nnmail-get-spool-files group)) (group-in group) nnmail-current-spool incoming incomings spool) --- 1547,1552 ---- *************** *** 1747,1752 **** --- 1744,1760 ---- elem ", ")) (princ "\n"))))) + + (defun nnmail-purge-split-history (group) + (let ((history nnmail-split-history)) + (while history + (let ((pairs (car history))) + (while pairs + (if (string= (car (car pairs)) group) + (setcar pairs (cdr pairs)) + (setq pairs (cdr pairs))))) + (setq history (cdr history)))) + (setq nnmail-split-history (delq nil nnmail-split-history))) (defun nnmail-new-mail-p (group) "Say whether GROUP has new mail." *** pub/qgnus/lisp/nnmh.el Sun Jan 4 14:35:30 1998 --- qgnus/lisp/nnmh.el Fri Feb 13 22:39:15 1998 *************** *** 466,472 **** (setq active (cons 1 0)) (push (list group active) nnmh-group-alist) (unless (file-exists-p dir) ! (make-directory dir)) ;; Find the highest number in the group. (let ((files (sort (mapcar --- 466,472 ---- (setq active (cons 1 0)) (push (list group active) nnmh-group-alist) (unless (file-exists-p dir) ! (gnus-make-directory dir)) ;; Find the highest number in the group. (let ((files (sort (mapcar *** pub/qgnus/lisp/nntp.el Sun Feb 8 18:14:48 1998 --- qgnus/lisp/nntp.el Fri Feb 13 22:39:15 1998 *************** *** 103,108 **** --- 103,114 ---- (defvoo nntp-telnet-passwd nil "Password to use to log in via telnet with.") + (defvoo nntp-open-telnet-envuser nil + "*If non-nil, telnet session (client and server both) will support the ENVIRON option and not prompt for login name.") + + (defvoo nntp-telnet-shell-prompt "bash\\|\$ *\r?$\\|> *\r?" + "*Regular expression to match the shell prompt on the remote machine.") + (defvoo nntp-telnet-command "telnet" "Command used to start telnet.") *************** *** 172,177 **** --- 178,184 ---- (defvar nntp-process-start-point nil) (defvar nntp-inside-change-function nil) (defvoo nntp-last-command-time nil) + (defvoo nntp-last-command nil) (defvar nntp-connection-list nil) *************** *** 194,199 **** --- 201,208 ---- (defsubst nntp-send-string (process string) "Send STRING to PROCESS." + (setq nntp-last-command-time (current-time) + nntp-last-command string) (process-send-string process (concat string nntp-end-of-line))) (defsubst nntp-wait-for (process wait-for buffer &optional decode discard) *************** *** 204,211 **** (while (or (not (memq (char-after (point)) '(?2 ?3 ?4 ?5))) (looking-at "480")) (when (looking-at "480") ! (erase-buffer) ! (funcall nntp-authinfo-function)) (nntp-accept-process-output process) (goto-char (point-min))) (prog1 --- 213,219 ---- (while (or (not (memq (char-after (point)) '(?2 ?3 ?4 ?5))) (looking-at "480")) (when (looking-at "480") ! (nntp-handle-authinfo process)) (nntp-accept-process-output process) (goto-char (point-min))) (prog1 *************** *** 248,254 **** (if (memq (process-status process) '(open run)) process (when (buffer-name (process-buffer process)) - (message "Killed buffer %s" (process-buffer process)) (kill-buffer (process-buffer process))) (setq nntp-connection-alist (delq entry nntp-connection-alist)) nil)))) --- 256,261 ---- *************** *** 264,272 **** (process-buffer process)))) (defsubst nntp-retrieve-data (command address port buffer ! &optional wait-for callback decode) "Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS." - (setq nntp-last-command-time (current-time)) (let ((process (or (nntp-find-connection buffer) (nntp-open-connection buffer)))) (if (not process) --- 271,278 ---- (process-buffer process)))) (defsubst nntp-retrieve-data (command address port buffer ! &optional wait-for callback decode) "Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS." (let ((process (or (nntp-find-connection buffer) (nntp-open-connection buffer)))) (if (not process) *************** *** 600,606 **** (deffoo nntp-request-group (group &optional server dont-check) (nntp-possibly-change-group nil server) ! (when (nntp-send-command "^2.*\n" "GROUP" group) (let ((entry (nntp-find-connection-entry nntp-server-buffer))) (setcar (cddr entry) group)))) --- 606,612 ---- (deffoo nntp-request-group (group &optional server dont-check) (nntp-possibly-change-group nil server) ! (when (nntp-send-command "^21.*\n" "GROUP" group) (let ((entry (nntp-find-connection-entry nntp-server-buffer))) (setcar (cddr entry) group)))) *************** *** 702,720 **** This function is supposed to be called from `nntp-server-opened-hook'. It will prompt for a password." (nntp-send-command ! "^.*\r?\n" "AUTHINFO USER" (read-string (format "NNTP (%s) user name: " nntp-address))) (nntp-send-command ! "^.*\r?\n" "AUTHINFO PASS" (nnmail-read-passwd "NNTP (%s) password: " nntp-address))) (defun nntp-send-authinfo () "Send the AUTHINFO to the nntp server. This function is supposed to be called from `nntp-server-opened-hook'. It will prompt for a password." ! (nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name)) (nntp-send-command ! "^.*\r?\n" "AUTHINFO PASS" (nnmail-read-passwd (format "NNTP (%s) password: " nntp-address)))) (defun nntp-send-authinfo-from-file () --- 708,726 ---- This function is supposed to be called from `nntp-server-opened-hook'. It will prompt for a password." (nntp-send-command ! "^3.*\r?\n" "AUTHINFO USER" (read-string (format "NNTP (%s) user name: " nntp-address))) (nntp-send-command ! "^2.*\r?\n" "AUTHINFO PASS" (nnmail-read-passwd "NNTP (%s) password: " nntp-address))) (defun nntp-send-authinfo () "Send the AUTHINFO to the nntp server. This function is supposed to be called from `nntp-server-opened-hook'. It will prompt for a password." ! (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name)) (nntp-send-command ! "^2.*\r?\n" "AUTHINFO PASS" (nnmail-read-passwd (format "NNTP (%s) password: " nntp-address)))) (defun nntp-send-authinfo-from-file () *************** *** 724,736 **** (nnheader-temp-write nil (insert-file-contents "~/.nntp-authinfo") (goto-char (point-min)) ! (nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name)) (nntp-send-command ! "^.*\r?\n" "AUTHINFO PASS" (buffer-substring (point) (progn (end-of-line) (point))))))) ;;; Internal functions. (defun nntp-make-process-buffer (buffer) "Create a new, fresh buffer usable for nntp process connections." (save-excursion --- 730,753 ---- (nnheader-temp-write nil (insert-file-contents "~/.nntp-authinfo") (goto-char (point-min)) ! (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name)) (nntp-send-command ! "^2.*\r?\n" "AUTHINFO PASS" (buffer-substring (point) (progn (end-of-line) (point))))))) ;;; Internal functions. + (defun nntp-handle-authinfo (process) + "Take care of an authinfo response from the server." + (let ((last nntp-last-command)) + (funcall nntp-authinfo-function) + ;; We have to re-send the function that was interrupted by + ;; the authinfo request. + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer)) + (nntp-send-string process last))) + (defun nntp-make-process-buffer (buffer) "Create a new, fresh buffer usable for nntp process connections." (save-excursion *************** *** 804,810 **** (save-excursion (goto-char beg) (if (looking-at "480") ! (funcall nntp-authinfo-function) (nntp-snarf-error-message) (funcall nntp-process-callback nil))) (goto-char end) --- 821,827 ---- (save-excursion (goto-char beg) (if (looking-at "480") ! (nntp-handle-authinfo nntp-process-to-buffer) (nntp-snarf-error-message) (funcall nntp-process-callback nil))) (goto-char end) *************** *** 1070,1082 **** (case-fold-search t)) (when (memq (process-status proc) '(open run)) (process-send-string proc "set escape \^X\n") ! (process-send-string proc (concat "open " nntp-address "\n")) ! (nntp-wait-for-string "^\r*.?login:") ! (process-send-string ! proc (concat ! (or nntp-telnet-user-name ! (setq nntp-telnet-user-name (read-string "login: "))) ! "\n")) (nntp-wait-for-string "^\r*.?password:") (process-send-string proc (concat --- 1087,1106 ---- (case-fold-search t)) (when (memq (process-status proc) '(open run)) (process-send-string proc "set escape \^X\n") ! (cond ! ((and nntp-open-telnet-envuser nntp-telnet-user-name) ! (process-send-string proc (concat "open " "-l" nntp-telnet-user-name ! nntp-address "\n"))) ! (t ! (process-send-string proc (concat "open " nntp-address "\n")))) ! (cond ! ((not nntp-open-telnet-envuser) ! (nntp-wait-for-string "^\r*.?login:") ! (process-send-string ! proc (concat ! (or nntp-telnet-user-name ! (setq nntp-telnet-user-name (read-string "login: "))) ! "\n")))) (nntp-wait-for-string "^\r*.?password:") (process-send-string proc (concat *************** *** 1085,1091 **** (nnmail-read-passwd "Password: "))) "\n")) (erase-buffer) ! (nntp-wait-for-string "bash\\|\$ *\r?$\\|> *\r?") (process-send-string proc (concat (mapconcat 'identity nntp-telnet-parameters " ") "\n")) (nntp-wait-for-string "^\r*20[01]") --- 1109,1115 ---- (nnmail-read-passwd "Password: "))) "\n")) (erase-buffer) ! (nntp-wait-for-string nntp-telnet-shell-prompt) (process-send-string proc (concat (mapconcat 'identity nntp-telnet-parameters " ") "\n")) (nntp-wait-for-string "^\r*20[01]") *** pub/qgnus/lisp/ChangeLog Wed Feb 11 15:04:38 1998 --- qgnus/lisp/ChangeLog Fri Feb 13 22:38:59 1998 *************** *** 1,3 **** --- 1,79 ---- + Fri Feb 13 22:40:39 1998 Lars Magne Ingebrigtsen + + * gnus.el: Quassia Gnus v0.25 is released. + + Fri Feb 13 19:01:19 1998 Lars Magne Ingebrigtsen + + * nndoc.el (nndoc-type-alist): Allow blank lines to separate + headers from bodies. + + * gnus-art.el (gnus-article-edit): Restore Date header. + + * gnus-async.el (gnus-asynch-obarray): New variable. + (gnus-async-prefetched-article-entry): Use it. + (gnus-async-set-buffer): Use it. + + * nnmh.el (nnmh-active-number): Create parent dirs. + + * nntp.el (nntp-last-command): New variable. + (nntp-handle-authinfo): New function. + + * gnus-sum.el (gnus-summary-exit): Call purging function. + + Fri Feb 13 18:59:16 1998 François Pinard + + * nnmail.el (nnmail-get-new-mail): Don't clear split-history. + (nnmail-purge-split-history): New function. + + Fri Feb 13 18:36:16 1998 Lars Magne Ingebrigtsen + + * nntp.el (nntp-telnet-shell-prompt): Renamed. + + Fri Feb 13 18:35:23 1998 Sam Falkner + + * nntp.el (nntp-open-telnet-envuser): New variable. + + Fri Feb 13 18:29:23 1998 Lars Magne Ingebrigtsen + + * message.el (message-send-mail-function): Added smtpmail-send-it. + + 1998-02-11 Dave Love + + * gnus-art.el (gnus-button-url): Don't lose in Emacs 20 with + browse-url-browser-function an alist, not a function. + (gnus-button-embedded-url): Likewise. + + Fri Feb 13 17:10:31 1998 Lars Magne Ingebrigtsen + + * gnus-cite.el (gnus-cite-localize): New function. + (gnus-cite-close): Renamed. + (gnus-cite-parse-maybe): Use it. + + * gnus-sum.el (gnus-summary-move-article): Move back to summary + buffer. + + * nnfolder.el (nnfolder-request-accept-article): Save excursion. + (nnfolder-request-move-article): Ditto. + + * nntp.el (nntp-find-connection): Don't message. + + Fri Feb 13 14:51:56 1998 MORIOKA Tomohiko + + * message.el (message-send-mail-with-qmail): Fix. + + 1998-02-13 Per Abrahamsen + + * gnus-draft.el (gnus-draft-make-menu-bar): Added missing commands. + + 1998-01-06 Per Abrahamsen + + * gnus/gnus-cus.el (gnus-score-parameters): Make `files' and + `exclude-files' widgets inline. + + Fri Feb 13 12:46:23 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-article-mark): Dox dox. + Wed Feb 11 15:05:03 1998 Lars Magne Ingebrigtsen * gnus.el: Quassia Gnus v0.24 is released. *** pub/qgnus/texi/gnus.texi Wed Feb 11 15:05:07 1998 --- qgnus/texi/gnus.texi Fri Feb 13 22:39:27 1998 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Quassia Gnus 0.24 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename gnus ! @settitle Quassia Gnus 0.25 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 313,319 **** @tex @titlepage ! @title Quassia Gnus 0.24 Manual @author by Lars Magne Ingebrigtsen @page --- 313,319 ---- @tex @titlepage ! @title Quassia Gnus 0.25 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 349,355 **** spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Quassia Gnus 0.24. @end ifinfo --- 349,355 ---- spool or your mbox file. All at the same time, if you want to push your luck. ! This manual corresponds to Quassia Gnus 0.25. @end ifinfo *************** *** 686,692 **** @item gnus-subscribe-randomly @vindex gnus-subscribe-randomly Subscribe all new groups in arbitrary order. This really means that all ! new groups will be added at ``the top'' of the grop buffer. @item gnus-subscribe-alphabetically @vindex gnus-subscribe-alphabetically --- 686,692 ---- @item gnus-subscribe-randomly @vindex gnus-subscribe-randomly Subscribe all new groups in arbitrary order. This really means that all ! new groups will be added at ``the top'' of the group buffer. @item gnus-subscribe-alphabetically @vindex gnus-subscribe-alphabetically *************** *** 7123,7130 **** Copy the article from one group (mail group or not) to a mail group (@code{gnus-summary-copy-article}). ! @item B C ! @kindex B C (Summary) @cindex crosspost mail @findex gnus-summary-crosspost-article Crosspost the current article to some other group --- 7123,7130 ---- Copy the article from one group (mail group or not) to a mail group (@code{gnus-summary-copy-article}). ! @item B B ! @kindex B B (Summary) @cindex crosspost mail @findex gnus-summary-crosspost-article Crosspost the current article to some other group *************** *** 8994,8999 **** --- 8994,9010 ---- A list of strings executed as a command after logging in via @code{telnet}. + @item nntp-telnet-shell-prompt + @vindex nntp-telnet-shell-prompt + Regexp matching the shell prompt on the remote machine. The default is + @samp{bash\\|\$ *\r?$\\|> *\r?}. + + @item nntp-open-telnet-envuser + @vindex nntp-open-telnet-envuser + If non-@code{nil}, the @code{telnet} session (client and server both) + will support the @code{ENVIRON} option and not prompt for login name. + This works for Solaris @code{telnet}, for instance. + @end table @item nntp-end-of-line *************** *** 9543,9548 **** --- 9554,9569 ---- @code{nnmail-spool-file} to @code{procmail} to ensure that the mail backends never ever try to fetch mail by themselves. + If you have a combined @code{procmail}/POP/mailbox setup, you can do + something like the following: + + @vindex nnmail-use-procmail + @lisp + (setq nnmail-use-procmail t) + (setq nnmail-spool-file + '("/usr/spool/mail/my-name" "po:my-name")) + @end lisp + This also means that you probably don't want to set @code{nnmail-split-methods} either, which has some, perhaps, unexpected side effects. *************** *** 17121,17129 **** handle 480/381 authinfo requests separately. @item - when sending authinfo automatically, things hang. - - @item include the texi/dir file in the distribution. @item --- 17142,17147 ---- *************** *** 17150,17159 **** snews://secnews.netscape.com/netscape.communicator.unix @item - When the nntp server hangs up while the user is composing the message, - when sending the message and the nntp server asks for AUTH, Gnus hangs. - - @item One command to edit the original version if an article, and one to edit the displayed version. --- 17168,17173 ---- *************** *** 17163,17168 **** --- 17177,17188 ---- @item Switch from initial text to the new default text mechanism. + + @item + How about making it possible to expire local articles? Will it be + possible to make various constraints on when an article can be + expired, e.g. (read), (age > 14 days), or the more interesting (read + & age > 14 days)? @item Solve the halting problem. *** pub/qgnus/texi/message.texi Wed Feb 11 15:05:08 1998 --- qgnus/texi/message.texi Fri Feb 13 22:39:27 1998 *************** *** 1,7 **** \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Message 0.24 Manual @synindex fn cp @synindex vr cp @synindex pg cp --- 1,7 ---- \input texinfo @c -*-texinfo-*- @setfilename message ! @settitle Message 0.25 Manual @synindex fn cp @synindex vr cp @synindex pg cp *************** *** 39,45 **** @tex @titlepage ! @title Message 0.24 Manual @author by Lars Magne Ingebrigtsen @page --- 39,45 ---- @tex @titlepage ! @title Message 0.25 Manual @author by Lars Magne Ingebrigtsen @page *************** *** 80,86 **** * Key Index:: List of Message mode keys. @end menu ! This manual corresponds to Message 0.24. Message is distributed with the Gnus distribution bearing the same version number as this manual has. --- 80,86 ---- * Key Index:: List of Message mode keys. @end menu ! This manual corresponds to Message 0.25. Message is distributed with the Gnus distribution bearing the same version number as this manual has. *** pub/qgnus/texi/ChangeLog Wed Feb 11 15:05:08 1998 --- qgnus/texi/ChangeLog Fri Feb 13 22:39:27 1998 *************** *** 1,3 **** --- 1,9 ---- + Fri Feb 13 18:23:19 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Mail Group Commands): Typo. + (NNTP): Addition. + (Mail and Procmail): Addition. + Mon Feb 9 16:30:30 1998 Lars Magne Ingebrigtsen * gnus.texi (Article Date): Addition. *** pub/qgnus/texi/dir Wed Jun 18 00:54:19 1997 --- qgnus/texi/dir Tue Nov 25 06:16:59 1997 *************** *** 0 **** --- 1,9 ---- + -*- Text -*- + The Gnus-related top node. +  + File: dir Node: Top This is the Gnus Info tree + + * Menu: + + * Gnus: (gnus). The news reader Gnus. + * Message: (message). The Message sending thingamabob.