]> git.eshelyaron.com Git - emacs.git/commitdiff
Merge changes made in Gnus trunk.
authorGnus developers <ding@gnus.org>
Thu, 16 Dec 2010 22:22:28 +0000 (22:22 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Thu, 16 Dec 2010 22:22:28 +0000 (22:22 +0000)
nnimap.el (nnimap-wait-for-response): Always look (at least) at the previous line.
nnimap.el (nnimap-quirk): New function.
 (nnimap-retrieve-group-data-early): Use it.
 (nnimap-quirks): New alist.
gnus.texi (Foreign Groups): Added clarification of foreign groups.
gnus-sum.el (gnus-summary-push-marks-to-backend): Fix the logic for copying read-ness to the backends.
gnus-group.el (gnus-group-kill-group): Notify the backend that the group has been killed.
 (gnus-group-yank-group): Ditto.
gnus-start.el (gnus-subscribe-newsgroup): Notify the backend.
nnir.el: Improve customizations.
gnus.texi (Archived Messages): Removed outdated comment and text.
nnfolder.el (nnfolder-save-all-buffers): Refactor out into its own function.
 (nnfolder-request-expire-articles): Save all the buffers after doing expiry.
nnmail.el (nnmail-expiry-target-group): Revert the "all articles are the last article", since that led to serious performance regressions when expiring nnml groups.
gnus-html.el (gnus-html-schedule-image-fetching): Make sure the HTML fetching stops when Gnus exits.
gnus-srvr.el: Avoid passing nil regexp argument to delete-matching-lines.
auth-source.el (auth-source-gpg-encrypt-to): New variable to set the list of recipient keys, or use symmetric encryption if not a list.
 (auth-source-create): Use it to make `epa-file-encrypt-to' local for an EPA override, replacing the call to `netrc-store-data'.

14 files changed:
doc/misc/ChangeLog
doc/misc/gnus.texi
lisp/gnus/ChangeLog
lisp/gnus/auth-source.el
lisp/gnus/gnus-group.el
lisp/gnus/gnus-html.el
lisp/gnus/gnus-int.el
lisp/gnus/gnus-srvr.el
lisp/gnus/gnus-start.el
lisp/gnus/gnus-sum.el
lisp/gnus/nnfolder.el
lisp/gnus/nnimap.el
lisp/gnus/nnir.el
lisp/gnus/nnmail.el

index 1d46f3857521d31fd11cd25aa6ad392d6c53cf70..66cbb24fb18894edcc8fd9a5c6de44b57baa97f9 100644 (file)
@@ -1,3 +1,11 @@
+2010-12-16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Archived Messages): Remove outdated text.
+
+2010-12-16  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus.texi (Foreign Groups): Added clarification of foreign groups.
+
 2010-12-15  Andrew Cohen  <cohen@andy.bu.edu>
 
        * gnus.texi (The hyrex Engine): Say that this engine as obsolete.
index 612f0296d90fed81f09c41d672f8badb61810025..356aa4b163afde4f1240c29908ea2d4827af9894 100644 (file)
@@ -2512,6 +2512,15 @@ the command to be executed.
 @section Foreign Groups
 @cindex foreign groups
 
+If you recall how to subscribe to servers (@pxref{Finding the News})
+you will remember that @code{gnus-secondary-select-methods} and
+@code{gnus-select-method} let you write a definition in Emacs Lisp of
+what servers you want to see when you start up.  The alternate
+approach is to use foreign servers and groups.  ``Foreign'' here means
+they are not coming from the select methods.  All foreign server
+configuration and subscriptions are stored only in the
+@file{~/.newsrc.eld} file.
+
 Below are some group mode commands for making and editing general foreign
 groups, as well as commands to ease the creation of a few
 special-purpose groups.  All these commands insert the newly created
@@ -12611,9 +12620,6 @@ messages in one file per month:
           (concat "mail." (format-time-string "%Y-%m")))))
 @end lisp
 
-@c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
-@c use a different value for @code{gnus-message-archive-group} there.)
-
 Now, when you send a message off, it will be stored in the appropriate
 group.  (If you want to disable storing for just one particular message,
 you can just remove the @code{Gcc} header that has been inserted.)  The
@@ -12625,11 +12631,6 @@ if (using @kbd{G r} in the group buffer) to something
 nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
 continue to be stored in the old (now empty) group.
 
