changeset 92694:d3767aa9ae49

Merge from gnus--devo--0 Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1097
author Miles Bader <miles@gnu.org>
date Mon, 10 Mar 2008 00:50:22 +0000
parents 2a2d2de297db
children 59b897c894c7
files doc/misc/ChangeLog doc/misc/gnus-coding.texi lisp/gnus/ChangeLog lisp/gnus/auth-source.el lisp/gnus/gnus-art.el lisp/gnus/gnus-bookmark.el lisp/gnus/gnus-group.el lisp/gnus/gnus-registry.el lisp/gnus/gnus-sum.el lisp/gnus/message.el lisp/gnus/mm-decode.el lisp/gnus/mm-view.el lisp/gnus/mml.el lisp/gnus/mml2015.el lisp/net/imap.el lisp/net/netrc.el
diffstat 16 files changed, 511 insertions(+), 141 deletions(-) [+]
line wrap: on
line diff
--- a/doc/misc/ChangeLog	Mon Mar 10 00:50:06 2008 +0000
+++ b/doc/misc/ChangeLog	Mon Mar 10 00:50:22 2008 +0000
@@ -1,3 +1,8 @@
+2008-03-10  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-coding.texi (Gnus Maintainance Guide): Update conventions for
+	custom versions.
+
 2008-03-07  Alan Mackenzie  <acm@muc.de>
 
 	* cc-mode.texi (Limitations and Known Bugs): State that the number of
--- a/doc/misc/gnus-coding.texi	Mon Mar 10 00:50:06 2008 +0000
+++ b/doc/misc/gnus-coding.texi	Mon Mar 10 00:50:22 2008 +0000
@@ -256,7 +256,7 @@
 feature period of several months.  After the release of Gnus 5.10.6 the
 development of new features started again on the trunk while the 5.10
 series is continued on the stable branch (v5-10) from which more stable
-releases will be done when needed (5.10.7, @dots{}).
+releases will be done when needed (5.10.8, @dots{}).
 @ref{Gnus Development, ,Gnus Development, gnus, The Gnus Newsreader}
 
 Stable releases of Gnus finally become part of Emacs.  E.g. Gnus 5.8
@@ -366,7 +366,7 @@
 comment) or e.g. @code{:version "22.2" ;; Gnus 5.10.10} if the feature
 was added for Emacs 22.2 and Gnus 5.10.10.
 @c
-If the variable is new in No Gnus use @code{:version "23.0" ;; No Gnus}.
+If the variable is new in No Gnus use @code{:version "23.1" ;; No Gnus}.
 
 The same applies for customizable variables when its default value was
 changed.
--- a/lisp/gnus/ChangeLog	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/ChangeLog	Mon Mar 10 00:50:22 2008 +0000
@@ -1,13 +1,40 @@
+2008-03-07  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-art.el (gnus-narrow-to-page): Position point properly.
+	(gnus-article-goto-prev-page): Work for articles having ^L's.
+
+	* gnus-sum.el (gnus-summary-end-of-article): Remove needless narrowing.
+
+	* mm-view.el (mm-w3m-standalone-supports-m17n-p): Fix typo.
+
 2008-03-07  Karl Fogel  <kfogel@red-bean.com>
 
 	* gnus-bookmark.el: Adjust for renames in bookmark.el.
 	(gnus-bookmark-make-record): Was `gnus-bookmark-make-cell'.
 	(gnus-bookmark-jump): Adjust some variable names.
 
-2008-03-05  Reiner Steib  <Reiner.Steib@gmx.de>
-
-	* gnus-sum.el (gnus-print-buffer): Honor ps-print-color-p.
-	Suggested by <chris.anderton@zetnet.co.uk>.
+2008-03-06  Teodor Zlatanov  <tzz@lifelogs.com>
+
+	* auth-source.el: New package.
+	(auth-source-choices): Add customization entry point variable.
+
+	* gnus-registry.el (gnus-registry-user-format-function-M): Fix concat
+	bug.
+
+2008-03-05  Teodor Zlatanov  <tzz@lifelogs.com>
+
+	* gnus-registry.el (gnus-registry-install): Allow 'ask as an option.
+	(gnus-registry-initialize, gnus-registry-install-p): Use it.
+	(gnus-registry-install-shortcuts): Renamed from
+	gnus-registry-install-shortcuts-and-menus.  Installs the shortcuts in
+	the `gnus-registry-mark-map' keymap dynamically from
+	`gnus-registry-marks'.  The generated functions update the summary line
+	when a registry mark is added or deleted, and will call
+	`gnus-registry-install-p' (see the comments in the code).
+	(gnus-registry-user-format-function-M): Use concat intelligently.
+
+	* gnus-sum.el (gnus-summary-make-menu-bar): Add menu entries for all
+	the registry mark functions.
 
 2008-03-05  Glenn Morris  <rgm@gnu.org>
 
@@ -16,12 +43,34 @@
 	gnus-art.
 	(top-level): No need to load own source when compiling.
 
