1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-27 10:54:40 +00:00
emacs/lisp/gnus/nnagent.el
Miles Bader 54506618c7 Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-628
Merge from gnus--rel--5.10

Patches applied:

 * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-55
   Update from CVS

2004-10-19  Katsumi Yamaoka  <yamaoka@jpl.org>

   * lisp/gnus/gnus-sum.el (gnus-update-summary-mark-positions): Search for
   dummy marks in the right way.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/nnagent.el (nnagent-request-type): Bind gnus-agent to nil to
   avoid infinite recursion via gnus-get-function.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/gnus-agent.el (gnus-agent-synchronize-group-flags): When
   necessary, pass full group name to gnus-request-set-marks.
   (gnus-agent-synchronize-group-flags): Added support for sync'ing
   tick marks.
   (gnus-agent-synchronize-flags-server): Be silent when writing file.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/gnus-agent.el (gnus-agent-synchronize-group-flags): Replaced
   gnus-request-update-info with explicit code to sync the in-memory
   info read flags with the marks being sync'd to the backend.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/gnus-agent.el (gnus-agent-possibly-synchronize-flags): Ignore
   servers that are offline.  Avoids having gnus-agent-toggle-plugged
   first ask if you want to open a server and then, even when you
   responded with no, asking if you want to synchronize the server's
   flags.
   (gnus-agent-synchronize-flags-server): Rewrote read loop to handle
   multi-line expressions.
   (gnus-agent-synchronize-group-flags): New internal function.
   Updates marks in memory (in the info structure) AND in the
   backend.
   (gnus-agent-check-overview-buffer): Fixed range of
   deletion to remove entire duplicate line.  Fixes merged article
   number bug.

   * lisp/gnus/gnus-util.el (gnus-remassoc): Fixed typo in documentation.

   * lisp/gnus/nnagent.el (nnagent-request-set-mark): Use
   gnus-agent-synchronize-group-flags, not backend's request-set-mark
   method, to ensure that synchronization updates marks in the
   backend and in the info (in memory) structure.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/gnus-agent.el (gnus-agent-synchronize-flags-server): Do nothing
   unless plugged.  Disable the agent so that an open failure causes
   an error.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Reiner Steib  <Reiner.Steib@gmx.de>

   * lisp/gnus/gnus-agent.el (gnus-agent-fetched-hook): Add :version.
   (gnus-agent-go-online): Change :version.
   (gnus-agent-expire-unagentized-dirs)
   (gnus-agent-auto-agentize-methods): Add :version.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/legacy-gnus-agent.el (gnus-agent-convert-to-compressed-agentview-prompt):
   New function. Used internally to only display 'gnus converting
   files' message when actually necessary.

   * lisp/gnus/gnus-sum.el (): Removed (require 'gnus-agent) as required
   methods now autoloaded.

   * lisp/gnus/gnus-int.el (gnus-request-move-article): Use
   gnus-agent-unfetch-articles in place of gnus-agent-expire to
   improve performance.

2004-10-18  Kevin Greiner  <kgreiner@compsol.cc>

   * lisp/gnus/gnus-agent.el (gnus-agent-cat-groups): rewrote avoiding defsetf
   to avoid run-time CL dependencies.
   (gnus-agent-unfetch-articles): New function.
   (gnus-agent-fetch-headers): Use gnus-agent-braid-nov to validate
   article numbers even when local .overview file is missing.
   (gnus-agent-read-article-number): New function. Only accepts
   27-bit article numbers.
   (gnus-agent-copy-nov-line, gnus-agent-uncached-articles): Use
   gnus-agent-read-article-number.
   (gnus-agent-braid-nov): Rewrote to validate article numbers coming
   from backend while recognizing that article numbers in .overview
   must be valid.

   * lisp/gnus/gnus-start.el (gnus-convert-old-newsrc): Changed message text as
   some users confused by references to .newsrc when they only have a
   .newsrc.eld file.
   (gnus-convert-mark-converter-prompt,
   gnus-convert-converter-needs-prompt): Fixed use of property list.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Katsumi Yamaoka  <yamaoka@jpl.org>

   * lisp/gnus/gnus-agent.el (gnus-agent-restore-gcc): Use ^ and regexp-quote.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Lars Magne Ingebrigtsen  <larsi@gnus.org>

   * lisp/gnus/gnus-start.el (gnus-get-unread-articles-in-group): Don't do
   stuff for non-living groups.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Lars Magne Ingebrigtsen  <larsi@gnus.org>

   * lisp/gnus/gnus-agent.el (gnus-agent-synchronize-flags): Default to nil.
   (gnus-agent-regenerate-group): Using nil messages aren't valid.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Lars Magne Ingebrigtsen  <larsi@gnus.org>

   * lisp/gnus/gnus-agent.el (gnus-agent-read-agentview): Inline
   gnus-uncompress-range.

2004-10-18  Kevin Greiner  <kgreiner@xpediantsolutions.com>

   * lisp/gnus/legacy-gnus-agent.el
   (gnus-agent-convert-to-compressed-agentview): Fixed typos with
   help from Florian Weimer <fw@deneb.enyo.de>

   * lisp/gnus/gnus-agent.el (gnus-agentize):
   gnus-agent-send-mail-real-function no longer set to current value
   of message-send-mail-function but rather a lambda that calls
   message-send-mail-function.  The change makes the agent real-time
   responsive to user changes to message-send-mail-function.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Reiner Steib  <Reiner.Steib@gmx.de>

   * lisp/gnus/gnus-start.el (gnus-get-unread-articles): Fix last commit.

2004-10-18  Kevin Greiner  <kgreiner@xpediantsolutions.com>

   * lisp/gnus/gnus-cache.el (gnus-cache-rename-group): New function.
   (gnus-cache-delete-group): New function.

   * lisp/gnus/gnus-agent.el (gnus-agent-rename-group): New function.
   (gnus-agent-delete-group): New function.
   (gnus-agent-save-group-info): Use gnus-command-method when
   `method' parameter is nil.  Don't write nil entries into the
   active file.
   (gnus-agent-get-group-info): New function.
   (gnus-agent-get-local): Added optional parameters to avoid calling
   gnus-group-real-name and gnus-find-method-for-group.
   (gnus-agent-set-local): Delete stored entry if either min, or max,
   are nil.
   (gnus-agent-fetch-session): Reworded error/quit messages.  On
   quit, use gnus-agent-regenerate-group to record existance of any
   articles fetched to disk before the quit occurred.

   * lisp/gnus/gnus-int.el (gnus-request-delete-group): Use
   gnus-cache-delete-group and gnus-agent-delete-group to keep the
   local disk in sync with the server.
   (gnus-request-rename-group): Use
   gnus-cache-rename-group and gnus-agent-rename-group to keep the
   local disk in sync with the server.

   * lisp/gnus/gnus-start.el (gnus-get-unread-articles): Cosmetic
   simplification to logic.

   * lisp/gnus/gnus-group.el (): (gnus-group-delete-group): No longer update
   gnus-cache-active-altered as gnus-request-delete-group now keeps
   the cache in sync.
   (gnus-group-list-active): Let the agent store a server's active
   list if currently plugged.

   * lisp/gnus/gnus-util.el (gnus-rename-file): New function.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Katsumi Yamaoka  <yamaoka@jpl.org>

   * lisp/gnus/gnus-agent.el (gnus-agent-regenerate-group): Activate the group
   when the group's active is not available.

2004-10-18  Kevin Greiner  <kevin.greiner@compsol.cc> for Katsumi Yamaoka  <yamaoka@jpl.org>

   * lisp/gnus/gnus-agent.el (gnus-agent-read-agentview): Add a missing arg to
   error.

2004-10-18  Kevin Greiner <kevin.greiner@compsol.cc>

   * lisp/gnus/gnus-start.el (gnus-convert-old-newsrc): Only write the
   conversion message to newsrc-dribble when an actual conversion is
   performed.

2004-10-18  Kevin Greiner <kevin.greiner@compsol.cc>

   * lisp/gnus/gnus-agent.el (gnus-agent-read-local): Bind
   nnheader-file-coding-system to gnus-agent-file-coding-system to
   avoid the implicit assumption that they will always be equal.
   (gnus-agent-save-local): Bind buffer-file-coding-system, not
   coding-system-for-write, as the with-temp-file macro first prints
   to a buffer then saves the buffer.

2004-10-18  Kevin Greiner <kgreiner@xpediantsolutions.com>

   * lisp/gnus/legacy-gnus-agent.el (): New. Provides converters that are only
   loaded when gnus-convert-old-newsrc needs to call them.

   * lisp/gnus/gnus-agent.el (gnus-agent-read-agentview): Removed support for
   old file versions.
   (gnus-group-prepare-hook): Removed function that converted list
   form of gnus-agent-expire-days to group properties.

   * lisp/gnus/gnus-start.el (gnus-convert-old-newsrc): Registered new
   converters to handle old agent file formats.  Added logic for a
   "backup before upgrading warning".
   (gnus-convert-mark-converter-prompt): Developers can mark
   functions as needing (default), or not needing,
   gnus-convert-old-newsrc's "backup before upgrading warning".
   (gnus-convert-converter-needs-prompt): Tests whether the user
   should be protected from potentially irreversable changes by the
   function.

2004-10-18  Kevin Greiner <kgreiner@xpediantsolutions.com>

   * lisp/gnus/gnus-int.el (gnus-request-accept-article): Inform the agent that
   articles are being added to a group.
   (gnus-request-replace-article): Inform the agent that articles
   need to be uncached as the cached contents are no longer valid.

   * lisp/gnus/gnus-agent.el (gnus-agent-file-header-cache): Removed.
   (gnus-agent-possibly-alter-active): Avoid null in numeric
   comparison.
   (gnus-agent-set-local): Refuse to save null in local object table.
   (gnus-agent-regenerate-group): The REREAD parameter can now be a
   list of articles that will be marked as unread.

2004-10-18  Kevin Greiner <kevin.greiner@compsol.cc>

   * lisp/gnus/gnus-range.el (gnus-sorted-range-intersection): Now accepts
   single-interval range of the form (min . max).  Previously the
   range had to look like ((min . max)).  Likewise, return
   (min . max) rather than ((min . max)).
   (gnus-range-map): Use gnus-range-normalize to accept
   single-interval range.

   * lisp/gnus/gnus-sum.el (gnus-summary-highlight-line): Articles stored in
   the cache, but not the agent, now appear with their usual face.

2004-10-18  Kevin Greiner <kevin.greiner@compsol.cc>

   * lisp/gnus/gnus-sum.el (gnus-adjust-marks): Now correctly handles a list of
   marks consisting of a single range {for example, (3 . 5)} rather
   than a list of a single range { ((3 . 5)) }.

2004-10-18  Kevin Greiner <kevin.greiner@compsol.cc>

   * lisp/gnus/gnus-sum.el (gnus-adjust-marks): Avoid splicing null INTO the
   uncompressed list.

2004-10-18  Kevin Greiner <kevin.greiner@compsol.cc>

   * lisp/gnus/gnus-draft.el (gnus-group-send-queue): Pass the group name
   "nndraft:queue" along to gnus-draft-send.  Use
   gnus-agent-prompt-send-queue.
   (gnus-draft-send): Rebind gnus-agent-queue-mail to nil when group
   is "nndraft:queue".  Suggested by Gaute Strokkenes
   <gs234@srcf.ucam.org>

   * lisp/gnus/gnus-group.el (gnus-group-catchup): Use new
   gnus-sequence-of-unread-articles, not
   gnus-list-of-unread-articles, to avoid exhausting memory with huge
   numbers of articles.  Use gnus-range-map to avoid having to
   uncompress the unread list.
   (gnus-group-archive-directory,
   gnus-group-recent-archive-directory): Fixed invalid ange-ftp
   reference.

   * lisp/gnus/gnus-range.el (gnus-range-map): Iterate over list or sequence.
   (gnus-sorted-range-intersection): Intersection of two ranges
   without requiring that they first be uncompressed.

   * lisp/gnus/gnus-start.el (gnus-activate-group): Unless blocked by the
   caller, possibly expand the active range to include both cached
   and agentized articles.
   (gnus-convert-old-newsrc): Rewrote in anticipation of having
   multiple version-dependent converters.
   (gnus-groups-to-gnus-format): Replaced gnus-agent-save-groups with
   gnus-agent-save-active.
   (gnus-save-newsrc-file): Save dirty agent range limits.

   * lisp/gnus/gnus-sum.el (gnus-select-newgroup): Replaced inline code with
   gnus-agent-possibly-alter-active.
   (gnus-adjust-marked-articles): Faster handling of simple lists

2004-10-18  David Edmondson  <dme@dme.org>

   * lisp/gnus/mm-view.el (mm-w3m-cid-retrieve-1): Don't use recursive call
   excessively.
2004-10-19 22:38:28 +00:00

257 lines
7.9 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; nnagent.el --- offline backend for Gnus
;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;;; Commentary:
;;; Code:
(require 'nnheader)
(require 'nnoo)
(eval-when-compile (require 'cl))
(require 'gnus-agent)
(require 'nnml)
(nnoo-declare nnagent
nnml)
(defconst nnagent-version "nnagent 1.0")
(defvoo nnagent-directory nil
"Internal variable."
nnml-directory)
(defvoo nnagent-active-file nil
"Internal variable."
nnml-active-file)
(defvoo nnagent-newsgroups-file nil
"Internal variable."
nnml-newsgroups-file)
(defvoo nnagent-get-new-mail nil
"Internal variable."
nnml-get-new-mail)
;;; Interface functions.
(nnoo-define-basics nnagent)
(defun nnagent-server (server)
(and server (format "%s+%s" (car gnus-command-method) server)))
(deffoo nnagent-open-server (server &optional defs)
(setq defs
`((nnagent-directory ,(gnus-agent-directory))
(nnagent-active-file ,(gnus-agent-lib-file "active"))
(nnagent-newsgroups-file ,(gnus-agent-lib-file "newsgroups"))
(nnagent-get-new-mail nil)))
(nnoo-change-server 'nnagent
(nnagent-server server)
defs)
(let ((dir (gnus-agent-directory))
err)
(cond
((not (condition-case arg
(file-exists-p dir)
(ftp-error (setq err (format "%s" arg)))))
(nnagent-close-server)
(nnheader-report
'nnagent (or err
(format "No such file or directory: %s" dir))))
((not (file-directory-p (file-truename dir)))
(nnagent-close-server)
(nnheader-report 'nnagent "Not a directory: %s" dir))
(t
(nnheader-report 'nnagent "Opened server %s using directory %s"
server dir)
t))))
(deffoo nnagent-retrieve-groups (groups &optional server)
(save-excursion
(cond
((file-exists-p (gnus-agent-lib-file "groups"))
(nnmail-find-file (gnus-agent-lib-file "groups"))
'groups)
((file-exists-p (gnus-agent-lib-file "active"))
(nnmail-find-file (gnus-agent-lib-file "active"))
'active)
(t nil))))
(defun nnagent-request-type (group article)
(unless (stringp article)
(let ((gnus-agent nil))
(if (not (gnus-check-backend-function
'request-type (car gnus-command-method)))
'unknown
(funcall (gnus-get-function gnus-command-method 'request-type)
(gnus-group-real-name group) article)))))
(deffoo nnagent-request-newgroups (date server)
nil)
(deffoo nnagent-request-update-info (group info &optional server)
nil)
(deffoo nnagent-request-post (&optional server)
(gnus-agent-insert-meta-information 'news gnus-command-method)
(gnus-request-accept-article "nndraft:queue" nil t t))
(deffoo nnagent-request-set-mark (group action server)
(with-temp-buffer
(insert "(gnus-agent-synchronize-group-flags \""
group
"\" '")
(gnus-pp action)
(insert " \""
(gnus-method-to-server gnus-command-method)
"\"")
(insert ")\n")
(append-to-file (point-min) (point-max) (gnus-agent-lib-file "flags")))
nil)
(deffoo nnagent-retrieve-headers (articles &optional group server fetch-old)
(let ((file (gnus-agent-article-name ".overview" group))
arts n first)
(save-excursion
(gnus-agent-load-alist group)
(setq arts (gnus-sorted-difference
articles (mapcar 'car gnus-agent-article-alist)))
;; Assume that articles with smaller numbers than the first one
;; Agent knows are gone.
(setq first (caar gnus-agent-article-alist))
(when first
(while (and arts (< (car arts) first))
(pop arts)))
(set-buffer nntp-server-buffer)
(erase-buffer)
(nnheader-insert-nov-file file (car articles))
(goto-char (point-min))
(gnus-parse-without-error
(while (and arts (not (eobp)))
(setq n (read (current-buffer)))
(when (> n (car arts))
(beginning-of-line))
(while (and arts (> n (car arts)))
(insert (format
"%d\t[Undownloaded article %d]\tGnus Agent\t\t\t\n"
(car arts) (car arts)))
(pop arts))
(when (and arts (= n (car arts)))
(pop arts))
(forward-line 1)))
(while arts
(insert (format
"%d\t[Undownloaded article %d]\tGnus Agent\t\t\t\n"
(car arts) (car arts)))
(pop arts))
(if (and fetch-old
(not (numberp fetch-old)))
t ; Don't remove anything.
(nnheader-nov-delete-outside-range
(if fetch-old (max 1 (- (car articles) fetch-old))
(car articles))
(car (last articles)))
t)
'nov)))
(deffoo nnagent-request-expire-articles (articles group &optional server force)
articles)
(deffoo nnagent-request-group (group &optional server dont-check)
(nnoo-parent-function 'nnagent 'nnml-request-group
(list group (nnagent-server server) dont-check)))
(deffoo nnagent-close-group (group &optional server)
(nnoo-parent-function 'nnagent 'nnml-close-group
(list group (nnagent-server server))))
(deffoo nnagent-request-accept-article (group &optional server last)
(nnoo-parent-function 'nnagent 'nnml-request-accept-article
(list group (nnagent-server server) last)))
(deffoo nnagent-request-article (id &optional group server buffer)
(nnoo-parent-function 'nnagent 'nnml-request-article
(list id group (nnagent-server server) buffer)))
(deffoo nnagent-request-create-group (group &optional server args)
(nnoo-parent-function 'nnagent 'nnml-request-create-group
(list group (nnagent-server server) args)))
(deffoo nnagent-request-delete-group (group &optional force server)
(nnoo-parent-function 'nnagent 'nnml-request-delete-group
(list group force (nnagent-server server))))
(deffoo nnagent-request-list (&optional server)
(nnoo-parent-function 'nnagent 'nnml-request-list
(list (nnagent-server server))))
(deffoo nnagent-request-list-newsgroups (&optional server)
(nnoo-parent-function 'nnagent 'nnml-request-list-newsgroups
(list (nnagent-server server))))
(deffoo nnagent-request-move-article
(article group server accept-form &optional last)
(nnoo-parent-function 'nnagent 'nnml-request-move-article
(list article group (nnagent-server server)
accept-form last)))
(deffoo nnagent-request-rename-group (group new-name &optional server)
(nnoo-parent-function 'nnagent 'nnml-request-rename-group
(list group new-name (nnagent-server server))))
(deffoo nnagent-request-scan (&optional group server)
(nnoo-parent-function 'nnagent 'nnml-request-scan
(list group (nnagent-server server))))
(deffoo nnagent-set-status (article name value &optional group server)
(nnoo-parent-function 'nnagent 'nnml-set-status
(list article name value group (nnagent-server server))))
(deffoo nnagent-server-opened (&optional server)
(nnoo-parent-function 'nnagent 'nnml-server-opened
(list (nnagent-server server))))
(deffoo nnagent-status-message (&optional server)
(nnoo-parent-function 'nnagent 'nnml-status-message
(list (nnagent-server server))))
(deffoo nnagent-request-regenerate (server)
(nnoo-parent-function 'nnagent 'nnml-request-regenerate
(list (nnagent-server server))))
;; Use nnml functions for just about everything.
(nnoo-import nnagent
(nnml))
;;; Internal functions.
(provide 'nnagent)
;;; arch-tag: af710b77-f816-4969-af31-6fd94fb42245
;;; nnagent.el ends here