-That's the default method of archiving sent messages.  Gnus offers a
-different way for the people who don't like the default method.  In that
-case you should set @code{gnus-message-archive-group} to @code{nil};
-this will disable archiving.
-
 @table @code
 @item gnus-gcc-mark-as-read
 @vindex gnus-gcc-mark-as-read
index 76565b3f19f65fe72dcddc767157b7b8a37cbeee..26538731932af838411b7f9454f65a649db3a314 100644 (file)
@@ -1,8 +1,65 @@
+2010-12-16  Daiki Ueno  <ueno@unixuser.org>
+
+       * auth-source.el (auth-source-gpg-encrypt-to): New variable to set the
+       list of recipient keys, or use symmetric encryption if not a list.
+       (auth-source-create): Use it to make `epa-file-encrypt-to' local for an
+       EPA override, replacing the call to `netrc-store-data'.
+
+2010-12-16  Dan Davison  <dandavison7@gmail.com>  (tiny change)
+
+       * gnus-srvr.el: Avoid passing nil regexp argument to
+       delete-matching-lines.
+
+2010-12-16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-html.el (gnus-html-schedule-image-fetching): Make sure the HTML
+       fetching stops when Gnus exits.
+
+       * nnfolder.el (nnfolder-save-all-buffers): Refactor out into its own
+       function.
+       (nnfolder-request-expire-articles): Save all the buffers after doing
+       expiry.
+
+       * nnmail.el (nnmail-expiry-target-group): Revert the "all articles are
+       the last article", since that led to serious performance regressions
+       when expiring nnml groups.
+
+2010-12-16  Andrew Cohen  <cohen@andy.bu.edu>
+
+       * nnir.el: Improve customizations.
+
+2010-12-16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-start.el (gnus-subscribe-newsgroup): Notify the backend.
+
+       * gnus-group.el (gnus-group-kill-group): Notify the backend that the
+       group has been killed.
+       (gnus-group-yank-group): Ditto.
+
+       * gnus-srvr.el (gnus-browse-unsubscribe-group): Ditto.
+
+       * nnimap.el (nnimap-request-update-group-status): New function.
+
+       * gnus-int.el (gnus-request-update-group-status): New interface
+       function.
+
+       * gnus-sum.el (gnus-summary-push-marks-to-backend): Fix the logic for
+       copying read-ness to the backends.
+
+       * nnimap.el (nnimap-quirk): New function.
+       (nnimap-retrieve-group-data-early): Use it.
+       (nnimap-quirks): New alist.
+
 2010-12-16  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * shr.el (shr-insert): Set shr-start after deleting trailing space;
        don't delete it within indentation.
 
+2010-12-16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnimap.el (nnimap-wait-for-response): Always look (at least) at the
+       previous line.
+
 2010-12-15  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * nnimap.el (nnimap-retrieve-group-data-early): Fix the syntax of the
index 20e4af189d98db37249ea5435feef43b4c7b252d..5d386302903926add57fc26753d7417342cc2b1d 100644 (file)
@@ -159,6 +159,15 @@ can get pretty complex."
                                                      (const :tag "Any" t)
                                                      (string :tag "Specific user name"))))))))
 