+2008-03-04  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-sum.el (gnus-print-buffer): Honor ps-print-color-p.
+	Suggested by <chris.anderton@zetnet.co.uk>.
+
 2008-03-04  Glenn Morris  <rgm@gnu.org>
 
 	* gnus-sum.el (top-level): No need to require gnus when compiling,
 	since unconditionally required near start of file.
 	(gnus-summary-display-while-building): Move definition before use.
 
+2008-03-04  Teodor Zlatanov  <tzz@lifelogs.com>
+
+	* gnus-registry.el (gnus-registry-user-format-function-M): Add
+	formatting function.
+
+2008-03-03  Teodor Zlatanov  <tzz@lifelogs.com>
+
+	* gnus-registry.el (gnus-registry-marks): Changed format to be nicer
+	with plists.
+	(gnus-registry-do-marks, gnus-registry-install-shortcuts-and-menus):
+	Use new format.
+
+2008-03-03  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-art.el (gnus-article-describe-bindings): Work for the version of
+	`where-is-internal' that returns a range of key sequences.
+
 2008-03-03  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* mm-bodies.el (mm-decode-content-transfer-encoding): Simplify.
@@ -36,6 +85,31 @@
 	* gnus-group.el (gnus-update-group-mark-positions):
 	Use mm-string-to-multibyte.
 
+2008-03-02  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* mml2015.el (mml2015-extract-cleartext-signature): Explain that it
+	doesn't handle NotDashEscaped.
+
+	* mml.el (mml-menu): Improve help entries.  Move Sign/Encrypt Part.
+	(mml-dnd-attach-options): Fix typo in custom choice.
+
+	* gnus-group.el (gnus-group-read-ephemeral-gmane-group): Change
+	nndoc-article-type to mbox.
+	(gnus-group-read-ephemeral-gmane-group-url): Support permalink.
+
+	* mm-decode.el (mm-text-html-renderer): Prefer w3m over w3.  Fall back
+	to nil, instead of html2text.
+
+	* imap.el (imap-debug): Add `imap-ping-server'.
+
+	* gnus-bookmark.el: Add FIXMEs.
+
+	* message.el (message-form-letter-separator)
+	(message-send-form-letter-delay): New variables.
+	(message-send-form-letter): Use them.  New command to send form
+	letters.  Requested by Uwe Siart.
+	(message-send-mail-function): Doc fix.  Add "Other" custom option.
+
 2008-02-29  Andreas Seltenreich  <andreas@gate450.dyndns.org>
 
 	* nnweb.el (nnweb-google-parse-1): Fix date parsing on articles with
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/gnus/auth-source.el	Mon Mar 10 00:50:22 2008 +0000
@@ -0,0 +1,86 @@
+;;; auth-source.el --- authentication sources for Gnus and Emacs
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+;; Author: Ted Zlatanov <tzz@lifelogs.com>
+;; 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 3, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This is the auth-source.el package.  It lets users tell Gnus how to
+;; authenticate in a single place.  Simplicity is the goal.  Instead
+;; of providing 5000 options, we'll stick to simple, easy to
+;; understand options.
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defgroup auth-source nil
+  "Authentication sources."
+  :version "22.1"
+  :group 'gnus)
+
+(defcustom auth-source-choices nil
+  "List of authentication sources.
+
+Each entry is the authentication type with optional properties."
+  :group 'auth-source
+  :type '(repeat :tag "Authentication Sources"
+		 (cons :tag "Source definition"
+		       (group :tag "Select a source" :inline t
+			      (const :format "" :value :source)
+			      (choice :tag "Authentication information"
+				      (const :tag "None" nil)
+				      (file :tag "File")))
+		       (checklist :tag "Options" :greedy t
+				  (group :inline t
+					 (choice :tag "Choose the hosts"
+					  (group :tag "Select host by name" :inline t
+						 (const :format "" :value :host)
+						 (string :tag "Host name"))
+					  (group :tag "Select host by regular expression" :inline t
+						 (const :format "" :value :host-regex)
+						 (regexp :tag "Host regular expression"))
+					  (group :tag "Use any host" :inline t
+						 (const :format "" :value :host-any)
+						 (const :tag "Any" t))
+					  (group :tag "Use if no other host matches" :inline t
+						 (const :tag "Fallback" nil))))
+				  (group :tag "Choose the protocol" :inline t
+					 (const :format "" :value :protocol)
+					 (choice :tag "Protocol"
+						 (const :tag "Any" t)
+						 (const :tag "Fallback (used if no others match)" nil)
+						 (const :tag "IMAP" imap)
+						 (const :tag "POP3" pop3)
+						 (const :tag "SSH"  ssh)
+						 (const :tag "SFTP" sftp)
+						 (const :tag "SMTP" smtp)))))))
+
+;; temp for debugging
+;; (customize-variable 'auth-source-choices)
+;; (setq auth-source-choices nil)
+;; (format "%S" auth-source-choices)
+
+(provide 'auth-source)
+
+;; arch-tag: ff1afe78-06e9-42c2-b693-e9f922cbe4ab
+;;; auth-source.el ends here
--- a/lisp/gnus/gnus-art.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/gnus-art.el	Mon Mar 10 00:50:22 2008 +0000
@@ -5988,39 +5988,51 @@
   (interactive "P")
   (setq arg (if arg (prefix-numeric-value arg) 0))
   (with-current-buffer gnus-article-buffer
-    (goto-char (point-min))
     (widen)
     ;; Remove any old next/prev buttons.
     (when (gnus-visual-p 'page-marker)
       (let ((inhibit-read-only t))
 	(gnus-remove-text-with-property 'gnus-prev)
 	(gnus-remove-text-with-property 'gnus-next)))
-    (if
-	(cond ((< arg 0)
-	       (re-search-backward page-delimiter nil 'move (1+ (abs arg))))
-	      ((> arg 0)
-	       (re-search-forward page-delimiter nil 'move arg)))
-	(goto-char (match-end 0))
-      (save-excursion
-	(goto-char (point-min))
-	(setq gnus-page-broken
-	      (and (re-search-forward page-delimiter nil t) t))))
-    (when gnus-page-broken
-      (narrow-to-region
-       (point)
-       (if (re-search-forward page-delimiter nil 'move)
-	   (match-beginning 0)
-	 (point)))
-      (when (and (gnus-visual-p 'page-marker)
-		 (> (point-min) (save-restriction (widen) (point-min))))
-	(save-excursion
-	  (goto-char (point-min))
-	  (gnus-insert-prev-page-button)))
-      (when (and (gnus-visual-p 'page-marker)
-		 (< (point-max) (save-restriction (widen) (point-max))))
-	(save-excursion
-	  (goto-char (point-max))
-	  (gnus-insert-next-page-button))))))
+    (let (st nd pt)
+      (when (save-excursion
+	      (cond ((< arg 0)
+		     (if (re-search-backward page-delimiter nil 'move (abs arg))
+			 (prog1
+			     (setq nd (match-beginning 0)
+				   pt nd)
+			   (when (re-search-backward page-delimiter nil t)
+			     (setq st (match-end 0))))
+		       (when (re-search-forward page-delimiter nil t)
+			 (setq nd (match-beginning 0)
+			       pt (point-min)))))
+		    ((> arg 0)
+		     (if (re-search-forward page-delimiter nil 'move arg)
+			 (prog1
+			     (setq st (match-end 0)
+				   pt st)
+			   (when (re-search-forward page-delimiter nil t)
+			     (setq nd (match-beginning 0))))
+		       (when (re-search-backward page-delimiter nil t)
+			 (setq st (match-end 0)
+			       pt (point-max)))))
+		    (t
+		     (when (re-search-backward page-delimiter nil t)
+		       (goto-char (setq st (match-end 0))))
+		     (when (re-search-forward page-delimiter nil t)
+		       (setq nd (match-beginning 0)))
+		     (or st nd))))
+	(setq gnus-page-broken t)
+	(when pt (goto-char pt))
+	(narrow-to-region (or st (point-min)) (or nd (point-max)))
+	(when (gnus-visual-p 'page-marker)
+	  (save-excursion
+	    (when nd
+	      (goto-char nd)
+	      (gnus-insert-next-page-button))
+	    (when st
+	      (goto-char st)
+	      (gnus-insert-prev-page-button))))))))
 
 ;; Article mode commands
 
@@ -6035,7 +6047,7 @@
 (defun gnus-article-goto-prev-page ()
   "Show the previous page of the article."
   (interactive)
-  (if (bobp)
+  (if (save-restriction (widen) (bobp)) ;; Real beginning-of-buffer?
       (gnus-article-read-summary-keys nil (gnus-character-to-event ?p))
     (gnus-article-prev-page nil)))
 
@@ -6395,10 +6407,21 @@
     (define-key map [t] nil)
     (with-current-buffer gnus-article-current-summary
       (set-keymap-parent map (key-binding "S"))
-      (let (def gnus-pick-mode)
-	(dolist (key sumkeys)
-	  (when (setq def (key-binding key))
-	    (define-key keymap key def))))
+      (let (key def gnus-pick-mode)
+	(while sumkeys
+	  (setq key (pop sumkeys))
+	  (cond ((and (vectorp key) (= (length key) 1)
+		      (consp (setq def (aref key 0)))
+		      (numberp (car def)) (numberp (cdr def)))
+		 (when (< (max (car def) (cdr def)) 128)
+		   (setq sumkeys
+			 (append (mapcar
+				  #'vector
+				  (nreverse (gnus-uncompress-range def)))
+				 sumkeys))))
+		((setq def (key-binding key))
+		 (unless (eq def 'undefined)
+		   (define-key keymap key def))))))
       (when (boundp 'gnus-agent-summary-mode)
 	(setq agent gnus-agent-summary-mode))
       (when (boundp 'gnus-draft-mode)
--- a/lisp/gnus/gnus-bookmark.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/gnus-bookmark.el	Mon Mar 10 00:50:22 2008 +0000
@@ -62,6 +62,14 @@
 ;; (define-key global-map "\C-crj" 'gnus-bookmark-jump)
 ;; (define-key global-map "\C-crl" 'gnus-bookmark-bmenu-list)
 
+;; FIXME: Add keybindings, see
+;; http://thread.gmane.org/gmane.emacs.gnus.general/63101/focus=63379
+;; http://thread.gmane.org/v9fxx9fkm4.fsf@marauder.physik.uni-ulm.de
+
+;; FIXME: Check if `gnus-bookmark.el' should use
+;; `bookmark-make-cell-function'.
+;; Cf. http://article.gmane.org/gmane.emacs.gnus.general/66076
+
 (defgroup gnus-bookmark nil
   "Setting, annotation and jumping to Gnus bookmarks."
   :group 'gnus)
--- a/lisp/gnus/gnus-group.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/gnus-group.el	Mon Mar 10 00:50:22 2008 +0000
@@ -2363,7 +2363,7 @@
       (gnus-group-read-ephemeral-group
        (format "%s.start-%s.range-%s" group start range)
        `(nndoc ,tmpfile
-	       (nndoc-article-type guess))))
+	       (nndoc-article-type mbox))))
     (delete-file tmpfile)))
 
 (defun gnus-group-read-ephemeral-gmane-group-url (url)
@@ -2397,7 +2397,7 @@
      ;; URLs providing `group' and `start':
      ((or (string-match
 	   ;; http://article.gmane.org/gmane.comp.gnu.make.bugs/3584
-	   "^http://\\(?:thread\\|article\\)\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)"
+	   "^http://\\(?:thread\\|article\\|permalink\\)\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)"
 	   url)
 	  (string-match
 	   ;; Don't advertize these in the doc string yet:
--- a/lisp/gnus/gnus-registry.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/gnus-registry.el	Mon Mar 10 00:50:22 2008 +0000
@@ -80,20 +80,20 @@
 
 (defcustom gnus-registry-marks
   '((Important
-     (char . ?i)
-     (image . "summary_important"))
+     :char ?i
+     :image "summary_important")
     (Work
-     (char . ?w)
-     (image . "summary_work"))
+     :char ?w
+     :image "summary_work")
     (Personal
-     (char . ?p)
-     (image . "summary_personal"))
+     :char ?p
+     :image "summary_personal")
     (To-Do
-     (char . ?t)
-     (image . "summary_todo"))
+     :char ?t
+     :image "summary_todo")
     (Later
-     (char . ?l)
-     (image . "summary_later")))
+     :char ?l
+     :image "summary_later"))
 
   "List of registry marks and their options.
 
@@ -106,14 +106,16 @@
 Each entry must have an image string to be useful for visual
 display."
   :group 'gnus-registry
-  :type '(alist :key-type symbol
-		:value-type (set :tag "Mark details"
-				  (cons :tag "Shortcut" 
-					(const :tag "Character code" char)
-					character)
-				  (cons :tag "Visual" 
-					(const :tag "Image" image) 
-					string))))
+  :type '(repeat :tag "Registry Marks"
+		 (cons :tag "Mark"
+		       (symbol :tag "Name")
+		       (checklist :tag "Options" :greedy t
+				  (group :inline t
+					 (const :format "" :value :char)
+					 (character :tag "Character code"))
+				  (group :inline t
+					 (const :format "" :value :image)
+					 (string :tag "Image"))))))
 
 (defcustom gnus-registry-default-mark 'To-Do
   "The default mark.  Should be a valid key for `gnus-registry-marks'."
@@ -130,10 +132,12 @@
   :group 'gnus-registry
   :type '(repeat regexp))
 
-(defcustom gnus-registry-install nil
+(defcustom gnus-registry-install 'ask
   "Whether the registry should be installed."
   :group 'gnus-registry
-  :type 'boolean)
+  :type '(choice (const :tag "Never Install" nil)
+		 (const :tag "Always Install" t)
+		 (const :tag "Ask Me" ask)))
 
 (defcustom gnus-registry-clean-empty t
   "Whether the empty registry entries should be deleted.
@@ -700,24 +704,22 @@
 
 FUNCTION should take two parameters, a mark symbol and the cell value."
   (dolist (mark-info gnus-registry-marks)
-    (let ((mark (car-safe mark-info))
-	  (data (cdr-safe mark-info)))
-      (dolist (cell data)
-	(let ((cell-type (car-safe cell))
-	      (cell-data (cdr-safe cell)))
-	  (when (equal type cell-type)
-	    (funcall function mark cell-data)))))))
+    (let* ((mark (car-safe mark-info))
+	   (data (cdr-safe mark-info))
+	   (cell-data (plist-get data type)))
+      (when cell-data
+	(funcall function mark cell-data)))))
 
 ;;; this is ugly code, but I don't know how to do it better
-;;; TODO: clear the gnus-registry-mark-map before running
-(defun gnus-registry-install-shortcuts-and-menus ()
+(defun gnus-registry-install-shortcuts ()
   "Install the keyboard shortcuts and menus for the registry.
 Uses `gnus-registry-marks' to find what shortcuts to install."
-  (gnus-registry-do-marks 
-   'char
-   (lambda (mark data)
-     (let ((function-format
-	    (format "gnus-registry-%%s-article-%s-mark" mark)))
+  (let (keys-plist)
+    (gnus-registry-do-marks 
+     :char
+     (lambda (mark data)
+       (let ((function-format
+	      (format "gnus-registry-%%s-article-%s-mark" mark)))
 
 ;;; The following generates these functions:
 ;;; (defun gnus-registry-set-article-Important-mark (&rest articles)
@@ -729,44 +731,69 @@
 ;;;   (interactive (gnus-summary-work-articles current-prefix-arg))
 ;;;   (gnus-registry-set-article-mark-internal 'Important articles t t))
 
-       (dolist (remove '(t nil))
-	 (let* ((variant-name (if remove "remove" "set"))
-		(function-name (format function-format variant-name))
-		(shortcut (format "%c" data))
-		(shortcut (if remove (upcase shortcut) shortcut)))
-	   (unintern function-name)
-	   (eval
-	    `(defun 
-	       ;; function name
-	       ,(intern function-name) 
-	       ;; parameter definition
-	       (&rest articles)
-	       ;; documentation
-	       ,(format 
-		 "%s the %s mark over process-marked ARTICLES."
-		 (upcase-initials variant-name)
-		 mark)
-	       ;; interactive definition
-	       (interactive 
-		(gnus-summary-work-articles current-prefix-arg))
-	       ;; actual code
-	       (gnus-registry-set-article-mark-internal 
-		;; all this just to get the mark, I must be doing it wrong
-		(intern ,(symbol-name mark))
-		articles ,remove t))))))))
-  ;; I don't know how to do this inside the loop above, because
-  ;; gnus-define-keys is a macro
-  (gnus-define-keys (gnus-registry-mark-map "M" gnus-summary-mark-map)
-    "i" gnus-registry-set-article-Important-mark
-    "I" gnus-registry-remove-article-Important-mark
-    "w" gnus-registry-set-article-Work-mark
-    "W" gnus-registry-remove-article-Work-mark
-    "l" gnus-registry-set-article-Later-mark
-    "L" gnus-registry-remove-article-Later-mark
-    "p" gnus-registry-set-article-Personal-mark
-    "P" gnus-registry-remove-article-Personal-mark
-    "t" gnus-registry-set-article-To-Do-mark
-    "T" gnus-registry-remove-article-To-Do-mark))
+	 (dolist (remove '(t nil))
+	   (let* ((variant-name (if remove "remove" "set"))
+		  (function-name (format function-format variant-name))
+		  (shortcut (format "%c" data))
+		  (shortcut (if remove (upcase shortcut) shortcut)))
+	     (unintern function-name)
+	     (eval
+	      `(defun 
+		 ;; function name
+		 ,(intern function-name) 
+		 ;; parameter definition
+		 (&rest articles)
+		 ;; documentation
+		 ,(format 
+		   "%s the %s mark over process-marked ARTICLES."
+		   (upcase-initials variant-name)
+		   mark)
+		 ;; interactive definition
+		 (interactive 
+		  (gnus-summary-work-articles current-prefix-arg))
+		 ;; actual code
+
+		 ;; if this is called and the user doesn't want the
+		 ;; registry enabled, we'll ask anyhow
+		 (when (eq gnus-registry-install nil)
+		   (setq gnus-registry-install 'ask))
+
+		 ;; now the user is asked if gnus-registry-install is 'ask
+		 (when (gnus-registry-install-p)
+		   (gnus-registry-set-article-mark-internal 
+		    ;; all this just to get the mark, I must be doing it wrong
+		    (intern ,(symbol-name mark))
+		    articles ,remove t)
+		   (dolist (article articles)
+		     (gnus-summary-update-article 
+		      article 
+		      (assoc article (gnus-data-list nil)))))))
+	     (push (intern function-name) keys-plist)
+	     (push shortcut keys-plist)
+	     (gnus-message 
+	      9 
+	      "Defined mark handling function %s" 
+	      function-name))))))
+    (gnus-define-keys-1
+     '(gnus-registry-mark-map "M" gnus-summary-mark-map) 
+     keys-plist)))
+
+;;; use like this:
+;;; (defalias 'gnus-user-format-function-M 
+;;;           'gnus-registry-user-format-function-M)
+(defun gnus-registry-user-format-function-M (headers)
+  (let* ((id (mail-header-message-id headers))
+	 (marks (when id (gnus-registry-fetch-extra-marks id))))
+    (apply 'concat (mapcar (lambda(mark)
+			     (let ((c 
+				    (plist-get
+				     (cdr-safe 
+				      (assoc mark gnus-registry-marks))
+				     :char)))
+			       (if c
+				   (list c)
+				 nil)))
+			   marks))))
 
 (defun gnus-registry-read-mark ()
   "Read a mark name from the user with completion."
@@ -1033,10 +1060,12 @@
 
 ;;;###autoload
 (defun gnus-registry-initialize ()
+"Initialize the Gnus registry."
   (interactive)
-  (setq gnus-registry-install t)
+  (gnus-message 5 "Initializing the registry")
+  (setq gnus-registry-install t)	; in case it was 'ask or nil
   (gnus-registry-install-hooks)
-  (gnus-registry-install-shortcuts-and-menus)
+  (gnus-registry-install-shortcuts)
   (gnus-registry-read))
 
 ;;;###autoload
@@ -1068,11 +1097,24 @@
 
 (add-hook 'gnus-registry-unload-hook 'gnus-registry-unload-hook)
 
-(when gnus-registry-install
-  (gnus-registry-install-hooks)
-  (gnus-registry-read))
+(defun gnus-registry-install-p ()
+  (interactive)
+  (when (eq gnus-registry-install 'ask)
+    (setq gnus-registry-install
+	  (gnus-y-or-n-p
+	   (concat "Enable the Gnus registry?  "
+		   "See the variable `gnus-registry-install' "
+		   "to get rid of this query permanently. ")))
+    (when gnus-registry-install
+      ;; we just set gnus-registry-install to t, so initialize the registry!
+      (gnus-registry-initialize)))
+;;; we could call it here: (customize-variable 'gnus-registry-install)
+  gnus-registry-install)
 
-;; TODO: a lot of things
+(when (gnus-registry-install-p)
+  (gnus-registry-initialize))
+
+;; TODO: a few things
 
 (provide 'gnus-registry)
 
--- a/lisp/gnus/gnus-sum.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/gnus-sum.el	Mon Mar 10 00:50:22 2008 +0000
@@ -2582,6 +2582,17 @@
 	 ["Set expirable mark" gnus-summary-mark-as-expirable t]
 	 ["Set bookmark" gnus-summary-set-bookmark t]
 	 ["Remove bookmark" gnus-summary-remove-bookmark t])
+	("Registry Mark"
+	 ["Important"     gnus-registry-set-article-Important-mark    t]
+	 ["Not Important" gnus-registry-remove-article-Important-mark t]
+	 ["Work"          gnus-registry-set-article-Work-mark         t]
+	 ["Not Work"      gnus-registry-remove-article-Work-mark      t]
+	 ["Later"         gnus-registry-set-article-Later-mark        t]
+	 ["Not Later"     gnus-registry-remove-article-Later-mark     t]
+	 ["Personal"      gnus-registry-set-article-Personal-mark     t]
+	 ["Not Personal"  gnus-registry-remove-article-Personal-mark  t]
+	 ["To Do"         gnus-registry-set-article-To-Do-mark        t]
+	 ["Not To Do"     gnus-registry-remove-article-To-Do-mark     t])
 	("Limit to"
 	 ["Marks..." gnus-summary-limit-to-marks t]
 	 ["Subject..." gnus-summary-limit-to-subject t]
@@ -9210,8 +9221,6 @@
     (goto-char (point-max))
     (recenter -3)
     (when gnus-break-pages
-      (when (re-search-backward page-delimiter nil t)
-	(narrow-to-region (match-end 0) (point-max)))
       (gnus-narrow-to-page))))
 
 (defun gnus-summary-print-truncate-and-quote (string &optional len)
--- a/lisp/gnus/message.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/message.el	Mon Mar 10 00:50:22 2008 +0000
@@ -652,7 +652,8 @@
 `message-send-mail-with-mh', `message-send-mail-with-qmail',
 `message-smtpmail-send-it', `smtpmail-send-it',
 `feedmail-send-it' and `message-send-mail-with-mailclient'.  The
-default is system dependent.
+default is system dependent and determined by the function
+`message-send-mail-function'.
 
 See also `send-mail-function'."
   :type '(radio (function-item message-send-mail-with-sendmail)
@@ -661,7 +662,6 @@
 		(function-item message-smtpmail-send-it)
 		(function-item smtpmail-send-it)
 		(function-item feedmail-send-it)
-		(function :tag "Other")
 		(function-item message-send-mail-with-mailclient
 			       :tag "Use Mailclient package")
  		(function :tag "Other"))
@@ -7807,6 +7807,98 @@
 	(delete-region start end)
 	(insert match)))))
 
+;; To send pre-formatted letters like the example below, you can use
+;; `message-send-form-letter':
+;; --8<---------------cut here---------------start------------->8---
+;; To: alice@invalid.invalid
+;; Subject: Verification of your contact information
+;; From: Contact verification <admin@foo.invalid>
+;; --text follows this line--
+;; Hi Alice,
+;; please verify that your contact information is still valid:
+;; Alice A, A avenue 11, 1111 A town, Austria
+;; ----------next form letter message follows this line----------
+;; To: bob@invalid.invalid
+;; Subject: Verification of your contact information
+;; From: Contact verification <admin@foo.invalid>
+;; --text follows this line--
+;; Hi Bob,
+;; please verify that your contact information is still valid:
+;; Bob, B street 22, 22222 Be town, Belgium
+;; ----------next form letter message follows this line----------
+;; To: charlie@invalid.invalid
+;; Subject: Verification of your contact information
+;; From: Contact verification <admin@foo.invalid>
+;; --text follows this line--
+;; Hi Charlie,
+;; please verify that your contact information is still valid:
+;; Charlie Chaplin, C plaza 33, 33333 C town, Chile
+;; --8<---------------cut here---------------end--------------->8---
+
+;; FIXME: What is the most common term (circular letter, form letter, serial
+;; letter, standard letter) for such kind of letter?  See also
+;; <http://en.wikipedia.org/wiki/Form_letter>
+
+;; FIXME: Maybe extent message-mode's font-lock support to recognize
+;; `message-form-letter-separator', i.e. highlight each message like a single
+;; message.
+
+(defcustom message-form-letter-separator
+  "\n----------next form letter message follows this line----------\n"
+  "Separator for `message-send-form-letter'."
+  ;; :group 'message-form-letter
+  :group 'message-various
+  :version "23.1" ;; No Gnus
+  :type 'string)
+
+(defcustom message-send-form-letter-delay 1
+  "Delay in seconds when sending a message with `message-send-form-letter'.
+Only used when `message-send-form-letter' is called with non-nil
+argument `force'."
+  ;; :group 'message-form-letter
+  :group 'message-various
+  :version "23.1" ;; No Gnus
+  :type 'integer)
+
+(defun message-send-form-letter (&optional force)
+  "Sent all form letter messages from current buffer.
+Unless FORCE, prompt before sending.
+
+The messages are separated by `message-form-letter-separator'.
+Header and body are separated by `mail-header-separator'."
+  (interactive "P")
+  (let ((sent 0) (skipped 0)
+	start end text
+	buff
+	to done)
+    (goto-char (point-min))
+    (while (not done)
+      (setq start (point)
+	    end (if (search-forward message-form-letter-separator nil t)
+		    (- (point) (length message-form-letter-separator) -1)
+		  (setq done t)
+		  (point-max)))
+      (setq text
+	    (buffer-substring-no-properties start end))
+      (setq buff (generate-new-buffer "*mail - form letter*"))
+      (with-current-buffer buff
+	(insert text)
+	(message-mode)
+	(setq to (message-fetch-field "To"))
+	(switch-to-buffer buff)
+	(when force
+	  (sit-for message-send-form-letter-delay))
+	(if (or force
+		  (y-or-n-p (format "Send message to `%s'? " to)))
+	    (progn
+	      (setq sent (1+ sent))
+	      (message-send-and-exit))
+	  (message (format "Message to `%s' skipped." to))
+	  (setq skipped (1+ skipped)))
+	(when (buffer-live-p buff)
+	  (kill-buffer buff))))
+    (message "%s message(s) sent, %s skipped." sent skipped)))
+
 (when (featurep 'xemacs)
   (require 'messagexmas)
   (message-xmas-redefine))
--- a/lisp/gnus/mm-decode.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/mm-decode.el	Mon Mar 10 00:50:22 2008 +0000
@@ -106,31 +106,33 @@
 	 ,disposition ,description ,cache ,id))
 
 (defcustom mm-text-html-renderer
-  (cond ((locate-library "w3") 'w3)
-	((executable-find "w3m") (if (locate-library "w3m")
-				     'w3m
-				   'w3m-standalone))
+  (cond ((executable-find "w3m")
+	 (if (locate-library "w3m")
+	     'w3m
+	   'w3m-standalone))
 	((executable-find "links") 'links)
 	((executable-find "lynx") 'lynx)
-	(t 'html2text))
+	((locate-library "w3") 'w3)
+	((locate-library "html2text") 'html2text)
+	(t nil))
   "Render of HTML contents.
 It is one of defined renderer types, or a rendering function.
 The defined renderer types are:
-`w3'   : use Emacs/W3;
 `w3m'  : use emacs-w3m;
 `w3m-standalone': use w3m;
 `links': use links;
 `lynx' : use lynx;
+`w3'   : use Emacs/W3;
 `html2text' : use html2text;
-nil    : use external viewer."
-  :version "22.1"
+nil    : use external viewer (default web browser)."
+  :version "23.0" ;; No Gnus
   :type '(choice (const w3)
-		 (const w3m)
-		 (const w3m-standalone)
+		 (const w3m :tag "emacs-w3m")
+		 (const w3m-standalone :tag "standalone w3m" )
 		 (const links)
 		 (const lynx)
 		 (const html2text)
-		 (const nil)
+		 (const nil :tag "External viewer")
 		 (function))
   :group 'mime-display)
 
--- a/lisp/gnus/mm-view.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/mm-view.el	Mon Mar 10 00:50:22 2008 +0000
@@ -289,7 +289,7 @@
 	     (let ((coding-system-for-write 'iso-2022-jp)
 		   (coding-system-for-read 'iso-2022-jp)
 		   (str (mm-decode-coding-string "\
-\e$B#D#o#e#s!!#w#3#m!!#s#u#p#p#o#r#t#s!!#m#1#7#n!)\e(B" 'iso-2022-jp)))
+\e$B#D#o#e#s!!#w#3#m!!#s#u#p#p#o#r#t!!#m#1#7#n!)\e(B" 'iso-2022-jp)))
 	       (mm-with-multibyte-buffer
 		 (insert str)
 		 (call-process-region
--- a/lisp/gnus/mml.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/mml.el	Mon Mar 10 00:50:22 2008 +0000
@@ -1017,6 +1017,14 @@
     (define-key main "\C-c\C-m" map)
     main))
 
+;; (defun mml-toggle-gcc-externalize-attachments ()
+;;   (interactive)
+;;   (prog1
+;;       (setq gnus-gcc-externalize-attachments
+;; 	    (not gnus-gcc-externalize-attachments))
+;;     (message "gnus-gcc-externalize-attachments is `%s'."
+;; 	     gnus-gcc-externalize-attachments)))
+
 (easy-menu-define
   mml-menu mml-mode-map ""
   `("Attachments"
@@ -1025,10 +1033,18 @@
 	 '(:help "Attach a file at point"))]
     ["Attach Buffer..." mml-attach-buffer
      ,@(if (featurep 'xemacs) '(t)
-	 '(:help "Attach a buffer to the outgoing MIME message"))]
+	 '(:help "Attach a buffer to the outgoing message"))]
     ["Attach External..." mml-attach-external
      ,@(if (featurep 'xemacs) '(t)
-	 '(:help "Attach reference to file"))]
+	 '(:help "Attach reference to an external file"))]
+    ;; ["Externalize Attachments"
+    ;;  (lambda () (interactive) (mml-toggle-gcc-externalize-attachments))
+    ;; ,@(if (featurep 'xemacs) nil
+    ;; 	'(:help "Save attachments as external parts in Gcc copies"))
+    ;; :visible (booleanp gnus-gcc-externalize-attachments)
+    ;; :style radio
+    ;; :selected (equal gnus-gcc-externalize-attachments t) ]
+    "----"
     ;;
     ("Change Security Method"
      ["PGP/MIME"
@@ -1056,6 +1072,10 @@
     ["Encrypt/Sign off" mml-unsecure-message
      ,@(if (featurep 'xemacs) '(t)
 	 '(:help "Don't Encrypt/Sign Message"))]
+    ;; Do we have separate encrypt and encrypt/sign commands for parts?
+    ["Sign Part" mml-secure-sign t]
+    ["Encrypt Part" mml-secure-encrypt t]
+    "----"
     ;; Maybe we could remove these, because people who write MML most probably
     ;; don't use the menu:
     ["Insert Part..." mml-insert-part
@@ -1063,9 +1083,6 @@
     ["Insert Multipart..." mml-insert-multipart
      :active (message-in-body-p)]
     ;;
-    ;; Do we have separate encrypt and encrypt/sign commands for parts?
-    ["Sign Part" mml-secure-sign t]
-    ["Encrypt Part" mml-secure-encrypt t]
     ;;["Narrow" mml-narrow-to-part t]
     ["Quote MML in region" mml-quote-region
      :active (message-mark-active-p)
@@ -1222,7 +1239,7 @@
 don't ask for options.  If it is t, ask the user whether or not
 to specify options."
   :type '(choice
-	  (const :tag "Non" nil)
+	  (const :tag "None" nil)
 	  (const :tag "Query" t)
 	  (list :value (type description disposition)
 	   (set :inline t
--- a/lisp/gnus/mml2015.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/gnus/mml2015.el	Mon Mar 10 00:50:22 2008 +0000
@@ -153,6 +153,17 @@
 ;; should be done by GnuPG rather than Elisp, but older PGP backends
 ;; (such as Mailcrypt, PGG, and gpg.el) discard the output from GnuPG.
 (defun mml2015-extract-cleartext-signature ()
+  ;; Daiki Ueno in
+  ;; <54a15d860801080142l70b95d7dkac4bf51a86196011@mail.gmail.com>: ``I still
+  ;; believe that the right way is to use the plaintext output from GnuPG as
+  ;; it is, and mml2015-extract-cleartext-signature is just a kludge for
+  ;; misdesigned libraries like PGG, which have no ability to do that.  So, I
+  ;; think it should not have descriptive documentation.''
+  ;;
+  ;; This function doesn't handle NotDashEscaped correctly.  EasyPG handles it
+  ;; correctly.
+  ;; http://thread.gmane.org/gmane.emacs.gnus.general/66062/focus=66082
+  ;; http://thread.gmane.org/gmane.emacs.gnus.general/65087/focus=65109
   (goto-char (point-min))
   (forward-line)
   ;; We need to be careful not to strip beyond the armor headers.
--- a/lisp/net/imap.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/net/imap.el	Mon Mar 10 00:50:22 2008 +0000
@@ -2923,6 +2923,7 @@
 	  imap-open-1
 	  imap-open
 	  imap-opened
+	  imap-ping-server
 	  imap-authenticate
 	  imap-close
 	  imap-capability
--- a/lisp/net/netrc.el	Mon Mar 10 00:50:06 2008 +0000
+++ b/lisp/net/netrc.el	Mon Mar 10 00:50:22 2008 +0000
@@ -61,7 +61,7 @@
 
 (defun netrc-parse (file)
   (interactive "fFile to Parse: ")
-  "Parse FILE and return an list of all entries in the file."
+  "Parse FILE and return a list of all entries in the file."
   (when (file-exists-p file)
     (with-temp-buffer
       (let ((tokens '("machine" "default" "login"