* Makefile.in (install-package-ja): Compile and install lisp files first.
[elisp/gnus.git-] / lisp / gnus-start.el
index c797b3d..a536302 100644 (file)
@@ -641,6 +641,7 @@ the first newsgroup."
        gnus-newsgroup-unreads nil
        nnoo-state-alist nil
        gnus-current-select-method nil
+       nnmail-split-history nil
        gnus-ephemeral-servers nil)
   (gnus-shutdown 'gnus)
   ;; Kill the startup file.
@@ -698,7 +699,7 @@ prompt the user for the name of an NNTP server to use."
     (when gnus-simple-splash
       (setq gnus-simple-splash nil)
       (cond
-       (gnus-xemacs
+       ((featurep 'xemacs)
        (gnus-xmas-splash))
        ((and (eq window-system 'x)
             (= (frame-height) (1+ (window-height))))
@@ -754,17 +755,14 @@ prompt the user for the name of an NNTP server to use."
 
 ;;;###autoload
 (defun gnus-unload ()
-  "Unload all Gnus features."
+  "Unload all Gnus features.
+\(For some value of `all' or `Gnus'.)  Currently, features whose names
+have prefixes `gnus-', `nn', `mm-' or `rfc' are unloaded.  Use
+cautiously -- unloading may cause trouble."
   (interactive)
-  (unless (boundp 'load-history)
-    (error "Sorry, `gnus-unload' is not implemented in this Emacs version"))
-  (let ((history load-history)
-       feature)
-    (while history
-      (and (string-match "^\\(gnus\\|nn\\)" (caar history))
-          (setq feature (cdr (assq 'provide (car history))))
-          (unload-feature feature 'force))
-      (setq history (cdr history)))))
+  (dolist (feature features)
+    (if (string-match "^\\(gnus-\\|nn\\|mm-\\|rfc\\)" (symbol-name feature))
+       (unload-feature feature 'force))))
 
 \f
 ;;;
@@ -1136,29 +1134,30 @@ for new groups, and subscribe the new groups as zombies."
 
 (defun gnus-check-first-time-used ()
   (catch 'ended
-    (let ((files (list gnus-current-startup-file
-                      (concat gnus-current-startup-file ".el")
-                      (concat gnus-current-startup-file ".eld")
-                      gnus-startup-file
-                      (concat gnus-startup-file ".el")
-                      (concat gnus-startup-file ".eld"))))
-      (while files
-       (when (file-exists-p (pop files))
-         (throw 'ended nil))))
+    ;; First check if any of the following files exist.  If they do,
+    ;; it's not the first time the user has used Gnus.
+    (dolist (file (list gnus-current-startup-file
+                       (concat gnus-current-startup-file ".el")
+                       (concat gnus-current-startup-file ".eld")
+                       gnus-startup-file
+                       (concat gnus-startup-file ".el")
+                       (concat gnus-startup-file ".eld")))
+      (when (file-exists-p file)
+       (throw 'ended nil)))
     (gnus-message 6 "First time user; subscribing you to default groups")
     (unless (gnus-read-active-file-p)
       (let ((gnus-read-active-file t))
        (gnus-read-active-file)))
     (setq gnus-newsrc-last-checked-date (current-time-string))
-    (let ((groups gnus-default-subscribed-newsgroups)
+    ;; Subscribe to the default newsgroups.
+    (let ((groups (or gnus-default-subscribed-newsgroups
+                     gnus-backup-default-subscribed-newsgroups))
          group)
-      (if (eq groups t)
-         nil
-       (setq groups (or groups gnus-backup-default-subscribed-newsgroups))
+      (when (eq groups t)
+       ;; If t, we subscribe (or not) all groups as if they were new.
        (mapatoms
         (lambda (sym)
-          (if (null (setq group (symbol-name sym)))
-              ()
+          (when (setq group (symbol-name sym))
             (let ((do-sub (gnus-matches-options-n group)))
               (cond
                ((eq do-sub 'subscribe)
@@ -1169,18 +1168,17 @@ for new groups, and subscribe the new groups as zombies."
                (t
                 (push group gnus-killed-list))))))
         gnus-active-hashtb)
-       (while groups
-         (when (gnus-active (car groups))
+       (dolist (group groups)
+         ;; Only subscribe the default groups that are activated.
+         (when (gnus-active group)
            (gnus-group-change-level
-            (car groups) gnus-level-default-subscribed gnus-level-killed))
-         (setq groups (cdr groups)))
+            group gnus-level-default-subscribed gnus-level-killed)))
        (save-excursion
          (set-buffer gnus-group-buffer)
          (gnus-group-make-help-group))
        (when gnus-novice-user
          (gnus-message 7 "`A k' to list killed groups"))))))
 
-
 (defun gnus-subscribe-group (group &optional previous method)
   "Subcribe GROUP and put it after PREVIOUS."
   (gnus-group-change-level
@@ -1409,7 +1407,9 @@ newsgroup."
         (condition-case ()
             (inline (gnus-request-group group dont-check method))
           ;;(error nil)
-          (quit nil))
+          (quit
+           (message "Quit activating %s" group)
+           nil))
         (setq active (gnus-parse-active))
         ;; If there are no articles in the group, the GROUP
         ;; command may have responded with the `(0 . 0)'.  We
@@ -1548,8 +1548,8 @@ newsgroup."
                       (setq method (gnus-server-get-method nil method)))))
               (not (gnus-secondary-method-p method)))
          ;; These groups are foreign.  Check the level.
-         (when (<= (gnus-info-level info) foreign-level)
-           (setq active (gnus-activate-group group 'scan))
+         (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)
              (gnus-agent-save-group-info
@@ -1576,16 +1576,22 @@ newsgroup."
            ;; hack: `nnmail-get-new-mail' changes the mail-source depending
            ;; on the group, so we must perform a scan for every group
            ;; if the users has any directory mail sources.
-           (if (and (null (assq 'directory
+           ;; hack: if `nnmail-scan-directory-mail-source-once' is non-nil,
+           ;; for it scan all spool files even when the groups are
+           ;; not required.
+           (if (and
+                (or nnmail-scan-directory-mail-source-once
+                    (null (assq 'directory
                                 (or mail-sources
-                                    (if (listp nnmail-spool-file) 
+                                    (if (listp nnmail-spool-file)
                                         nnmail-spool-file
-                                      (list nnmail-spool-file)))))
-                    (member method scanned-methods))
+                                      (list nnmail-spool-file))))))
+                (member method scanned-methods))
                (setq active (gnus-activate-group group))
              (setq active (gnus-activate-group group 'scan))
              (push method scanned-methods))
-           (inline (gnus-close-group group))))))
+            (when active
+              (gnus-close-group group))))))
 
       ;; Get the number of unread articles in the group.
       (cond
@@ -1607,23 +1613,23 @@ newsgroup."
       (let* ((mg (pop retrievegroups))
             (method (or (car mg) gnus-select-method))
             (groups (cdr mg)))
-       (gnus-check-server method)
-       ;; Request that the backend scan its incoming messages.
-       (when (gnus-check-backend-function 'request-scan (car method))
-         (gnus-request-scan nil method))
-       (gnus-read-active-file-2 (mapcar (lambda (group)
-                                          (gnus-group-real-name group))
-                                        groups) method)
-       (dolist (group groups)
-         (cond
-          ((setq active (gnus-active (gnus-info-group
-                                      (setq info (gnus-get-info group)))))
-           (inline (gnus-get-unread-articles-in-group info active t)))
-          (t
-           ;; The group couldn't be reached, so we nix out the number of
-           ;; unread articles and stuff.
-           (gnus-set-active group nil)
-           (setcar (gnus-gethash group gnus-newsrc-hashtb) t))))))
+       (when (gnus-check-server method)
+          ;; Request that the backend scan its incoming messages.
+          (when (gnus-check-backend-function 'request-scan (car method))
+            (gnus-request-scan nil method))
+          (gnus-read-active-file-2 (mapcar (lambda (group)
+                                             (gnus-group-real-name group))
+                                           groups) method)
+          (dolist (group groups)
+            (cond
+             ((setq active (gnus-active (gnus-info-group
+                                         (setq info (gnus-get-info group)))))
+              (inline (gnus-get-unread-articles-in-group info active t)))
+             (t
+              ;; The group couldn't be reached, so we nix out the number of
+              ;; unread articles and stuff.
+              (gnus-set-active group nil)
+              (setcar (gnus-gethash group gnus-newsrc-hashtb) t)))))))
 
     (gnus-message 5 "Checking new news...done")))
 
@@ -1756,7 +1762,9 @@ newsgroup."
              (gnus-read-active-file-1 method force)
            ;; We catch C-g so that we can continue past servers
            ;; that do not respond.
-           (quit nil)))))))
+           (quit
+            (message "Quit reading the active file")
+            nil)))))))
 
 (defun gnus-read-active-file-1 (method force)
   (let (where mesg)
@@ -1808,14 +1816,14 @@ newsgroup."
       (gnus-check-server method)
       (let ((list-type (gnus-retrieve-groups groups method)))
        (cond ((not list-type)
-              (gnus-error 
+              (gnus-error
                1.2 "Cannot read partial active file from %s server."
                (car method)))
              ((eq list-type 'active)
               (gnus-active-to-gnus-format method gnus-active-hashtb nil t))
              (t
               (gnus-groups-to-gnus-format method gnus-active-hashtb t)))))))
-  
+
 ;; Read an active file and place the results in `gnus-active-hashtb'.
 (defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors
                                             real-active)
@@ -2063,26 +2071,32 @@ 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 (gnus-product-file-version method file-ver)
-    (if (or (condition-case err
-               (let ((coding-system-for-read coding)
-                     (input-coding-system coding))
-                 (load (expand-file-name file gnus-product-directory) t t t)
-                 nil)
-             (error (message "%s" err)))
-           (and (assq 'emacs-version checking-methods)
-                (not (string= 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))))
-       (while variables
-         (set (car variables) nil)
-         (gnus-product-variable-touch (car variables))
-         (setq variables (cdr 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
+                             (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))))
+      (unless error
+       (message "\"%s\" seems to have mismatched contents, updating..."
+                file))
+      (while variables
+       (set (car variables) nil)
+       (gnus-product-variable-touch (car variables))
+       (setq variables (cdr variables))))))
 
 ;; Parse the old-style quick startup file
 (defun gnus-read-old-newsrc-el-file (file)
@@ -2635,7 +2649,8 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
           (make-temp-name (concat gnus-current-startup-file "-slave-")))
          (modes (ignore-errors
                   (file-modes (concat gnus-current-startup-file ".eld")))))
-      (gnus-write-buffer slave-name)
+      (gnus-write-buffer-as-coding-system
+       gnus-startup-file-coding-system slave-name)
       (when modes
        (set-file-modes slave-name modes)))))
 
@@ -2665,7 +2680,7 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
        (while slave-files
          (erase-buffer)
          (setq file (nth 1 (car slave-files)))
-         (insert-file-contents file)
+         (nnheader-insert-file-contents file)
          (when (condition-case ()
                    (progn
                      (eval-buffer (current-buffer))
@@ -2758,7 +2773,7 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
              (let ((str (buffer-substring
                          (point) (progn (end-of-line) (point))))
                    (coding
-                    (and (or gnus-xemacs
+                    (and (or (featurep 'xemacs)
                              (and (boundp 'enable-multibyte-characters)
                                   enable-multibyte-characters))
                          (fboundp 'gnus-mule-get-coding-system)
@@ -2784,7 +2799,8 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
   "Declare backend NAME with ABILITIES as a Gnus backend."
   (setq gnus-valid-select-methods
        (nconc gnus-valid-select-methods
-              (list (apply 'list name abilities)))))
+              (list (apply 'list name abilities))))
+  (gnus-redefine-select-method-widget))
 
 (defun gnus-set-default-directory ()
   "Set the default directory in the current buffer to `gnus-default-directory'.