+(defcustom auth-source-gpg-encrypt-to t
+  "List of recipient keys that `authinfo.gpg' encrypted to.
+If the value is not a list, symmetric encryption will be used."
+  :group 'auth-source
+  :version "23.2" ;; No Gnus
+  :type '(choice (const :tag "Symmetric encryption" t)
+                (repeat :tag "Recipient public keys"
+                        (string :tag "Recipient public key"))))
+
 ;; temp for debugging
 ;; (unintern 'auth-source-protocols)
 ;; (unintern 'auth-sources)
@@ -352,9 +361,28 @@ Return structure as specified by MODE."
       ;; netrc interface.
       (when (y-or-n-p (format "Do you want to save this password in %s? "
                               source))
-        (netrc-store-data source host prot
-                          (or user (cdr (assoc "login" result)))
-                          (cdr (assoc "password" result))))))
+       ;; the code below is almost same as `netrc-store-data' except
+       ;; the `epa-file-encrypt-to' hack (see bug#7487).
+       (with-temp-buffer
+         (when (file-exists-p source)
+           (insert-file-contents source))
+         (when auth-source-gpg-encrypt-to
+           ;; making `epa-file-encrypt-to' local to this buffer lets
+           ;; epa-file skip the key selection query (see the
+           ;; `local-variable-p' check in `epa-file-write-region').
+           (unless (local-variable-p 'epa-file-encrypt-to)
+             (make-local-variable 'epa-file-encrypt-to))
+           (if (listp auth-source-gpg-encrypt-to)
+               (setq epa-file-encrypt-to auth-source-gpg-encrypt-to)))
+         (goto-char (point-max))
+         (unless (bolp)
+           (insert "\n"))
+         (insert (format "machine %s login %s password %s port %s\n"
+                         host
+                         (or user (cdr (assoc "login" result)))
+                         (cdr (assoc "password" result))
+                         prot))
+         (write-region (point-min) (point-max) source nil 'silent)))))
     (if (consp mode)
         (mapcar #'cdr result)
       (cdar result))))
index 5ece14571637e73937302c5bcd4b32ce37936091..73eeb7104caad31c3360648c2a74fbfa3df80945 100644 (file)
@@ -3781,6 +3781,7 @@ of groups killed."
                  gnus-list-of-killed-groups))
          (gnus-group-change-level
           (if entry entry group) gnus-level-killed (if entry nil level))
+         (gnus-request-update-group-status group 'unsubscribe)
          (message "Killed group %s" (gnus-group-decoded-name group)))
       ;; If there are lots and lots of groups to be killed, we use
       ;; this thing instead.
@@ -3803,7 +3804,8 @@ of groups killed."
          (setq gnus-zombie-list (delete group gnus-zombie-list))))
        ;; There may be more than one instance displayed.
        (while (gnus-group-goto-group group)
-         (gnus-delete-line)))
+         (gnus-delete-line))
+       (gnus-request-update-group-status group 'unsubscribe))
       (gnus-make-hashtable-from-newsrc-alist))
 
     (gnus-group-position-point)
@@ -3831,6 +3833,7 @@ yanked) a list of yanked groups is returned."
        (and prev (gnus-group-entry prev))
        t)
       (gnus-group-insert-group-line-info group)
