-.PHONY: lisp texi elc info
+EMACS=emacs
-all: elc texi
+all: lick info
-lisp:
- cd lisp; $(MAKE) all
-
-texi:
- cd texi; $(MAKE) all
+lick:
+ cd lisp; $(MAKE) EMACS=$(EMACS) all
-
-elc:
- cd lisp; $(MAKE) elc
+some:
+ cd lisp; $(MAKE) EMACS=$(EMACS) some
info:
- cd lisp; $(MAKE) info
+ cd texi; $(MAKE) all
+Sat May 27 09:25:52 1995 Lars Magne Ingebrigtsen <larsi@bera.ifi.uio.no>
+
+ * nnmail.el (nnmail-split-incoming): Would bug out on long
+ content-lengths.
+
+ * gnus.el (gnus-active-to-gnus-format): Do more checking.
+ (gnus-summary-prev-page): Would not configure windows.
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Did not
+ insert From headers in nov files.
+
+ * nnbabyl.el (nnbabyl-retrieve-headers): Misspelled func name.
+
+ * gnus.el (gnus-browse-group-name): Did not work.
+ (gnus-browse-select-group): No interactive spec.
+
+ * gnus-msg.el (gnus-mail-reply-using-mail): `C-c C-y' woyld yank
+ only headers.
+
+Fri May 26 06:34:55 1995 Lars Ingebrigtsen <lars@eyesore.no>
+
+ * gnus.el (gnus-group-make-doc-group): New command and keystroke.
+
+ * nndoc.el (nndoc-open-server): New implementation. Now does
+ babyl, mbox and digest.
+
+ * nnspool.el (nnspool-request-post): Use a pipe instead of a pty.
+
+ * gnus-msg.el (gnus-inews-insert-headers): Do the _-_ a bit more
+ intelligently.
+
+Thu May 25 13:05:05 1995 Lars Ingebrigtsen <lars@eyesore.no>
+
+ * gnus.el (gnus-summary-enter-digest-group): Did not work.
+
+ * nndigest.el (nndigest-current-buffer): Doc fix.
+
+ * nnmh.el (nnmh-request-list): Would recurse needlessly.
+
Thu May 25 05:34:16 1995 Lars Magne Ingebrigtsen <larsi@bera.ifi.uio.no>
+ * gnus.el: 0.77 is released.
+
* gnus.el (gnus-article-date-ut): Ignore missing dates.
(gnus-group-enter-directory): New command and keystroke.
-include ../Makefile.conf
+EMACS=emacs
+FLAGS=-batch -l ./dgnushack.el
-.SUFFIXES: .el .elc
-.el.elc:; $(ELC) $<
+all:
+ $(EMACS) $(FLAGS) -f batch-byte-compile *.el
-# virtual adds stuff for virtual groups
-# nnmbox adds back end for mbox mail groups
-# nnml adds back end for nnml mail groups
-# nnmh adds back end for nnmh mail groups
-# nnspool adds back ends for local news spool
-# mh adds functions for using MH interface for mail and mail output
+some:
+ $(EMACS) $(FLAGS) -f dgnushack-recompile
-SUBSETS =gnus nntp virtual nnmbox nnml nnmh nnspool mh
-DGNUS.el =gnus-cache.el gnus-cite.el gnus-ems.el \
- gnus-kill.el gnus-mh.el gnus-msg.el gnus-score.el gnus-uu.el \
- gnus-vis.el gnus-vm.el gnus.el nnbabyl.el nndigest.el \
- nndir.el nndoc.el nnfolder.el nnheader.el nnkiboze.el \
- nnmail.el nnmbox.el nnmh.el nnml.el nnspool.el nntp.el \
- nnvirtual.el nneething.el
-
-DGNUS.elc =$(DGNUS.el:.el=.elc)
-
-.PHONY: syntax all elc $(SUBSETS)
-
-syntax:
- @echo "make one or more of: all elc $(SUBSETS)"
- @exit 1
-
-all: $(DGNUS.elc)
-
-elc: $(DGNUS.el)
- $(ELC) $(DGNUS.el)
-
-install:: $(DGNUS.elc) $(DESTELC)
- $(INSTALL) $(INSTDFLAGS) $(DGNUS.elc) $(DESTELC)
-
-install:: $(DGNUS.el) $(DESTEL)
- case "$(DESTEL)" in \
- ?*) $(INSTALL) $(INSTDFLAGS) $(DGNUS.el) $(DESTEL);; \
- esac
-
-$(DESTEL):; $(MKDIRS) $? && chmod $(MODEDIR) $?
-$(DESTELC):; $(MKDIRS) $? && chmod $(MODEDIR) $?
-
-gnus: nnheader.elc gnus.elc gnus-vis.elc gnus-uu.elc
-mh: gnus gnus-mh.elc
-nnmbox: gnus nnmail.elc nnmbox.elc
-nnmh: gnus nnmail.elc nnmh.elc
-nnml: gnus nnmail.elc nnml.elc
-nntp: gnus nntp.elc
-nnspool: nntp nnspool.elc
-virtual: nntp nnvirtual.elc
-
-gnus-cache.elc: gnus.el
-gnus-cite.elc: gnus-msg.el
-gnus-cite.elc: gnus.el
-gnus-kill.elc: gnus.el
-gnus-mh.elc: gnus-msg.el
-gnus-mh.elc: gnus.el
-gnus-msg.elc: gnus.el
-gnus-score.elc: gnus.el
-gnus-uu.elc: gnus-msg.el
-gnus-uu.elc: gnus.el
-gnus-vis.elc: gnus.el
-gnus-vm.elc: gnus-msg.el
-gnus-vm.elc: gnus.el
-gnus.elc: gnus-ems.el
-gnus.elc: nnheader.el
-gnus.elc: nnmh.el
-gnus.elc: nnspool.el
-gnus.elc: nntp.el
-nnbabyl.elc: nnheader.el
-nnbabyl.elc: nnmail.el
-nndigest.elc: nnheader.el
-nndir.elc: nnheader.el
-nndir.elc: nnmh.el
-nndir.elc: nnml.el
-nneething.elc: nnheader.el
-nneething.elc: nnmail.el
-nndoc.elc: nnheader.el
-nndoc.elc: nnmail.el
-nnfolder.elc: gnus.el
-nnfolder.elc: nnheader.el
-nnfolder.elc: nnmail.el
-nnkiboze.elc: gnus-score.el
-nnkiboze.elc: gnus.el
-nnkiboze.elc: nnheader.el
-nnkiboze.elc: nntp.el
-nnmail.elc: nnheader.el
-nnmbox.elc: nnheader.el
-nnmbox.elc: nnmail.el
-nnmh.elc: gnus.el
-nnmh.elc: nnheader.el
-nnmh.elc: nnmail.el
-nnml.elc: nnheader.el
-nnml.elc: nnmail.el
-nnspool.elc: nnheader.el
-nnspool.elc: nntp.el
-nntp.elc: nnheader.el
-nnvirtual.elc: gnus.el
-nnvirtual.elc: nnheader.el
-nnvirtual.elc: nntp.el
(setq load-path (cons "." load-path))
+(defun dgnushack-recompile ()
+ (byte-recompile-directory "."))
+
;;; dgnushack.el ends here
(beginning-of-line))
(forward-line 1))
;; [number subject from date id references chars lines xref]
- (insert (format "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n"
+ (insert (format "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n"
(header-number headers)
(header-subject headers)
+ (header-from headers)
(header-date headers)
(header-id headers)
(or (header-references headers) "")
(and (not (file-directory-p file))
(not (file-symlink-p file))
(file-exists-p file))))
+ (or (fboundp 'face-list)
+ (defun face-list (&rest args)))
)
(defun gnus-ems-redefine ()
(cond ((get-buffer-window buffer)
(pop-to-buffer buffer))
((eq major-mode 'gnus-group-mode)
- (gnus-configure-windows '(1 0 0)) ;Take all windows.
- (pop-to-buffer gnus-group-buffer)
- ;; Fix by sachs@SLINKY.CS.NYU.EDU (Jay Sachs).
- (let ((gnus-summary-buffer buffer))
- (gnus-configure-windows '(1 1 0))) ;Split into two.
+ (gnus-configure-windows 'group) ;Take all windows.
(pop-to-buffer buffer))
((eq major-mode 'gnus-summary-mode)
(gnus-configure-windows 'article)
(defvar gnus-post-news-buffer "*post-news*")
(defvar gnus-summary-send-map nil)
(defvar gnus-article-copy nil)
+(defvar gnus-reply-subject nil)
\f
;;;
(gnus-overload-functions)
(make-local-variable 'gnus-article-reply)
(make-local-variable 'gnus-article-check-size)
+ (make-local-variable 'gnus-reply-subject)
+ (setq gnus-reply-subject (and header (header-subject header)))
(setq gnus-article-reply sumart)
;; Handle `gnus-auto-mail-to-author'.
;; Suggested by Daniel Quinlan <quinlan@best.com>.
(if (and (mail-fetch-field "references")
(get-buffer gnus-article-buffer))
(let ((psubject (gnus-simplify-subject-re
- (mail-fetch-field "subject")))
- subject)
- (save-excursion
- (set-buffer gnus-article-buffer)
- (save-restriction
- (gnus-narrow-to-headers)
- (if (setq subject (mail-fetch-field "subject"))
- (progn
- (and gnus-summary-gather-subject-limit
- (numberp gnus-summary-gather-subject-limit)
- (> (length subject) gnus-summary-gather-subject-limit)
- (setq subject
- (substring subject 0
- gnus-summary-gather-subject-limit)))
- (setq subject (gnus-simplify-subject-re subject))))))
- (or (and psubject subject (string= subject psubject))
+ (mail-fetch-field "subject"))))
+ (or (and psubject gnus-reply-subject
+ (string= (gnus-simplify-subject-re gnus-reply-subject)
+ psubject))
(progn
(string-match "@" Message-ID)
(setq Message-ID
(setq cc (mail-fetch-field "cc"))
(setq reply-to (mail-fetch-field "reply-to"))
(setq references (mail-fetch-field "references"))
- (setq message-id (mail-fetch-field "message-id")))
+ (setq message-id (mail-fetch-field "message-id"))
+ (widen))
(setq news-reply-yank-from (or from "(nobody)")))
(setq news-reply-yank-message-id
(or message-id "(unknown Message-ID)"))
["Add a directory group" gnus-group-make-directory-group t]
["Add the help group" gnus-group-make-help-group t]
["Add the archive group" gnus-group-make-archive-group t]
+ ["Make a doc group" gnus-group-make-doc-group t]
["Make a kiboze group" gnus-group-make-kiboze-group t]
["Make a virtual group" gnus-group-make-empty-virtual t]
["Add a group to a virtual" gnus-group-add-to-virtual t])
(defconst gnus-maintainer "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls & Boys)"
"The mail address of the Gnus maintainer.")
-(defconst gnus-version "(ding) Gnus v0.77"
+(defconst gnus-version "(ding) Gnus v0.78"
"Version number for this version of Gnus.")
(defvar gnus-info-nodes
;; from `message'.
(apply 'format args)))
+;; Generate a unique new group name.
+(defun gnus-generate-new-group-name (leaf)
+ (let ((name leaf)
+ (num 0))
+ (while (gnus-gethash name gnus-newsrc-hashtb)
+ (setq name (concat leaf "<" (int-to-string (setq num (1+ num))) ">")))
+ name))
+
;;; List and range functions
(defun gnus-last-element (list)
(define-key gnus-group-group-map "v" 'gnus-group-add-to-virtual)
(define-key gnus-group-group-map "V" 'gnus-group-make-empty-virtual)
(define-key gnus-group-group-map "D" 'gnus-group-enter-directory)
+ (define-key gnus-group-group-map "f" 'gnus-group-make-doc-group)
(define-prefix-command 'gnus-group-list-map)
(define-key gnus-group-mode-map "A" 'gnus-group-list-map)
(cons (current-buffer) 'summary)))))))
gnus-newsrc-hashtb)
(set-buffer gnus-group-buffer)
- (if activate (gnus-request-group group (nth 1 method)))
+ (or (gnus-server-opened method)
+ (gnus-open-server method)
+ (error "Unable to contact server: %s" (gnus-status-message method)))
+ (if activate (gnus-request-group group))
(condition-case ()
(gnus-group-read-group t t group)
(error nil)
(gnus-configure-windows 'server)
(gnus-server-prepare))
-(defun gnus-group-make-group (name method address)
+(defun gnus-group-make-group (name method &optional address)
"Add a new newsgroup.
The user will be prompted for a NAME, for a select METHOD, and an
ADDRESS."
(concat (file-name-as-directory (car path)) "doc.txt"))
(gnus-group-position-cursor)))
+(defun gnus-group-make-doc-group (file type)
+ "Create a group that uses a single file as the source."
+ (interactive
+ (list (read-file-name "File name: ")
+ (let ((err "")
+ found char)
+ (while (not found)
+ (message "%sFile type (mbox, babyl, digest) [mbd]: " err)
+ (setq found (cond ((= (setq char (read-char)) ?m) 'mbox)
+ ((= char ?b) 'babyl)
+ ((= char ?d) 'digest)
+ (t (setq mess "%c unknown. " char)
+ nil))))
+ found)))
+ (let* ((file (expand-file-name file))
+ (name (gnus-generate-new-group-name
+ (gnus-group-prefixed-name
+ (file-name-nondirectory file) '(nndoc "")))))
+ (gnus-group-make-group
+ (gnus-group-real-name name)
+ (list 'nndoc name
+ (list 'nndoc-address file)
+ (list 'nndoc-article-type type)))))
+
(defun gnus-group-make-archive-group ()
"Create the (ding) Gnus archive group."
(interactive)
(leaf (gnus-group-prefixed-name
(file-name-nondirectory (directory-file-name dir))
method))
- (name leaf)
+ (name (gnus-generate-new-group-name leaf))
(num 0))
- (while (gnus-gethash name gnus-newsrc-hashtb)
- (setq name (concat leaf "<" (int-to-string (setq num (1+ num))) ">")))
(let ((nneething-read-only t))
(or (gnus-group-read-ephemeral-group
name method t
(gnus-group-position-cursor)))
(defun gnus-browse-mode ()
- "Major mode for browsing a foreign server."
+ "Major mode for browsing a foreign server.
+
+All normal editing commands are switched off.
+
+\\<gnus-browse-mode-map>
+The only things you can do in this buffer is
+
+1) `\\[gnus-browse-unsubscribe-current-group]' to subscribe to a group.
+The group will be inserted into the group buffer upon exit from this
+buffer.
+
+2) `\\[gnus-browse-read-group]' to read a group ephemerally.
+
+3) `\\[gnus-browse-exit]' to return to the group buffer."
(interactive)
(kill-all-local-variables)
(if gnus-visual (gnus-browse-make-menu-bar))
(defun gnus-browse-select-group ()
"Select the current group."
+ (interactive)
(gnus-browse-read-group 'no))
(defun gnus-browse-next-group (n)
(defun gnus-browse-group-name ()
(save-excursion
+ (beginning-of-line)
(if (not (re-search-forward ": \\(.*\\)$" (gnus-point-at-eol) t))
()
(gnus-group-prefixed-name
(define-key gnus-summary-backend-map "w" 'gnus-summary-edit-article)
(define-key gnus-summary-backend-map "c" 'gnus-summary-copy-article)
(define-key gnus-summary-backend-map "q" 'gnus-summary-fancy-query)
+ (define-key gnus-summary-backend-map "i" 'gnus-summary-import-article)
(define-prefix-command 'gnus-summary-save-map)
nil
(gnus-nov-field)) ; misc
))
- (quit (progn
+ (error (progn
+ (ding)
+ (message "Strange nov line.")
(setq header nil)
(goto-char eol))))
;; Function written by Stainless Steel Rat <ratinox@ccs.neu.edu>.
(defun gnus-short-group-name (group &optional levels)
"Collapse GROUP name LEVELS."
- (let ((name "") (foreign "")
- (levels (or levels 2)))
+ (let* ((name "") (foreign "") (depth -1) (skip 1)
+ (levels (or levels
+ (progn
+ (while (string-match "\\." group skip)
+ (setq skip (match-end 0)
+ depth (+ depth 1)))
+ depth))))
(if (string-match ":" group)
(setq foreign (substring group 0 (match-end 0))
group (substring group (match-end 0))))
;; Do adaptive scoring, and possibly save score files.
(and gnus-newsgroup-adaptive
(gnus-score-adaptive))
- (and (fboundp 'gnus-score-save)
+ (and gnus-use-scoring
+ (fboundp 'gnus-score-save)
(funcall 'gnus-score-save))
;; Do not switch windows but change the buffer to work.
(set-buffer gnus-group-buffer)
(gnus-eval-in-buffer-window
gnus-article-buffer
(setq endp (gnus-article-next-page lines)))
- (gnus-summary-recenter)
(if endp
(cond (circular
(gnus-summary-beginning-of-article))
(lines
(gnus-message 3 "End of message"))
((null lines)
- (gnus-summary-next-unread-article)))))))
+ (gnus-summary-next-unread-article)))))
+ (gnus-configure-windows 'article)
+ (gnus-summary-recenter)
+ (gnus-summary-position-cursor)))
+
(defun gnus-summary-prev-page (lines)
"Show previous page of selected article.
(gnus-summary-recenter)
(gnus-eval-in-buffer-window gnus-article-buffer
(gnus-article-prev-page lines))))
+ (gnus-configure-windows 'article)
(gnus-summary-position-cursor))
(defun gnus-summary-scroll-up (lines)
(gnus-summary-stop-page-breaking)
(let ((name (format "%s-%d"
(gnus-group-prefixed-name
- gnus-newsgroup-name (list 'nndigest ""))
+ gnus-newsgroup-name (list 'nndoc ""))
gnus-current-article))
(buf (current-buffer)))
(if (gnus-group-read-ephemeral-group
- name (list 'nndigest gnus-article-buffer))
+ name (list 'nndoc name
+ (list 'nndoc-address (get-buffer gnus-article-buffer))
+ '(nndoc-article-type digest))
+ t)
()
(switch-to-buffer buf)
(gnus-set-global-variables)
(interactive)
(gnus-set-global-variables)
(gnus-summary-select-article)
- (gnus-eval-in-buffer-window gnus-article-buffer
- (isearch-forward)))
+ (gnus-eval-in-buffer-window
+ gnus-article-buffer (isearch-forward)))
(defun gnus-summary-search-article-forward (regexp)
"Search for an article containing REGEXP forward.
(setq articles (cdr articles)))
(kill-buffer copy-buf)))
+(defun gnus-summary-import-article (file)
+ "Import a random file into a mail newsgroup."
+ (interactive "fImport file: ")
+ (let ((group gnus-newsgroup-name)
+ attrib)
+ (or (gnus-check-backend-function 'request-accept-article group)
+ (error "%s does not support article importing" group))
+ (or (file-readable-p file)
+ (not (file-regular-p file))
+ (error "Can't read %s" file))
+ (save-excursion
+ (set-buffer (get-buffer-create " *import file*"))
+ (buffer-disable-undo (current-buffer))
+ (erase-buffer)
+ (insert-file-contents file)
+ (goto-char (point-min))
+ (setq attrib (file-attributes file))
+ (insert "From: " (read-string "From: ")))))
+
+
(defun gnus-summary-expire-articles ()
"Expire all articles that are marked as expirable in the current group."
(interactive)
;; loop...
(let* ((mod-hashtb (make-vector 7 0))
(m (intern "m" mod-hashtb))
- group max mod)
+ group max mod min)
(while (not (eobp))
(condition-case nil
(progn
(narrow-to-region (point) (gnus-point-at-eol))
(setq group (let ((obarray hashtb)) (read cur)))
- (setq max (read cur))
- (set group (cons (read cur) max))
+ (and (numberp (setq max (read cur)))
+ (numberp (setq min (read cur)))
+ (set group (cons min max)))
;; Enter moderated groups into a list.
(if (eq (let ((obarray mod-hashtb)) (read cur)) m)
(setq gnus-moderated-list
(forward-line 1)))
;; And if we do not care about moderation, we use this loop,
;; which is faster.
- (let (group max)
+ (let (group max min)
(while (not (eobp))
(condition-case ()
(progn
;; (what a hack!!)
(setq group (let ((obarray hashtb)) (read cur)))
(and (numberp (setq max (read cur)))
- (set group (cons (read cur) max))))
+ (numberp (setq min (read cur)))
+ (set group (cons min max))))
(error
(progn (ding)
- (gnus-message 3 "Illegal active: %s"
+ (gnus-message 3 "Warning - illegal active: %s"
(buffer-substring
(gnus-point-at-bol) (gnus-point-at-eol)))
nil)))
;;; Interface functions
-(defun nnbabyl-retrieqve-headers (sequence &optional newsgroup server)
+(defun nnbabyl-retrieve-headers (sequence &optional newsgroup server)
(save-excursion
(set-buffer nntp-server-buffer)
(erase-buffer)
+++ /dev/null
-;;; nndigest.el --- digest access for Gnus
-;; Copyright (C) 1995 Free Software Foundation, Inc.
-
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
-;; Keywords: news
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'nnheader)
-
-(eval-and-compile
- (autoload 'mail-send-and-exit "sendmail"))
-
-\f
-
-(defconst nndigest-version "nndigest 0.0"
- "nndigest version.")
-
-(defvar nndigest-current-buffer nil
- "Current digest "group" buffer.")
-
-(defvar nndigest-status-string "")
-
-(defvar nndigest-group-alist nil)
-
-(defvar nndigest-separator
- "^------------------------------[\n \t]*\n[^ ]+: ")
-
-(defvar nndigest-first-article-separator
- "^------------------------------*[\n \t]*\n[^ ]+: ")
-
-\f
-
-;;; Interface functions.
-
-(defun nndigest-retrieve-headers (sequence &optional newsgroup server)
- (save-excursion
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- (let ((file nil)
- (number (length sequence))
- (count 0)
- range
- beg article)
- (nndigest-possibly-change-buffer newsgroup)
- (if (stringp (car sequence))
- 'headers
- (while sequence
- (setq article (car sequence))
- (if (setq range (nndigest-narrow-to-article article))
- (progn
- (insert (format "221 %d Article retrieved.\n" article))
- (setq beg (point))
- (insert-buffer-substring nndigest-current-buffer
- (car range) (cdr range))
- (goto-char beg)
- (if (search-forward "\n\n" nil t)
- (forward-char -1)
- (goto-char (point-max))
- (insert "\n\n"))
- (insert (format "Lines: %d\n" (count-lines (point) (point-max))))
- (insert ".\n")
- (delete-region (point) (point-max))))
- (setq sequence (cdr sequence)))
-
- ;; Fold continuation lines.
- (goto-char (point-min))
- (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
- (replace-match " " t t))
- 'headers))))
-
-(defun nndigest-open-server (host &optional service)
- (setq nndigest-status-string "")
- (nnheader-init-server-buffer))
-
-(defun nndigest-close-server (&optional server)
- t)
-
-(defun nndigest-server-opened (&optional server)
- (and nntp-server-buffer
- (get-buffer nntp-server-buffer)))
-
-(defun nndigest-status-message ()
- nndigest-status-string)
-
-(defun nndigest-request-article (id &optional newsgroup server buffer)
- (nndigest-possibly-change-buffer newsgroup)
- (let ((range (nndigest-narrow-to-article id)))
- (and range
- (save-excursion
- (set-buffer (or buffer nntp-server-buffer))
- (erase-buffer)
- (insert-buffer-substring
- nndigest-current-buffer (car range) (cdr range))
- t))))
-
-(defun nndigest-request-group (group &optional server dont-check)
- (let ((entry (assoc group nndigest-group-alist)))
- (and entry (setq nndigest-group-alist (delq entry nndigest-group-alist))))
- (let ((buffer (get-buffer-create (concat " *nndigest " group "*"))))
- (setq nndigest-group-alist
- (cons (cons group buffer) nndigest-group-alist))
- (save-excursion
- (set-buffer buffer)
- (erase-buffer)
- (insert-buffer-substring server)))
- (nndigest-possibly-change-buffer group)
- (let ((num 0))
- (save-excursion
- (set-buffer nndigest-current-buffer)
- (widen)
- (goto-char (point-min))
- (if (re-search-forward nndigest-first-article-separator nil t)
- (setq num 1))
- (while (re-search-forward nndigest-separator nil t)
- (setq num (1+ num)))
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- (insert (format "211 %d %d %d %s\n" num 1 num group))
- t)))
-
-(defun nndigest-close-group (group &optional server)
- (nndigest-possibly-change-buffer group)
- (kill-buffer nndigest-current-buffer)
- (setq nndigest-group-alist (delq (assoc group nndigest-group-alist)
- nndigest-group-alist))
- (setq nndigest-current-buffer nil)
- t)
-
-(defun nndigest-request-list (&optional server)
- (save-excursion
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- t))
-
-(defun nndigest-request-newgroups (date &optional server)
- (save-excursion
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- t))
-
-(defun nndigest-request-list-newsgroups (&optional server)
- (save-excursion
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- t))
-
-(defun nndigest-request-post (&optional server)
- (mail-send-and-exit nil))
-
-(defalias 'nndigest-request-post-buffer 'nnmail-request-post-buffer)
-
-\f
-
-;;; Internal functions
-
-(defun nndigest-possibly-change-buffer (group)
- (and group
- (not (equal (cdr (assoc group nndigest-group-alist))
- nndigest-current-buffer))
- (setq nndigest-current-buffer
- (cdr (assoc group nndigest-group-alist)))))
-
-(defun nndigest-narrow-to-article (article)
- (save-excursion
- (set-buffer nndigest-current-buffer)
- (widen)
- (goto-char (point-min))
- (re-search-forward nndigest-first-article-separator nil t)
- (while (and (not (zerop (setq article (1- article))))
- (re-search-forward nndigest-separator nil t)))
- (if (zerop article)
- (progn
- (goto-char (match-end 0))
- (beginning-of-line)
- (narrow-to-region
- (point)
- (or (and (re-search-forward nndigest-separator nil t)
- (match-beginning 0))
- (and (re-search-forward "^------------------------------" nil t)
- (match-beginning 0))
- (point-max)))
- (cons (point-min) (point-max)))
- nil)))
-
-
-(provide 'nndigest)
-
-;;; nndigest.el ends here
(require 'rmail)
(require 'nnmail)
+(defvar nndoc-article-type 'mbox
+ "*Type of the file - one of `mbox', `babyl' or `digest'.")
+
+(defconst nndoc-type-to-regexp
+ (list (list 'mbox
+ (concat "^" rmail-unix-mail-delimiter)
+ (concat "^" rmail-unix-mail-delimiter)
+ nil "^$" nil)
+ (list 'babyl "\^_\^L *\n" "\^_" nil "^$" nil)
+ (list 'digest
+ "^------------------------------[\n \t]+"
+ "^------------------------------[\n \t]+"
+ nil "^$"
+ "^------------------------------*[\n \t]*\n[^ ]+: "))
+ "Regular expressions for articles of the various types.")
+
\f
+(defvar nndoc-article-begin nil)
+(defvar nndoc-article-end nil)
+(defvar nndoc-head-begin nil)
+(defvar nndoc-head-end nil)
+(defvar nndoc-first-article nil)
+
+(defvar nndoc-current-server nil)
+(defvar nndoc-server-alist nil)
+(defvar nndoc-server-variables
+ (list
+ (list 'nndoc-article-type nndoc-article-type)
+ '(nndoc-article-begin nil)
+ '(nndoc-article-end nil)
+ '(nndoc-head-begin nil)
+ '(nndoc-head-end nil)
+ '(nndoc-first-article nil)
+ '(nndoc-current-buffer nil)
+ '(nndoc-group-alist nil)
+ '(nndoc-address nil)))
+
(defconst nndoc-version "nndoc 0.1"
"nndoc version.")
(defvar nndoc-current-buffer nil
"Current nndoc news buffer.")
+(defvar nndoc-address nil)
+
+\f
+
(defvar nndoc-status-string "")
(defvar nndoc-group-alist nil)
;;; Interface functions
(defun nndoc-retrieve-headers (sequence &optional newsgroup server)
- "Retrieve the headers for the articles in SEQUENCE.
-Newsgroup must be selected before calling this function."
(save-excursion
(set-buffer nntp-server-buffer)
(erase-buffer)
- (let ((file nil)
- (number (length sequence))
- (count 0)
- beg article art-string start stop lines)
+ (let ((prev 1)
+ article p beg end lines)
(nndoc-possibly-change-buffer newsgroup server)
(if (stringp (car sequence))
'headers
+ (set-buffer nndoc-current-buffer)
+ (goto-char (point-min))
+ (re-search-forward nndoc-article-begin nil t)
+ (or (not nndoc-head-begin)
+ (re-search-forward nndoc-head-begin nil t))
+ (re-search-forward nndoc-head-end nil t)
(while sequence
(setq article (car sequence))
(set-buffer nndoc-current-buffer)
- (if (nndoc-search-for-article article)
- (progn
- (setq start
- (save-excursion
- (or
- (re-search-backward
- (concat "^" rmail-unix-mail-delimiter) nil t)
- (point-min))))
- (search-forward "\n\n" nil t)
- (setq lines (count-lines
- (point)
- (or
- (save-excursion
- (re-search-forward
- (concat "^" rmail-unix-mail-delimiter) nil t))
- (point-max))))
- (setq stop (1- (point)))
- (set-buffer nntp-server-buffer)
- (insert (format "221 %d Article retrieved.\n" article))
- (setq beg (point))
- (insert-buffer-substring nndoc-current-buffer start stop)
- (goto-char (point-max))
- (insert (format "Lines: %d\n" lines))
- (insert ".\n")))
- (setq sequence (cdr sequence)))
+ (if (not (nndoc-forward-article (- article prev)))
+ ()
+ (setq p (point))
+ (setq beg (or (re-search-backward nndoc-article-begin nil t)
+ (point-min)))
+ (goto-char p)
+ (setq lines (count-lines
+ (point)
+ (or
+ (and (re-search-forward nndoc-article-end nil t)
+ (goto-char (match-beginning 0)))
+ (goto-char (point-max)))))
+ (setq end (point))
+
+ (set-buffer nntp-server-buffer)
+ (insert (format "221 %d Article retrieved.\n" article))
+ (insert-buffer-substring nndoc-current-buffer beg end)
+ (goto-char (point-max))
+ (insert (format "Lines: %d\n" lines))
+ (insert ".\n"))
+
+ (setq prev article
+ sequence (cdr sequence)))
;; Fold continuation lines.
(goto-char (point-min))
(replace-match " " t t))
'headers))))
-(defun nndoc-open-server (host &optional service)
- "Open mbox backend."
- (setq nndoc-status-string "")
- (setq nndoc-group-alist nil)
- (nnheader-init-server-buffer))
+(defun nndoc-open-server (server &optional defs)
+ (nnheader-init-server-buffer)
+ (if (equal server nndoc-current-server)
+ t
+ (if nndoc-current-server
+ (setq nndoc-server-alist
+ (cons (list nndoc-current-server
+ (nnheader-save-variables nndoc-server-variables))
+ nndoc-server-alist)))
+ (let ((state (assoc server nndoc-server-alist)))
+ (if state
+ (progn
+ (nnheader-restore-variables (nth 1 state))
+ (setq nndoc-server-alist (delq state nndoc-server-alist)))
+ (nnheader-set-init-variables nndoc-server-variables defs)))
+ (setq nndoc-current-server server)
+ (let ((defs (cdr (assq nndoc-article-type nndoc-type-to-regexp))))
+ (setq nndoc-article-begin (nth 0 defs))
+ (setq nndoc-article-end (nth 1 defs))
+ (setq nndoc-head-begin (nth 2 defs))
+ (setq nndoc-head-end (nth 3 defs))
+ (setq nndoc-first-article (nth 4 defs)))
+ t))
(defun nndoc-close-server (&optional server)
- "Close news server."
t)
(defun nndoc-server-opened (&optional server)
- "Return server process status."
- (and nntp-server-buffer
- (get-buffer nntp-server-buffer)))
+ (and (equal server nndoc-current-server)
+ nntp-server-buffer
+ (buffer-name nntp-server-buffer)))
(defun nndoc-status-message (&optional server)
- "Return server status response as string."
nndoc-status-string)
(defun nndoc-request-article (article &optional newsgroup server buffer)
- "Select ARTICLE by number."
(nndoc-possibly-change-buffer newsgroup server)
- (if (stringp article)
- nil
- (save-excursion
- (set-buffer nndoc-current-buffer)
- (if (nndoc-search-for-article article)
- (let (start stop)
- (re-search-backward (concat "^" rmail-unix-mail-delimiter) nil t)
- (forward-line 1)
- (setq start (point))
- (or (and (re-search-forward
- (concat "^" rmail-unix-mail-delimiter) nil t)
- (forward-line -1))
- (goto-char (point-max)))
- (setq stop (point))
- (let ((nntp-server-buffer (or buffer nntp-server-buffer)))
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- (insert-buffer-substring nndoc-current-buffer start stop)
- t))))))
+ (save-excursion
+ (let ((buffer (or buffer nntp-server-buffer)))
+ (set-buffer buffer)
+ (erase-buffer)
+ (if (stringp article)
+ nil
+ (nndoc-narrow-to-article article)
+ (insert-buffer-substring nndoc-current-buffer)
+ t))))
(defun nndoc-request-group (group &optional server dont-check)
"Select news GROUP."
(save-excursion
(if (not (nndoc-possibly-change-buffer group server))
(progn
- (setq nndoc-status-string "No such file")
+ (setq nndoc-status-string "No such file or buffer")
nil)
(if dont-check
t
(progn
(nndoc-close-group group)
nil)
- (insert (format "211 %d %d %d %s\n"
- number 1 number group))
+ (insert (format "211 %d %d %d %s\n" number 1 number group))
t)))))))
(defun nndoc-close-group (group &optional server)
(defun nndoc-request-list-newsgroups (&optional server)
nil)
-(defun nndoc-request-post (&optional server)
- (mail-send-and-exit nil))
-
+(defalias 'nndoc-request-post 'nnmail-request-post)
(defalias 'nndoc-request-post-buffer 'nnmail-request-post-buffer)
\f
;;; Internal functions.
-(defun nndoc-possibly-change-buffer (group file)
+(defun nndoc-possibly-change-buffer (group source)
(let (buf)
- (or (and nndoc-current-buffer
- (eq nndoc-current-buffer
- (setq buf (cdr (assoc group nndoc-group-alist)))))
- (if buf
- (setq nndoc-current-buffer buf)
- (if (or (not (file-exists-p file))
- (file-directory-p file))
- ()
- (setq nndoc-group-alist
- (cons (cons group (setq nndoc-current-buffer
- (get-buffer-create
- (concat " *nndoc " group "*"))))
- nndoc-group-alist))
- (save-excursion
- (set-buffer nndoc-current-buffer)
- (buffer-disable-undo (current-buffer))
- (erase-buffer)
- (insert-file-contents file)
- t))))))
+ (cond
+ ;; The current buffer is this group's buffer.
+ ((and nndoc-current-buffer
+ (eq nndoc-current-buffer
+ (setq buf (cdr (assoc group nndoc-group-alist))))))
+ ;; We change buffers by taking an old from the group alist.
+ ;; `source' is either a string (a file name) or a buffer object.
+ (buf
+ (setq nndoc-current-buffer buf))
+ ;; It's a totally new group.
+ ((or (and (bufferp nndoc-address)
+ (buffer-name nndoc-address))
+ (and (stringp nndoc-address)
+ (file-exists-p nndoc-address)
+ (not (file-directory-p nndoc-address))))
+ (setq nndoc-group-alist
+ (cons (cons group (setq nndoc-current-buffer
+ (get-buffer-create
+ (concat " *nndoc " group "*"))))
+ nndoc-group-alist))
+ (save-excursion
+ (set-buffer nndoc-current-buffer)
+ (buffer-disable-undo (current-buffer))
+ (erase-buffer)
+ (if (stringp nndoc-address)
+ (insert-file-contents nndoc-address)
+ (save-excursion
+ (set-buffer nndoc-address)
+ (widen))
+ (insert-buffer-substring nndoc-address))
+ t)))))
+
+(defun nndoc-forward-article (n)
+ (while (and (> n 0)
+ (re-search-forward nndoc-article-begin nil t)
+ (or (not nndoc-head-begin)
+ (re-search-forward nndoc-head-begin nil t))
+ (re-search-forward nndoc-head-end nil t))
+ (setq n (1- n)))
+ (zerop n))
(defun nndoc-number-of-articles ()
(save-excursion
(set-buffer nndoc-current-buffer)
+ (widen)
(goto-char (point-min))
- (let ((num 0)
- (delim (concat "^" rmail-unix-mail-delimiter)))
- (while (re-search-forward delim nil t)
+ (let ((num 0))
+ (while (and (re-search-forward nndoc-article-begin nil t)
+ (or (not nndoc-head-begin)
+ (re-search-forward nndoc-head-begin nil t))
+ (re-search-forward nndoc-head-end nil t))
(setq num (1+ num)))
num)))
-(defun nndoc-search-for-article (article)
- (let ((obuf (current-buffer)))
+(defun nndoc-narrow-to-article (article)
+ (save-excursion
(set-buffer nndoc-current-buffer)
+ (widen)
(goto-char (point-min))
- (let ((delim (concat "^" rmail-unix-mail-delimiter)))
- (while (and (re-search-forward delim nil t)
- (not (zerop (setq article (1- article))))))
- (set-buffer obuf)
- (if (zerop article)
- (progn
- (forward-line 1)
- t)
- nil))))
+ (while (and (re-search-forward nndoc-article-begin nil t)
+ (not (zerop (setq article (1- article))))))
+ (if (not (zerop article))
+ ()
+ (narrow-to-region
+ (match-end 0)
+ (or (and (re-search-forward nndoc-article-end nil t)
+ (match-beginning 0))
+ (point-max)))
+ t)))
(provide 'nndoc)
;; not set in the first sweep.
(while defs
(if (not (assq (car (car defs)) server))
- (set (car (car defs)) (eval (nth 1 (car defs)))))
+ (set (car (car defs))
+ (if (and (symbolp (nth 1 (car defs)))
+ (not (boundp (nth 1 (car defs)))))
+ (nth 1 (car defs))
+ (eval (nth 1 (car defs))))))
(setq defs (cdr defs)))))
(defun nnheader-save-variables (server)
\f
+(defun nnmail-request-post (&optional server)
+ (mail-send-and-exit nil))
+
(defun nnmail-request-post-buffer (post group subject header article-buffer
info follow-to respect-poster)
(let ((method-address (cdr (assq 'to-address (nth 5 info))))
(progn (insert "X-") t))))
(setq do-search t)
(if (save-excursion
- (forward-char content-length)
+ (condition-case nil
+ (forward-char content-length)
+ (end-of-buffer nil))
(looking-at delim))
(progn
(forward-char content-length)
t))))
(defun nnmh-request-list (&optional server dir)
- (and server nnmh-get-new-mail (nnmh-get-new-mail))
(or dir
(save-excursion
(set-buffer nntp-server-buffer)
(> (nth 1 (file-attributes (file-chase-links dir))) 2)
(directory-files dir t nil t))))
(while dirs
- (if (and (not (string-match "/\\.\\.$" (car dirs)))
- (not (string-match "/\\.$" (car dirs)))
+ (if (and (not (string-match "/\\.\\.?$" (car dirs)))
(file-directory-p (car dirs))
(file-readable-p (car dirs)))
- (nnmh-request-list server (car dirs)))
+ (nnmh-request-list nil (car dirs)))
(setq dirs (cdr dirs))))
;; For each directory, generate an active file line.
(if (not (string= (expand-file-name nnmh-directory) dir))
(substring dir (match-end 0)) ?/ ?.))
(apply (function max) files)
(apply (function min) files)))))))
+ (setq nnmh-group-alist (nnmail-get-active))
+ (and server nnmh-get-new-mail (nnmh-get-new-mail))
t)
(defun nnmh-request-newgroups (date &optional server)
(if (or (not nnmh-get-new-mail) (not nnmail-spool-file))
()
;; We first activate all the groups.
- (if (or (not group) (not nnmh-group-alist))
- (progn
- (nnmh-request-list)
- (setq nnmh-group-alist (nnmail-get-active))))
+ (or nnmh-group-alist
+ (nnmh-request-list))
;; The we go through all the existing spool files and split the
;; mail from each.
(while spools
(defvar nnspool-inews-program news-inews-program
"Program to post news.")
-(defvar nnspool-inews-switches '("-S" "-h")
+(defvar nnspool-inews-switches '("-h")
"Switches for nnspool-request-post to pass to `inews' for posting news.")
(defvar nnspool-spool-directory news-path
(defun nnspool-request-post (&optional server)
"Post a new news in current buffer."
(save-excursion
- (let* ((inews-buffer (generate-new-buffer " *nnspool post*"))
+ (let* ((process-connection-type nil) ; t bugs out on Solaris
+ (inews-buffer (generate-new-buffer " *nnspool post*"))
(proc (apply 'start-process "*nnspool inews*" inews-buffer
nnspool-inews-program nnspool-inews-switches)))
(set-process-sentinel proc 'nnspool-inews-sentinel)