Synch with Oort Gnus.
[elisp/gnus.git-] / lisp / gnus-start.el
index b570854..e9ad647 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-start.el --- startup functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -311,7 +311,7 @@ hierarchy in its entirety."
   :type 'boolean)
 
 (defcustom gnus-auto-subscribed-groups
-  "^nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl"
+  "^nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl\\|^nnmaildir"
   "*All new groups that match this regexp will be subscribed automatically.
 Note that this variable only deals with new groups.  It has no effect
 whatsoever on old groups.
@@ -371,7 +371,8 @@ This hook is called as the first thing when Gnus is started."
   :group 'gnus-start
   :type 'hook)
 
-(defcustom gnus-setup-news-hook nil
+(defcustom gnus-setup-news-hook 
+  '(gnus-fixup-nnimap-unread-after-getting-new-news)
   "A hook after reading the .newsrc file, but before generating the buffer."
   :group 'gnus-start
   :type 'hook)
@@ -382,7 +383,8 @@ This hook is called as the first thing when Gnus is started."
   :type 'hook)
 
 (defcustom gnus-after-getting-new-news-hook
-  '(gnus-display-time-event-handler)
+  '(gnus-display-time-event-handler
+    gnus-fixup-nnimap-unread-after-getting-new-news)
   "A hook run after Gnus checks for new news when Gnus is already running."
   :group 'gnus-group-new
   :type 'hook)
@@ -415,17 +417,14 @@ Can be used to turn version control on or off."
   :group 'gnus-newsrc
   :type 'boolean)
 
-(defvar gnus-startup-file-coding-system (static-if (boundp 'MULE)
-                                           '*ctext*
-                                         'ctext)
-  "*Coding system for startup file.")
+;;; Internal variables
 
-(defvar gnus-ding-file-coding-system gnus-startup-file-coding-system
-  "*Coding system for ding file.")
+(defvar gnus-ding-file-coding-system (static-if (boundp 'MULE)
+                                        '*ctext*
+                                      'ctext)
+  "Coding system for ding file.")
 ;; Note that the ding file for T-gnus ought not to have byte-codes.
 
-;;; Internal variables
-
 (defvar gnus-newsrc-file-version nil)
 (defvar gnus-override-subscribe-method nil)
 (defvar gnus-dribble-buffer nil)
@@ -452,21 +451,15 @@ Can be used to turn version control on or off."
     (if gnus-init-inhibit
        (setq gnus-init-inhibit nil)
       (setq gnus-init-inhibit inhibit-next)
-      (let ((files (list gnus-site-init-file gnus-init-file))
-           file)
-       (while files
-         (and (setq file (pop files))
-              (or (and (file-exists-p file)
-                       ;; Don't try to load a directory.
-                       (not (file-directory-p file)))
-                  (file-exists-p (concat file ".el"))
-                  (file-exists-p (concat file ".elc")))
-              (if (or debug-on-error debug-on-quit)
-                  (load file nil t)
-                (condition-case var
-                    (load file nil t)
-                  (error
-                   (error "Error in %s: %s" file var))))))))))
+      (dolist (file (list gnus-site-init-file gnus-init-file))
+       (when (and file
+                  (locate-library file))
+         (if (or debug-on-error debug-on-quit)
+             (load file nil t)
+           (condition-case var
+               (load file nil t)
+             (error
+              (error "Error in %s: %s" file (cadr var))))))))))
 
 ;; For subscribing new newsgroup
 
@@ -724,6 +717,8 @@ prompt the user for the name of an NNTP server to use."
     (nnheader-init-server-buffer)
     (setq gnus-slave slave)
     (gnus-read-init-file)
+    (if gnus-agent
+       (gnus-agentize))
 
     (when gnus-simple-splash
       (setq gnus-simple-splash nil)
@@ -761,6 +756,9 @@ prompt the user for the name of an NNTP server to use."
            (add-hook 'gnus-summary-mode-hook 'gnus-grouplens-mode))
 
          ;; Do the actual startup.
+         (if gnus-agent
+             (gnus-request-create-group "queue" '(nndraft "")))
+         (gnus-request-create-group "drafts" '(nndraft ""))
          (gnus-setup-news nil level dont-connect)
          (gnus-run-hooks 'gnus-setup-news-hook)
          (gnus-start-draft-setup)
@@ -819,7 +817,11 @@ cautiously -- unloading may cause trouble."
       (set-buffer gnus-dribble-buffer)
       (goto-char (point-max))
       (insert string "\n")
-      (set-window-point (get-buffer-window (current-buffer)) (point-max))
+      ;; This has been commented by Josh Huber <huber@alum.wpi.edu>
+      ;; It causes problems with both XEmacs and Emacs 21, and doesn't
+      ;; seem to be of much value. (FIXME: remove this after we make sure
+      ;; it's not needed).
+      ;; (set-window-point (get-buffer-window (current-buffer)) (point-max))
       (bury-buffer gnus-dribble-buffer)
       (save-excursion
        (set-buffer gnus-group-buffer)
@@ -1584,6 +1586,7 @@ newsgroup."
 ;; Go though `gnus-newsrc-alist' and compare with `gnus-active-hashtb'
 ;; and compute how many unread articles there are in each group.
 (defun gnus-get-unread-articles (&optional level)
+  (setq gnus-server-method-cache nil)
   (let* ((newsrc (cdr gnus-newsrc-alist))
         (level (or level gnus-activate-level (1+ gnus-level-subscribed)))
         (foreign-level
@@ -1624,7 +1627,7 @@ newsgroup."
          (when (and (<= (gnus-info-level info) foreign-level)
                     (setq active (gnus-activate-group group 'scan)))
            ;; Let the Gnus agent save the active file.
-           (when (and gnus-agent gnus-plugged active)
+           (when (and gnus-agent active (gnus-online method))
              (gnus-agent-save-group-info
               method (gnus-group-real-name group) active))
            (unless (inline (gnus-virtual-group-p group))
@@ -1931,7 +1934,7 @@ newsgroup."
        (insert ?\\)))
 
     ;; Let the Gnus agent save the active file.
-    (when (and gnus-agent real-active gnus-plugged)
+    (when (and gnus-agent real-active (gnus-online method))
       (gnus-agent-save-active method))
 
     ;; If these are groups from a foreign select method, we insert the
@@ -1951,7 +1954,7 @@ newsgroup."
     (goto-char (point-min))
     (let (group max min)
       (while (not (eobp))
-       (condition-case err
+       (condition-case ()
            (progn
              (narrow-to-region (point) (gnus-point-at-eol))
              ;; group gets set to a symbol interned in the hash table
@@ -2007,7 +2010,7 @@ newsgroup."
     ;; Let the Gnus agent save the active file.
     (if (and gnus-agent
             real-active
-            gnus-plugged
+            (gnus-online method)
             (gnus-agent-method-p method))
        (progn
          (gnus-agent-save-groups method)
@@ -2104,6 +2107,14 @@ If FORCE is non-nil, the .newsrc file is read."
                   (gnus-yes-or-no-p
                    (format "Error in %s; continue? " ding-file))
                   (error "Error in %s" ding-file))))))
+;;     ;; Older versions of `gnus-format-specs' are no longer valid
+;;     ;; in Oort Gnus 0.01.
+;;     (let ((version
+;;            (and gnus-newsrc-file-version
+;;                 (gnus-continuum-version gnus-newsrc-file-version))))
+;;       (when (or (not version)
+;;                 (< version 5.090009))
+;;         (setq gnus-format-specs gnus-default-format-specs)))
        (when gnus-newsrc-assoc
          (setq gnus-newsrc-alist gnus-newsrc-assoc))))
     (gnus-make-hashtable-from-newsrc-alist)
@@ -2153,24 +2164,36 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
 (defun gnus-product-read-variable-file-1 (file checking-methods coding
                                               &rest variables)
   (let (error gnus-product-file-version method file-ver)
-    (when (or
-          (condition-case err
-              (let ((coding-system-for-read coding)
-                    (input-coding-system coding))
-                (load (expand-file-name file gnus-product-directory) t nil t)
-                nil)
-            (error
-             (message "%s" err)
-             (setq error t)))
-          (and (assq 'emacs-version checking-methods)
-               (not (string= emacs-version
+    (when (or (condition-case err
+                 (let ((coding-system-for-read coding)
+                       (input-coding-system coding))
+                   (load (expand-file-name file gnus-product-directory)
+                         nil nil t)
+                   nil)
+               (error
+                (message "Error while reading %s: %s"
+                         (expand-file-name file gnus-product-directory)
+                         (error-message-string err))
+                (setq error t)))
+             (and (setq method (assq 'product-version checking-methods))
+                  (not (and (setq file-ver
+                                  (cdr (assq 'product-version
+                                             gnus-product-file-version)))
+                            (zerop (product-version-compare file-ver
+                                                            (cadr method))))))
+             (and (assq 'emacs-version checking-methods)
+                  (not (and (assq 'emacs-version gnus-product-file-version)
+                            (string-equal
+                             emacs-version
                              (cdr (assq 'emacs-version
-                                        gnus-product-file-version)))))
-          (and (setq method (assq 'product-version checking-methods))
-               (or (not (setq file-ver
-                              (cdr (assq 'product-version
-                                         gnus-product-file-version))))
-                   (< (product-version-compare file-ver (cadr method)) 0))))
+                                        gnus-product-file-version))))))
+             (and (assq 'correct-string-widths checking-methods)
+                  (not (and (assq 'correct-string-widths
+                                  gnus-product-file-version)
+                            (eq (and gnus-use-correct-string-widths t)
+                                (and (cdr (assq 'correct-string-widths
+                                                gnus-product-file-version))
+                                     t))))))
       (unless error
        (message "\"%s\" seems to have mismatched contents, updating..."
                 file))
@@ -2624,7 +2647,7 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
   "Insert gnus product depend variables in lisp format."
   (let ((print-quoted t)
        (print-escape-newlines t)
-       variable param)
+       print-length print-level variable param)
     (insert (format ";; -*- Mode: emacs-lisp; coding: %s -*-\n" coding))
     (insert (format ";; %s startup file.\n" (product-name product)))
     (when (setq param (cdr (assq 'product-version checking-methods)))
@@ -2634,10 +2657,14 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
              "\t0)\n"
              "    (error \"This file was created by later version of "
              "gnus.\"))\n"))
-    (insert "(setq gnus-product-file-version \n"
+    (insert "(setq gnus-product-file-version\n"
            "      '((product-version . "
            (prin1-to-string (product-version product)) ")\n"
-           "\t(emacs-version . " (prin1-to-string emacs-version) ")))\n")
+           "\t(emacs-version . "
+           (prin1-to-string emacs-version) ")\n"
+           "\t(correct-string-widths . "
+           (if gnus-use-correct-string-widths "t" "nil")
+           ")))\n")
     (while variables
       (when (and (boundp (setq variable (pop variables)))
                 (symbol-value variable))
@@ -2727,7 +2754,7 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
   (save-excursion
     (set-buffer gnus-dribble-buffer)
     (let ((slave-name
-          (make-temp-name (concat gnus-current-startup-file "-slave-")))
+          (mm-make-temp-file (concat gnus-current-startup-file "-slave-")))
          (modes (ignore-errors
                   (file-modes (concat gnus-current-startup-file ".eld")))))
       (gnus-write-buffer-as-coding-system gnus-ding-file-coding-system
@@ -2856,7 +2883,8 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
                     (name (symbol-name group))
                     (charset
                      (or (gnus-group-name-charset method name)
-                         (gnus-parameter-charset name))))
+                         (gnus-parameter-charset name)
+                         gnus-default-charset)))
                (when (and str charset (featurep 'mule))
                  (setq str (decode-coding-string str charset)))
                (set group str)))
@@ -2895,6 +2923,23 @@ If this variable is nil, don't do anything."
   (when (gnus-boundp 'display-time-timer)
     (display-time-event-handler)))
 
+;; Byte-compiler warning.
+(eval-when-compile
+  (defvar nnimap-mailbox-info))
+
+;;;###autoload
+(defun gnus-fixup-nnimap-unread-after-getting-new-news ()
+  (let (server group info)
+    (mapatoms
+     (lambda (sym)
+       (when (and (setq group (symbol-name sym))
+                 (gnus-group-entry group)
+                 (setq info (symbol-value sym)))
+        (gnus-sethash group (cons (nth 2 info) (cdr (gnus-group-entry group)))
+                      gnus-newsrc-hashtb)))
+     nnimap-mailbox-info)))
+
+
 (provide 'gnus-start)
 
 ;;; gnus-start.el ends here