+      (gnus-request-update-group-status group 'subscribe)
       (gnus-undo-register
        `(when (gnus-group-goto-group ,group)
           (gnus-group-kill-group 1))))
index 63a14b204fb6e04bdc42aac60adc77e0f5d94121..deeb3565bcf69d05cefe0b244d08fc06efd07cd4 100644 (file)
@@ -395,7 +395,7 @@ Use ALT-TEXT for the image string."
             4)
       (setq args (nconc args (list t))))
     (ignore-errors
-      (apply #'url-retrieve args))))
+      (push (apply #'url-retrieve args) gnus-buffers))))
 
 (defun gnus-html-image-fetched (status buffer image)
   "Callback function called when image has been fetched."
index 432845401255374efa94d9006733e7fc62bd63e3..71a9aa9e6180eaeea3007291edfa21b988958ed5 100644 (file)
@@ -473,6 +473,18 @@ If FETCH-OLD, retrieve all headers (or some subset thereof) in the group."
       (funcall (gnus-get-function gnus-command-method 'request-type)
               (gnus-group-real-name group) article))))
 
+(defun gnus-request-update-group-status (group status)
+  "Change the status of a group.
+Valid statuses include `subscribe' and `unsubscribe'."
+  (let ((gnus-command-method (gnus-find-method-for-group group)))
+    (if (not (gnus-check-backend-function
+             'request-update-group-status (car gnus-command-method)))
+       nil
+      (funcall
+       (gnus-get-function gnus-command-method 'request-update-group-status)
+       (gnus-group-real-name group) status
+       (nth 1 gnus-command-method)))))
+
 (defun gnus-request-set-mark (group action)
   "Set marks on articles in the back end."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
index 19fd5fe6636868650a082ad689b02bf945a690d9..acca5651e5e311e8670e60c2a81eff141fcb5696 100644 (file)
@@ -766,7 +766,8 @@ claim them."
       (with-current-buffer nntp-server-buffer
        (let ((cur (current-buffer)))
          (goto-char (point-min))
-         (unless (string= gnus-ignored-newsgroups "")
+         (unless (or (null gnus-ignored-newsgroups)
+                     (string= gnus-ignored-newsgroups ""))
            (delete-matching-lines gnus-ignored-newsgroups))
          ;; We treat NNTP as a special case to avoid problems with
          ;; garbage group names like `"foo' that appear in some badly
@@ -992,7 +993,8 @@ how new groups will be entered into the group buffer."
                ;; mechanism for new group subscription.
                (gnus-call-subscribe-functions
                 gnus-browse-subscribe-newsgroup-method
-                group)))
+                group)
+               (gnus-request-update-group-status group 'subscribe)))
            (delete-char 1)
            (insert (let ((lvl (gnus-group-level group)))
                      (cond
index d9e432736e288bde65784e200c52c77160f42e28..322c7d191e1baaca1b0aa7491a2fdffc4334f06d 100644 (file)
@@ -645,6 +645,7 @@ the first newsgroup."
     (gnus-group-change-level
      newsgroup gnus-level-default-subscribed
      gnus-level-killed (gnus-group-entry (or next "dummy.group")))
+    (gnus-request-update-group-status newsgroup 'subscribe)
     (gnus-message 5 "Subscribe newsgroup: %s" newsgroup)
     (run-hook-with-args 'gnus-subscribe-newsgroup-hooks newsgroup)
     t))
index a02172837578aab4bc5bf8296ccccd201eda7ced..ceaa014363a1315611514232e59b57a0904b415b 100644 (file)
@@ -9958,7 +9958,7 @@ ACTION can be either `move' (the default), `crosspost' or `copy'."
 (defun gnus-summary-push-marks-to-backend (article)
   (let ((set nil)
        (marks gnus-article-mark-lists))
-    (when (memq article gnus-newsgroup-unreads)
+    (unless (memq article gnus-newsgroup-unreads)
       (push 'read set))
     (while marks
       (when (and (eq (gnus-article-mark-to-type (cdar marks)) 'list)
index 5de8653948f7f47b9d27758eb289ba94b59e3574..f0a21c5a3e11b9c2ca1c98dc1f6564d65f13c574 100644 (file)
@@ -322,20 +322,20 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
   (when nnfolder-get-new-mail
     (nnfolder-possibly-change-group group server)
     (nnmail-get-new-mail
-     'nnfolder
-     (lambda ()
-       (let ((bufs nnfolder-buffer-alist))
-        (save-excursion
-          (while bufs
-            (if (not (gnus-buffer-live-p (nth 1 (car bufs))))
-                (setq nnfolder-buffer-alist
-                      (delq (car bufs) nnfolder-buffer-alist))
-              (set-buffer (nth 1 (car bufs)))
-              (nnfolder-save-buffer)
-              (kill-buffer (current-buffer)))
-            (setq bufs (cdr bufs))))))
-     nnfolder-directory
-     group)))
+     'nnfolder 'nnfolder-save-all-buffers
+     nnfolder-directory group)))
+
+(defun nnfolder-save-all-buffers ()
+  (let ((bufs nnfolder-buffer-alist))
+    (save-excursion
+      (while bufs
+       (if (not (gnus-buffer-live-p (nth 1 (car bufs))))
+           (setq nnfolder-buffer-alist
+                 (delq (car bufs) nnfolder-buffer-alist))
+         (set-buffer (nth 1 (car bufs)))
+         (nnfolder-save-buffer)
+         (kill-buffer (current-buffer)))
+       (setq bufs (cdr bufs))))))
 
 ;; Don't close the buffer if we're not shutting down the server.  This way,
 ;; we can keep the buffer in the group buffer cache, and not have to grovel
@@ -488,7 +488,8 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
       (nnfolder-save-buffer)
       (nnfolder-adjust-min-active newsgroup)
       (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)
-      (gnus-sorted-difference articles (nreverse deleted-articles)))))
+      (gnus-sorted-difference articles (nreverse deleted-articles)))
+    (nnfolder-save-all-buffers)))
 
 (deffoo nnfolder-request-move-article (article group server accept-form
                                               &optional last move-is-internal)
index ae1929d1bd5f1f8e8ae49e22027ebe58d8995248..d1d6d058421684f73bb7bfd094e4d6c341768dda 100644 (file)
@@ -139,6 +139,9 @@ textual parts.")
     (download "gnus-download")
     (forward "gnus-forward")))
 
+(defvar nnimap-quirks
+  '(("QRESYNC" "Zimbra" "QRESYNC ")))
+
 (defun nnimap-buffer ()
   (nnimap-find-process-buffer nntp-server-buffer))
 
@@ -897,6 +900,16 @@ textual parts.")
        (push flag flags)))
     flags))
 
+(deffoo nnimap-request-update-group-status (group status &optional server)
+  (when (nnimap-possibly-change-group nil server)
+    (let ((command (assoc
+                   status
+                   '((subscribe "SUBSCRIBE")
+                     (unsubscribe "UNSUBSCRIBE")))))
+      (when command
+       (with-current-buffer (nnimap-buffer)
+         (nnimap-command "%s %S" (cadr command) (utf7-encode group t)))))))
+
 (deffoo nnimap-request-set-mark (group actions &optional server)
   (when (nnimap-possibly-change-group group server)
     (let (sequence)
@@ -1080,8 +1093,9 @@ textual parts.")
                   uidvalidity
                   modseq)
              (push
-              (list (nnimap-send-command "EXAMINE %S (QRESYNC (%s %s))"
+              (list (nnimap-send-command "EXAMINE %S (%s (%s %s))"
                                          (utf7-encode group t)
+                                         (nnimap-quirk "QRESYNC")
                                          uidvalidity modseq)
                     'qresync
                     nil group 'qresync)
@@ -1107,6 +1121,15 @@ textual parts.")
                    sequences))))
        sequences))))
 
+(defun nnimap-quirk (command)
+  (let ((quirk (assoc command nnimap-quirks)))
+    ;; If this server is of a type that matches a quirk, then return
+    ;; the "quirked" command instead of the proper one.
+    (if (or (null quirk)
+           (not (string-match (nth 1 quirk) (nnimap-greeting nnimap-object))))
+       command
+      (nth 2 quirk))))
+
 (deffoo nnimap-finish-retrieve-group-infos (server infos sequences)
   (when (and sequences
             (nnimap-possibly-change-group nil server))
@@ -1541,7 +1564,11 @@ textual parts.")
                      (not (re-search-backward
                            (format "^%d .*\n" sequence)
                            (if nnimap-streaming
-                               (max (point-min) (- (point) 500))
+                               (max (point-min)
+                                    (- (point) 500)
+                                    (save-excursion
+                                      (forward-line -1)
+                                      (point)))
                              (point-min))
                            t)))
            (when messagep
index 0f07bb14062f4de5689dafe19a915b82c9062c2b..f2348bf40ad54d4233b6553221c2520c57513579 100644 (file)
@@ -305,13 +305,6 @@ is `(valuefunc member)'."
   "Search groups in Gnus with assorted seach engines."
   :group 'gnus)
 
-(defcustom nnir-method-default-engines
-  '((nnimap . imap)
-    (nntp . gmane))
-  "*Alist of default search engines keyed by server method."
-  :type '(alist)
-  :group 'nnir)
-
 (defcustom nnir-ignored-newsgroups ""
   "*A regexp to match newsgroups in the active file that should
   be skipped when searching."
@@ -329,7 +322,7 @@ with three items unique to nnir summary buffers:
 %g    Article original short group name (string)
 
 If nil this will use `gnus-summary-line-format'."
-  :type '(regexp)
+  :type '(string)
   :group 'nnir)
 
 (defcustom nnir-retrieve-headers-override-function nil
@@ -347,7 +340,8 @@ result, `gnus-retrieve-headers' will be called instead."
   "*The default IMAP search key for an nnir search. Must be one of
   the keys in `nnir-imap-search-arguments'. To use raw imap queries
   by default set this to \"Imap\"."
-  :type '(string)
+  :type `(choice ,@(mapcar (lambda (elem) (list 'const (car elem)))
+                          nnir-imap-search-arguments))
   :group 'nnir)
 
 (defcustom nnir-swish++-configuration-file
@@ -546,6 +540,18 @@ needs the variables `nnir-namazu-program',
 
 Add an entry here when adding a new search engine.")
 
+(defcustom nnir-method-default-engines
+  '((nnimap . imap)
+    (nntp . gmane))
+  "*Alist of default search engines keyed by server method."
+  :type `(repeat (cons (choice (const nnimap) (const nttp) (const nnspool)
+                              (const nneething) (const nndir) (const nnmbox)
+                              (const nnml) (const nnmh) (const nndraft)
+                              (const nnfolder) (const nnmaildir))
+                      (choice
+                       ,@(mapcar (lambda (elem) (list 'const (car elem)))
+                                 nnir-engines))))
+  :group 'nnir)
 
 ;; Gnus glue.
 
index 06b464c0b2911a7fb8d8e060b5254c1d9c2da9fe..c86e96bd18497f99d987d315a9fe1f819c8bd563 100644 (file)
@@ -1915,7 +1915,7 @@ If TIME is nil, then return the cutoff time for oldness instead."
     (unless (eq target 'delete)
       (when (or (gnus-request-group target)
                (gnus-request-create-group target))
-       (let ((group-art (gnus-request-accept-article target nil t t)))
+       (let ((group-art (gnus-request-accept-article target nil nil t)))
          (when (and (consp group-art)
                     (cdr group-art))
            (gnus-group-mark-article-read target (cdr group-art))))))))