aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert2011-02-15 16:09:42 -0800
committerPaul Eggert2011-02-15 16:09:42 -0800
commit393790ad8adefad895ad742246e8a4fa7f4d3246 (patch)
treef1a901eff7e14ea132ffbe988abb68906f43336b
parent9502925a798a3af3d40f67a30f30ced94d814f52 (diff)
parentca6ddb88b58e06b872912a8941ce96dad66da54f (diff)
downloademacs-393790ad8adefad895ad742246e8a4fa7f4d3246.tar.gz
emacs-393790ad8adefad895ad742246e8a4fa7f4d3246.zip
Merge from mainline.
-rw-r--r--doc/misc/ChangeLog6
-rw-r--r--doc/misc/auth.texi4
-rw-r--r--lisp/ChangeLog4
-rw-r--r--lisp/dired-x.el101
-rw-r--r--lisp/gnus/ChangeLog38
-rw-r--r--lisp/gnus/auth-source.el128
-rw-r--r--lisp/gnus/gnus-art.el9
-rw-r--r--lisp/gnus/gnus-msg.el8
-rw-r--r--lisp/gnus/gnus-start.el9
-rw-r--r--lisp/gnus/gnus-sum.el36
-rw-r--r--lisp/gnus/message.el5
-rw-r--r--lisp/gnus/nntp.el13
12 files changed, 198 insertions, 163 deletions
diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog
index 20463724c79..34096144066 100644
--- a/doc/misc/ChangeLog
+++ b/doc/misc/ChangeLog
@@ -3,6 +3,10 @@
3 Merge from gnulib. 3 Merge from gnulib.
4 * texinfo.tex: Update to version 2011-02-14.11. 4 * texinfo.tex: Update to version 2011-02-14.11.
5 5
62011-02-14 Teodor Zlatanov <tzz@lifelogs.com>
7
8 * auth.texi (Help for users): Login collection is "Login" and not "login".
9
62011-02-13 Michael Albinus <michael.albinus@gmx.de> 102011-02-13 Michael Albinus <michael.albinus@gmx.de>
7 11
8 * tramp.texi (History): Remove IMAP support. 12 * tramp.texi (History): Remove IMAP support.
@@ -21,7 +25,7 @@
21 25
22 * sc.texi (Getting Connected): Remove old index entries. 26 * sc.texi (Getting Connected): Remove old index entries.
23 27
242011-02-12 Ulrich Mueller <ulm@gentoo.org> 282011-02-12 Ulrich Mueller <ulm@gentoo.org>
25 29
26 * url.texi: Remove duplicate @dircategory (Bug#7942). 30 * url.texi: Remove duplicate @dircategory (Bug#7942).
27 31
diff --git a/doc/misc/auth.texi b/doc/misc/auth.texi
index 2541dba9873..020c582305c 100644
--- a/doc/misc/auth.texi
+++ b/doc/misc/auth.texi
@@ -161,8 +161,8 @@ and simplest configuration is:
161(setq auth-sources '((:source "~/.authinfo.gpg"))) 161(setq auth-sources '((:source "~/.authinfo.gpg")))
162;;; even shorter and the @emph{default}: 162;;; even shorter and the @emph{default}:
163(setq auth-sources '("~/.authinfo.gpg" "~/.authinfo")) 163(setq auth-sources '("~/.authinfo.gpg" "~/.authinfo"))
164;;; use the Secrets API @var{login} collection (@pxref{Secret Service API}) 164;;; use the Secrets API @var{Login} collection (@pxref{Secret Service API})
165(setq auth-sources '("secrets:login")) 165(setq auth-sources '("secrets:Login"))
166@end lisp 166@end lisp
167 167
168By adding multiple entries to @code{auth-sources} with a particular 168By adding multiple entries to @code{auth-sources} with a particular
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 742cbfc9267..a9adce5a3f5 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,7 @@
12011-02-15 Glenn Morris <rgm@gnu.org>
2
3 * dired-x.el: Use easymenu for menu items. Fix item capitalization.
4
12011-02-14 Chong Yidong <cyd@stupidchicken.com> 52011-02-14 Chong Yidong <cyd@stupidchicken.com>
2 6
3 * vc/vc-git.el (vc-git-root-log-format): New option for 7 * vc/vc-git.el (vc-git-root-log-format): New option for
diff --git a/lisp/dired-x.el b/lisp/dired-x.el
index 8011b4d32a4..95381ccdc0c 100644
--- a/lisp/dired-x.el
+++ b/lisp/dired-x.el
@@ -231,69 +231,44 @@ to nil: a pipe using `zcat' or `gunzip -c' will be used."
231 231
232;;; MENU BINDINGS 232;;; MENU BINDINGS
233 233
234(let ((menu-bar (lookup-key dired-mode-map [menu-bar]))) 234(require 'easymenu)
235 (let ((menu (lookup-key menu-bar [operate]))) 235
236 (define-key-after 236(let ((menu (lookup-key dired-mode-map [menu-bar])))
237 menu 237 (easy-menu-add-item menu '("Operate")
238 [find-files] 238 ["Find Files" dired-do-find-marked-files
239 '(menu-item 239 :help "Find current or marked files"]
240 "Find files" 240 "Shell Command...")
241 dired-do-find-marked-files 241 (easy-menu-add-item menu '("Operate")
242 :help "Find current or marked files") 242 ["Relative Symlink to..." dired-do-relsymlink
243 'delete) 243 :visible (fboundp 'make-symbolic-link)
244 (define-key-after 244 :help "Make relative symbolic links for current or \
245 menu 245marked files"]
246 [relsymlink] 246 "Hardlink to...")
247 '(menu-item 247 (easy-menu-add-item menu '("Mark")
248 "Relative symlink to..." 248 ["Flag Extension..." dired-flag-extension
249 dired-do-relsymlink 249 :help "Flag files with a certain extension for deletion"]
250 :visible (fboundp 'make-symbolic-link) 250 "Mark Executables")
251 :help "Make relative symbolic links for current or marked files") 251 (easy-menu-add-item menu '("Mark")
252 'symlink)) 252 ["Mark Extension..." dired-mark-extension
253 (let ((menu (lookup-key menu-bar [mark]))) 253 :help "Mark files with a certain extension"]
254 (define-key-after 254 "Unmark All")
255 menu 255 (easy-menu-add-item menu '("Mark")
256 [flag-extension] 256 ["Mark Omitted" dired-mark-omitted
257 '(menu-item 257 :help "Mark files matching `dired-omit-files' \
258 "Flag extension..." 258and `dired-omit-extensions'"]
259 dired-flag-extension 259 "Unmark All")
260 :help "Flag files with a certain extension for deletion") 260 (easy-menu-add-item menu '("Regexp")
261 'garbage-files) 261 ["Relative Symlink..." dired-do-relsymlink-regexp
262 (define-key-after 262 :visible (fboundp 'make-symbolic-link)
263 menu 263 :help "Make relative symbolic links for files \
264 [mark-extension] 264matching regexp"]
265 '(menu-item 265 "Hardlink...")
266 "Mark extension..." 266 (easy-menu-add-item menu '("Immediate")
267 dired-mark-extension 267 ["Omit Mode" dired-omit-mode
268 :help "Mark files with a certain extension") 268 :style toggle :selected dired-omit-mode
269 'symlinks) 269 :help "Enable or disable omitting \"uninteresting\" \
270 (define-key-after 270files"]
271 menu 271 "Refresh"))
272 [mark-omitted]
273 '(menu-item
274 "Mark omitted"
275 dired-mark-omitted
276 :help "Mark files matching `dired-omit-files' and `dired-omit-extensions'")
277 'mark-extension))
278 (let ((menu (lookup-key menu-bar [regexp])))
279 (define-key-after
280 menu
281 [relsymlink-regexp]
282 '(menu-item
283 "Relative symlink..."
284 dired-do-relsymlink-regexp
285 :visible (fboundp 'make-symbolic-link)
286 :help "Make relative symbolic links for files matching regexp")
287 'symlink))
288 (let ((menu (lookup-key menu-bar [immediate])))
289 (define-key-after
290 menu
291 [omit-mode]
292 '(menu-item
293 "Omit mode" dired-omit-mode
294 :button (:toggle . dired-omit-mode)
295 :help "Enable or disable omitting \"uninteresting\" files")
296 'dashes)))
297 272
298;;; GLOBAL BINDING. 273;;; GLOBAL BINDING.
299(when dired-bind-jump 274(when dired-bind-jump
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index 747f71f835a..91ba9e5a359 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,11 +1,49 @@
12011-02-15 Teodor Zlatanov <tzz@lifelogs.com>
2
3 * auth-source.el (auth-source-debug): Enable by default and don't
4 mention the obsolete `auth-source-hide-passwords'.
5 (auth-source-do-warn): New function to debug unconditionally.
6 (auth-source-do-debug): Use it.
7 (auth-source-backend-parse): Use it for invalid `auth-sources' entries
8 and for Secrets API entries when the secrets.el library is not
9 available.
10
112011-02-14 Lars Ingebrigtsen <larsi@gnus.org>
12
13 * gnus-sum.el (gnus-propagate-marks): Default to nil.
14 (gnus-summary-exit): Kill the correct article buffer on exit from a
15 `C-d' group.
16
17 * gnus-start.el (gnus-use-backend-marks): Removed, since it duplicates
18 gnus-propagate-marks.
19
20 * gnus-sum.el (gnus-summary-exit-no-update): Restore the group conf
21 before killing the buffers so that a non-full window conf gets handled
22 correctly.
23 (gnus-summary-exit): Ditto.
24 (gnus-summary-read-group-1): Ditto.
25
26 * nntp.el (nntp-retrieve-group-data-early): Reinstate the two-part
27 async code again so that we can debug it properly.
28
29 * message.el (message-reply): Take an optional switch-buffer parameter
30 so that Gnus window confs are respected better.
31
12011-02-14 Teodor Zlatanov <tzz@lifelogs.com> 322011-02-14 Teodor Zlatanov <tzz@lifelogs.com>
2 33
3 * auth-source.el (auth-source-backend-parse-parameters): Don't rely on 34 * auth-source.el (auth-source-backend-parse-parameters): Don't rely on
4 `plist-get' to accept non-list parameters (XEmacs issue). Fix 35 `plist-get' to accept non-list parameters (XEmacs issue). Fix
5 docstring. 36 docstring.
37 (auth-source-secrets-search): Use `delete-dups', `append mapcar', and
38 `butlast' instead of `remove-duplicates', `mapcan', and `subseq'.
39 (auth-sources, auth-source-backend-parse, auth-source-secrets-search):
40 Login collection is "Login" and not "login".
6 41
72011-02-14 Lars Ingebrigtsen <larsi@gnus.org> 422011-02-14 Lars Ingebrigtsen <larsi@gnus.org>
8 43
44 * gnus-art.el (article-update-date-lapsed): Don't bug out when updating
45 multiple headers.
46
9 * nnimap.el (nnimap-inhibit-logging): New variable. 47 * nnimap.el (nnimap-inhibit-logging): New variable.
10 (nnimap-log-command): Don't log login commands. 48 (nnimap-log-command): Don't log login commands.
11 49
diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el
index be698ad35d0..a259c5c2f0b 100644
--- a/lisp/gnus/auth-source.el
+++ b/lisp/gnus/auth-source.el
@@ -135,14 +135,15 @@
135 :version "23.2" ;; No Gnus 135 :version "23.2" ;; No Gnus
136 :type `boolean) 136 :type `boolean)
137 137
138(defcustom auth-source-debug nil 138(defcustom auth-source-debug t
139 "Whether auth-source should log debug messages. 139 "Whether auth-source should log debug messages.
140Also see `auth-source-hide-passwords'.
141 140
142If the value is nil, debug messages are not logged. 141If the value is nil, debug messages are not logged.
143If the value is t, debug messages are logged with `message'. 142
144 In that case, your authentication data will be in the 143If the value is t, debug messages are logged with `message'. In
145 clear (except for passwords, which are always stripped out). 144that case, your authentication data will be in the clear (except
145for passwords).
146
146If the value is a function, debug messages are logged by calling 147If the value is a function, debug messages are logged by calling
147 that function using the same arguments as `message'." 148 that function using the same arguments as `message'."
148 :group 'auth-source 149 :group 'auth-source
@@ -173,7 +174,7 @@ can get pretty complex."
173 (choice 174 (choice
174 (string :tag "Just a file") 175 (string :tag "Just a file")
175 (const :tag "Default Secrets API Collection" 'default) 176 (const :tag "Default Secrets API Collection" 'default)
176 (const :tag "Login Secrets API Collection" "secrets:login") 177 (const :tag "Login Secrets API Collection" "secrets:Login")
177 (const :tag "Temp Secrets API Collection" "secrets:session") 178 (const :tag "Temp Secrets API Collection" "secrets:session")
178 (list :tag "Source definition" 179 (list :tag "Source definition"
179 (const :format "" :value :source) 180 (const :format "" :value :source)
@@ -185,7 +186,7 @@ can get pretty complex."
185 (choice :tag "Collection to use" 186 (choice :tag "Collection to use"
186 (string :tag "Collection name") 187 (string :tag "Collection name")
187 (const :tag "Default" 'default) 188 (const :tag "Default" 'default)
188 (const :tag "Login" "login") 189 (const :tag "Login" "Login")
189 (const 190 (const
190 :tag "Temporary" "session")))) 191 :tag "Temporary" "session"))))
191 (repeat :tag "Extra Parameters" :inline t 192 (repeat :tag "Extra Parameters" :inline t
@@ -235,36 +236,40 @@ If the value is not a list, symmetric encryption will be used."
235;; (auth-source-user-or-password-imap "password" "imap.myhost.com") 236;; (auth-source-user-or-password-imap "password" "imap.myhost.com")
236;; (auth-source-protocol-defaults 'imap) 237;; (auth-source-protocol-defaults 'imap)
237 238
238;; (let ((auth-source-debug 'debug)) (auth-source-debug "hello")) 239;; (let ((auth-source-debug 'debug)) (auth-source-do-debug "hello"))
239;; (let ((auth-source-debug t)) (auth-source-debug "hello")) 240;; (let ((auth-source-debug t)) (auth-source-do-debug "hello"))
240;; (let ((auth-source-debug nil)) (auth-source-debug "hello")) 241;; (let ((auth-source-debug nil)) (auth-source-do-debug "hello"))
241(defun auth-source-do-debug (&rest msg) 242(defun auth-source-do-debug (&rest msg)
242 ;; set logger to either the function in auth-source-debug or 'message
243 ;; note that it will be 'message if auth-source-debug is nil, so
244 ;; we also check the value
245 (when auth-source-debug 243 (when auth-source-debug
246 (let ((logger (if (functionp auth-source-debug) 244 (apply 'auth-source-do-warn msg)))
247 auth-source-debug 245
248 'message))) 246(defun auth-source-do-warn (&rest msg)
249 (apply logger msg)))) 247 (apply
248 ;; set logger to either the function in auth-source-debug or 'message
249 ;; note that it will be 'message if auth-source-debug is nil
250 (if (functionp auth-source-debug)
251 auth-source-debug
252 'message)
253 msg))
254
250 255
251;; (auth-source-pick nil :host "any" :protocol 'imap :user "joe") 256;; (auth-source-pick nil :host "any" :protocol 'imap :user "joe")
252;; (auth-source-pick t :host "any" :protocol 'imap :user "joe") 257;; (auth-source-pick t :host "any" :protocol 'imap :user "joe")
253;; (setq auth-sources '((:source (:secrets default) :host t :protocol t :user "joe") 258;; (setq auth-sources '((:source (:secrets default) :host t :protocol t :user "joe")
254;; (:source (:secrets "session") :host t :protocol t :user "joe") 259;; (:source (:secrets "session") :host t :protocol t :user "joe")
255;; (:source (:secrets "login") :host t :protocol t) 260;; (:source (:secrets "Login") :host t :protocol t)
256;; (:source "~/.authinfo.gpg" :host t :protocol t))) 261;; (:source "~/.authinfo.gpg" :host t :protocol t)))
257 262
258;; (setq auth-sources '((:source (:secrets default) :host t :protocol t :user "joe") 263;; (setq auth-sources '((:source (:secrets default) :host t :protocol t :user "joe")
259;; (:source (:secrets "session") :host t :protocol t :user "joe") 264;; (:source (:secrets "session") :host t :protocol t :user "joe")
260;; (:source (:secrets "login") :host t :protocol t) 265;; (:source (:secrets "Login") :host t :protocol t)
261;; )) 266;; ))
262 267
263;; (setq auth-sources '((:source "~/.authinfo.gpg" :host t :protocol t))) 268;; (setq auth-sources '((:source "~/.authinfo.gpg" :host t :protocol t)))
264 269
265;; (auth-source-backend-parse "myfile.gpg") 270;; (auth-source-backend-parse "myfile.gpg")
266;; (auth-source-backend-parse 'default) 271;; (auth-source-backend-parse 'default)
267;; (auth-source-backend-parse "secrets:login") 272;; (auth-source-backend-parse "secrets:Login")
268 273
269(defun auth-source-backend-parse (entry) 274(defun auth-source-backend-parse (entry)
270 "Creates an auth-source-backend from an ENTRY in `auth-sources'." 275 "Creates an auth-source-backend from an ENTRY in `auth-sources'."
@@ -307,21 +312,28 @@ If the value is not a list, symmetric encryption will be used."
307 "session"))) 312 "session")))
308 313
309 ;; if the source is a symbol, we look for the alias named so, 314 ;; if the source is a symbol, we look for the alias named so,
310 ;; and if that alias is missing, we use "login" 315 ;; and if that alias is missing, we use "Login"
311 (when (symbolp source) 316 (when (symbolp source)
312 (setq source (or (secrets-get-alias (symbol-name source)) 317 (setq source (or (secrets-get-alias (symbol-name source))
313 "login"))) 318 "Login")))
314 319
315 (auth-source-backend 320 (if (featurep 'secrets)
316 (format "Secrets API (%s)" source) 321 (auth-source-backend
317 :source source 322 (format "Secrets API (%s)" source)
318 :type 'secrets 323 :source source
319 :search-function 'auth-source-secrets-search 324 :type 'secrets
320 :create-function 'auth-source-secrets-create))) 325 :search-function 'auth-source-secrets-search
326 :create-function 'auth-source-secrets-create)
327 (auth-source-do-warn
328 "auth-source-backend-parse: no Secrets API, ignoring spec: %S" entry)
329 (auth-source-backend
330 (format "Ignored Secrets API (%s)" source)
331 :source ""
332 :type 'ignore))))
321 333
322 ;; none of them 334 ;; none of them
323 (t 335 (t
324 (auth-source-do-debug 336 (auth-source-do-warn
325 "auth-source-backend-parse: invalid backend spec: %S" entry) 337 "auth-source-backend-parse: invalid backend spec: %S" entry)
326 (auth-source-backend 338 (auth-source-backend
327 "Empty" 339 "Empty"
@@ -938,8 +950,8 @@ See `auth-source-search' for details on SPEC."
938;;; (let ((auth-sources '(default))) (auth-source-search :max 1 :delete t)) 950;;; (let ((auth-sources '(default))) (auth-source-search :max 1 :delete t))
939;;; (let ((auth-sources '(default))) (auth-source-search :max 1)) 951;;; (let ((auth-sources '(default))) (auth-source-search :max 1))
940;;; (let ((auth-sources '(default))) (auth-source-search)) 952;;; (let ((auth-sources '(default))) (auth-source-search))
941;;; (let ((auth-sources '("secrets:login"))) (auth-source-search :max 1)) 953;;; (let ((auth-sources '("secrets:Login"))) (auth-source-search :max 1))
942;;; (let ((auth-sources '("secrets:login"))) (auth-source-search :max 1 :signon_realm "https://git.gnus.org/Git")) 954;;; (let ((auth-sources '("secrets:Login"))) (auth-source-search :max 1 :signon_realm "https://git.gnus.org/Git"))
943 955
944(defun* auth-source-secrets-search (&rest 956(defun* auth-source-secrets-search (&rest
945 spec 957 spec
@@ -957,23 +969,23 @@ matching, do a wider search and narrow it down yourself.
957 969
958You'll get back all the properties of the token as a plist. 970You'll get back all the properties of the token as a plist.
959 971
960Here's an example that looks for the first item in the 'login' 972Here's an example that looks for the first item in the 'Login'
961Secrets collection: 973Secrets collection:
962 974
963 \(let ((auth-sources '(\"secrets:login\"))) 975 \(let ((auth-sources '(\"secrets:Login\")))
964 (auth-source-search :max 1) 976 (auth-source-search :max 1)
965 977
966Here's another that looks for the first item in the 'login' 978Here's another that looks for the first item in the 'Login'
967Secrets collection whose label contains 'gnus': 979Secrets collection whose label contains 'gnus':
968 980
969 \(let ((auth-sources '(\"secrets:login\"))) 981 \(let ((auth-sources '(\"secrets:Login\")))
970 (auth-source-search :max 1 :label \"gnus\") 982 (auth-source-search :max 1 :label \"gnus\")
971 983
972And this one looks for the first item in the 'login' Secrets 984And this one looks for the first item in the 'Login' Secrets
973collection that's a Google Chrome entry for the git.gnus.org site 985collection that's a Google Chrome entry for the git.gnus.org site
974login: 986authentication tokens:
975 987
976 \(let ((auth-sources '(\"secrets:login\"))) 988 \(let ((auth-sources '(\"secrets:Login\")))
977 (auth-source-search :max 1 :signon_realm \"https://git.gnus.org/Git\")) 989 (auth-source-search :max 1 :signon_realm \"https://git.gnus.org/Git\"))
978" 990"
979 991
@@ -993,21 +1005,23 @@ login:
993 collect (nth i spec))) 1005 collect (nth i spec)))
994 ;; build a search spec without the ignored keys 1006 ;; build a search spec without the ignored keys
995 ;; if a search key is nil or t (match anything), we skip it 1007 ;; if a search key is nil or t (match anything), we skip it
996 (search-spec (mapcan (lambda (k) (if (or (null (plist-get spec k)) 1008 (search-spec (apply 'append (mapcar
997 (eq t (plist-get spec k))) 1009 (lambda (k)
998 nil 1010 (if (or (null (plist-get spec k))
999 (list k (plist-get spec k)))) 1011 (eq t (plist-get spec k)))
1000 search-keys)) 1012 nil
1013 (list k (plist-get spec k))))
1014 search-keys)))
1001 ;; needed keys (always including host, login, protocol, and secret) 1015 ;; needed keys (always including host, login, protocol, and secret)
1002 (returned-keys (remove-duplicates (append 1016 (returned-keys (delete-dups (append
1003 '(:host :login :protocol :secret) 1017 '(:host :login :protocol :secret)
1004 search-keys))) 1018 search-keys)))
1005 (items (loop for item in (apply 'secrets-search-items coll search-spec) 1019 (items (loop for item in (apply 'secrets-search-items coll search-spec)
1006 unless (and (stringp label) 1020 unless (and (stringp label)
1007 (not (string-match label item))) 1021 (not (string-match label item)))
1008 collect item)) 1022 collect item))
1009 ;; TODO: respect max in `secrets-search-items', not after the fact 1023 ;; TODO: respect max in `secrets-search-items', not after the fact
1010 (items (subseq items 0 (min (length items) max))) 1024 (items (butlast items (- (length items) max)))
1011 ;; convert the item name to a full plist 1025 ;; convert the item name to a full plist
1012 (items (mapcar (lambda (item) 1026 (items (mapcar (lambda (item)
1013 (append 1027 (append
@@ -1017,18 +1031,20 @@ login:
1017 (lexical-let ((v (secrets-get-secret coll item))) 1031 (lexical-let ((v (secrets-get-secret coll item)))
1018 (lambda () v))) 1032 (lambda () v)))
1019 ;; rewrite the entry from ((k1 v1) (k2 v2)) to plist 1033 ;; rewrite the entry from ((k1 v1) (k2 v2)) to plist
1020 (mapcan (lambda (entry) 1034 (apply 'append
1021 (list (car entry) (cdr entry))) 1035 (mapcar (lambda (entry)
1022 (secrets-get-attributes coll item)))) 1036 (list (car entry) (cdr entry)))
1037 (secrets-get-attributes coll item)))))
1023 items)) 1038 items))
1024 ;; ensure each item has each key in `returned-keys' 1039 ;; ensure each item has each key in `returned-keys'
1025 (items (mapcar (lambda (plist) 1040 (items (mapcar (lambda (plist)
1026 (append 1041 (append
1027 (mapcan (lambda (req) 1042 (apply 'append
1028 (if (plist-get plist req) 1043 (mapcar (lambda (req)
1029 nil 1044 (if (plist-get plist req)
1030 (list req nil))) 1045 nil
1031 returned-keys) 1046 (list req nil)))
1047 returned-keys))
1032 plist)) 1048 plist))
1033 items))) 1049 items)))
1034 items)) 1050 items))
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index 3e1630804f7..82ad4974fd4 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -3641,10 +3641,11 @@ function and want to see what the date was before converting."
3641 (let ((type (get-text-property (match-beginning 0) 3641 (let ((type (get-text-property (match-beginning 0)
3642 'gnus-date-type))) 3642 'gnus-date-type)))
3643 (when (memq type '(lapsed combined-lapsed user-format)) 3643 (when (memq type '(lapsed combined-lapsed user-format))
3644 (unless (= window-start 3644 (when (and window-start
3645 (save-excursion 3645 (not (= window-start
3646 (forward-line 1) 3646 (save-excursion
3647 (point))) 3647 (forward-line 1)
3648 (point)))))
3648 (setq window-start nil)) 3649 (setq window-start nil))
3649 (save-excursion 3650 (save-excursion
3650 (article-date-ut type t (match-beginning 0))) 3651 (article-date-ut type t (match-beginning 0)))
diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el
index 08fef2327ad..b199dcc572c 100644
--- a/lisp/gnus/gnus-msg.el
+++ b/lisp/gnus/gnus-msg.el
@@ -1081,14 +1081,14 @@ If VERY-WIDE, make a very wide reply."
1081 (gnus-summary-work-articles 1)))) 1081 (gnus-summary-work-articles 1))))
1082 ;; Allow user to require confirmation before replying by mail to the 1082 ;; Allow user to require confirmation before replying by mail to the
1083 ;; author of a news article (or mail message). 1083 ;; author of a news article (or mail message).
1084 (when (or 1084 (when (or (not (or (gnus-news-group-p gnus-newsgroup-name)
1085 (not (or (gnus-news-group-p gnus-newsgroup-name)
1086 gnus-confirm-treat-mail-like-news)) 1085 gnus-confirm-treat-mail-like-news))
1087 (not (cond ((stringp gnus-confirm-mail-reply-to-news) 1086 (not (cond ((stringp gnus-confirm-mail-reply-to-news)
1088 (string-match gnus-confirm-mail-reply-to-news 1087 (string-match gnus-confirm-mail-reply-to-news
1089 gnus-newsgroup-name)) 1088 gnus-newsgroup-name))
1090 ((functionp gnus-confirm-mail-reply-to-news) 1089 ((functionp gnus-confirm-mail-reply-to-news)
1091 (funcall gnus-confirm-mail-reply-to-news gnus-newsgroup-name)) 1090 (funcall gnus-confirm-mail-reply-to-news
1091 gnus-newsgroup-name))
1092 (t gnus-confirm-mail-reply-to-news))) 1092 (t gnus-confirm-mail-reply-to-news)))
1093 (if (or wide very-wide) 1093 (if (or wide very-wide)
1094 t ;; Ignore gnus-confirm-mail-reply-to-news for wide and very 1094 t ;; Ignore gnus-confirm-mail-reply-to-news for wide and very
@@ -1123,7 +1123,7 @@ If VERY-WIDE, make a very wide reply."
1123 (insert headers)) 1123 (insert headers))
1124 (goto-char (point-max))) 1124 (goto-char (point-max)))
1125 (mml-quote-region (point) (point-max)) 1125 (mml-quote-region (point) (point-max))
1126 (message-reply nil wide) 1126 (message-reply nil wide 'switch-to-buffer)
1127 (when yank 1127 (when yank
1128 (gnus-inews-yank-articles yank)) 1128 (gnus-inews-yank-articles yank))
1129 (gnus-summary-handle-replysign))))) 1129 (gnus-summary-handle-replysign)))))
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index b8a6be8702e..b493a93d40c 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -380,13 +380,6 @@ disc."
380 :group 'gnus-newsrc 380 :group 'gnus-newsrc
381 :type 'boolean) 381 :type 'boolean)
382 382
383(defcustom gnus-use-backend-marks nil
384 "If non-nil, Gnus will store and retrieve marks from the backends.
385This means that marks will be stored both in .newsrc.eld and in
386the backend, and will slow operation down somewhat."
387 :group 'gnus-newsrc
388 :type 'boolean)
389
390(defcustom gnus-check-bogus-groups-hook nil 383(defcustom gnus-check-bogus-groups-hook nil
391 "A hook run after removing bogus groups." 384 "A hook run after removing bogus groups."
392 :group 'gnus-start-server 385 :group 'gnus-start-server
@@ -1509,7 +1502,7 @@ If SCAN, request a scan of that group as well."
1509 (gnus-activate-group (gnus-info-group info) nil t)) 1502 (gnus-activate-group (gnus-info-group info) nil t))
1510 1503
1511 ;; Allow backends to update marks, 1504 ;; Allow backends to update marks,
1512 (when gnus-use-backend-marks 1505 (when gnus-propagate-marks
1513 (let ((method (inline (gnus-find-method-for-group 1506 (let ((method (inline (gnus-find-method-for-group
1514 (gnus-info-group info))))) 1507 (gnus-info-group info)))))
1515 (when (gnus-check-backend-function 'request-marks (car method)) 1508 (when (gnus-check-backend-function 'request-marks (car method))
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 8fac5021df3..4dfc79a8883 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -1234,9 +1234,11 @@ For example: ((1 . cn-gb-2312) (2 . big5))."
1234 :type 'boolean 1234 :type 'boolean
1235 :group 'gnus-summary-marks) 1235 :group 'gnus-summary-marks)
1236 1236
1237(defcustom gnus-propagate-marks t 1237(defcustom gnus-propagate-marks nil
1238 "If non-nil, do not propagate marks to the backends." 1238 "If non-nil, Gnus will store and retrieve marks from the backends.
1239 :version "23.1" ;; No Gnus 1239This means that marks will be stored both in .newsrc.eld and in
1240the backend, and will slow operation down somewhat."
1241 :version "24.1"
1240 :type 'boolean 1242 :type 'boolean
1241 :group 'gnus-summary-marks) 1243 :group 'gnus-summary-marks)
1242 1244
@@ -4067,6 +4069,7 @@ If NO-DISPLAY, don't generate a summary buffer."
4067 ;; gnus-summary-prepare-hook since kill processing may not 4069 ;; gnus-summary-prepare-hook since kill processing may not
4068 ;; work with hidden articles. 4070 ;; work with hidden articles.
4069 (gnus-summary-maybe-hide-threads) 4071 (gnus-summary-maybe-hide-threads)
4072 (gnus-configure-windows 'summary)
4070 (when kill-buffer 4073 (when kill-buffer
4071 (gnus-kill-or-deaden-summary kill-buffer)) 4074 (gnus-kill-or-deaden-summary kill-buffer))
4072 (gnus-summary-auto-select-subject) 4075 (gnus-summary-auto-select-subject)
@@ -4076,7 +4079,6 @@ If NO-DISPLAY, don't generate a summary buffer."
4076 gnus-newsgroup-unreads 4079 gnus-newsgroup-unreads
4077 gnus-auto-select-first) 4080 gnus-auto-select-first)
4078 (progn 4081 (progn
4079 (gnus-configure-windows 'summary)
4080 (let ((art (gnus-summary-article-number))) 4082 (let ((art (gnus-summary-article-number)))
4081 (unless (and (not gnus-plugged) 4083 (unless (and (not gnus-plugged)
4082 (or (memq art gnus-newsgroup-undownloaded) 4084 (or (memq art gnus-newsgroup-undownloaded)
@@ -7168,6 +7170,7 @@ If FORCE (the prefix), also save the .newsrc file(s)."
7168 (let* ((group gnus-newsgroup-name) 7170 (let* ((group gnus-newsgroup-name)
7169 (quit-config (gnus-group-quit-config gnus-newsgroup-name)) 7171 (quit-config (gnus-group-quit-config gnus-newsgroup-name))
7170 (gnus-group-is-exiting-p t) 7172 (gnus-group-is-exiting-p t)
7173 (article-buffer gnus-article-buffer)
7171 (mode major-mode) 7174 (mode major-mode)
7172 (group-point nil) 7175 (group-point nil)
7173 (buf (current-buffer))) 7176 (buf (current-buffer)))
@@ -7220,16 +7223,6 @@ If FORCE (the prefix), also save the .newsrc file(s)."
7220 (when (eq mode 'gnus-summary-mode) 7223 (when (eq mode 'gnus-summary-mode)
7221 (gnus-kill-buffer buf))) 7224 (gnus-kill-buffer buf)))
7222 7225
7223 ;; If we have several article buffers, we kill them at exit.
7224 (unless gnus-single-article-buffer
7225 (when (gnus-buffer-live-p gnus-article-buffer)
7226 (with-current-buffer gnus-article-buffer
7227 ;; Don't kill sticky article buffers
7228 (unless (eq major-mode 'gnus-sticky-article-mode)
7229 (gnus-kill-buffer gnus-article-buffer)
7230 (setq gnus-article-current nil))))
7231 (gnus-kill-buffer gnus-original-article-buffer))
7232
7233 (setq gnus-current-select-method gnus-select-method) 7226 (setq gnus-current-select-method gnus-select-method)
7234 (set-buffer gnus-group-buffer) 7227 (set-buffer gnus-group-buffer)
7235 (if quit-config 7228 (if quit-config
@@ -7241,6 +7234,17 @@ If FORCE (the prefix), also save the .newsrc file(s)."
7241 (if win (set-window-point win (point)))) 7234 (if win (set-window-point win (point))))
7242 (unless leave-hidden 7235 (unless leave-hidden
7243 (gnus-configure-windows 'group 'force))) 7236 (gnus-configure-windows 'group 'force)))
7237
7238 ;; If we have several article buffers, we kill them at exit.
7239 (unless gnus-single-article-buffer
7240 (when (gnus-buffer-live-p article-buffer)
7241 (with-current-buffer article-buffer
7242 ;; Don't kill sticky article buffers
7243 (unless (eq major-mode 'gnus-sticky-article-mode)
7244 (gnus-kill-buffer article-buffer)
7245 (setq gnus-article-current nil))))
7246 (gnus-kill-buffer gnus-original-article-buffer))
7247
7244 ;; Clear the current group name. 7248 ;; Clear the current group name.
7245 (unless quit-config 7249 (unless quit-config
7246 (setq gnus-newsgroup-name nil))))) 7250 (setq gnus-newsgroup-name nil)))))
@@ -7269,6 +7273,8 @@ If FORCE (the prefix), also save the .newsrc file(s)."
7269 (gnus-kill-buffer gnus-article-buffer) 7273 (gnus-kill-buffer gnus-article-buffer)
7270 (gnus-kill-buffer gnus-original-article-buffer) 7274 (gnus-kill-buffer gnus-original-article-buffer)
7271 (setq gnus-article-current nil)) 7275 (setq gnus-article-current nil))
7276 ;; Return to the group buffer.
7277 (gnus-configure-windows 'group 'force)
7272 (if (not gnus-kill-summary-on-exit) 7278 (if (not gnus-kill-summary-on-exit)
7273 (gnus-deaden-summary) 7279 (gnus-deaden-summary)
7274 (gnus-close-group group) 7280 (gnus-close-group group)
@@ -7280,8 +7286,6 @@ If FORCE (the prefix), also save the .newsrc file(s)."
7280 (gnus-async-prefetch-remove-group group) 7286 (gnus-async-prefetch-remove-group group)
7281 (when (get-buffer gnus-article-buffer) 7287 (when (get-buffer gnus-article-buffer)
7282 (bury-buffer gnus-article-buffer)) 7288 (bury-buffer gnus-article-buffer))
7283 ;; Return to the group buffer.
7284 (gnus-configure-windows 'group 'force)
7285 ;; Clear the current group name. 7289 ;; Clear the current group name.
7286 (setq gnus-newsgroup-name nil) 7290 (setq gnus-newsgroup-name nil)
7287 (unless (gnus-ephemeral-group-p group) 7291 (unless (gnus-ephemeral-group-p group)
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 42b61950986..58daf1baf94 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -6779,7 +6779,7 @@ Useful functions to put in this list include:
6779 subject) 6779 subject)
6780 6780
6781;;;###autoload 6781;;;###autoload
6782(defun message-reply (&optional to-address wide) 6782(defun message-reply (&optional to-address wide switch-function)
6783 "Start editing a reply to the article in the current buffer." 6783 "Start editing a reply to the article in the current buffer."
6784 (interactive) 6784 (interactive)
6785 (require 'gnus-sum) ; for gnus-list-identifiers 6785 (require 'gnus-sum) ; for gnus-list-identifiers
@@ -6822,7 +6822,8 @@ Useful functions to put in this list include:
6822 (message-pop-to-buffer 6822 (message-pop-to-buffer
6823 (message-buffer-name 6823 (message-buffer-name
6824 (if wide "wide reply" "reply") from 6824 (if wide "wide reply" "reply") from
6825 (if wide to-address nil)))) 6825 (if wide to-address nil))
6826 switch-function))
6826 6827
6827 (setq message-reply-headers 6828 (setq message-reply-headers
6828 (vector 0 subject from date message-id references 0 0 "")) 6829 (vector 0 subject from date message-id references 0 0 ""))
diff --git a/lisp/gnus/nntp.el b/lisp/gnus/nntp.el
index 4b42637978e..0fc38553c29 100644
--- a/lisp/gnus/nntp.el
+++ b/lisp/gnus/nntp.el
@@ -774,7 +774,7 @@ command whose response triggered the error."
774 (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max)) 774 (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max))
775 'headers))))) 775 'headers)))))
776 776
777(deffoo nntp-retrieve-group-data-early-disabled (server infos) 777(deffoo nntp-retrieve-group-data-early (server infos)
778 "Retrieve group info on INFOS." 778 "Retrieve group info on INFOS."
779 (nntp-with-open-group nil server 779 (nntp-with-open-group nil server
780 (when (nntp-find-connection-buffer nntp-server-buffer) 780 (when (nntp-find-connection-buffer nntp-server-buffer)
@@ -793,7 +793,7 @@ command whose response triggered the error."
793 nil command (gnus-group-real-name (gnus-info-group info))))) 793 nil command (gnus-group-real-name (gnus-info-group info)))))
794 (length infos))))) 794 (length infos)))))
795 795
796(deffoo nntp-finish-retrieve-group-infos-disabled (server infos count) 796(deffoo nntp-finish-retrieve-group-infos (server infos count)
797 (nntp-with-open-group nil server 797 (nntp-with-open-group nil server
798 (let ((buf (nntp-find-connection-buffer nntp-server-buffer)) 798 (let ((buf (nntp-find-connection-buffer nntp-server-buffer))
799 (method (gnus-find-method-for-group 799 (method (gnus-find-method-for-group
@@ -814,10 +814,7 @@ command whose response triggered the error."
814 (< received count))) 814 (< received count)))
815 (nntp-accept-response)) 815 (nntp-accept-response))
816 ;; We now have all the entries. Remove CRs. 816 ;; We now have all the entries. Remove CRs.
817 (goto-char (point-min)) 817 (nnheader-strip-cr)
818 (while (search-forward "\r" nil t)
819 (replace-match "" t t))
820
821 (if (not nntp-server-list-active-group) 818 (if (not nntp-server-list-active-group)
822 (progn 819 (progn
823 (nntp-copy-to-buffer nntp-server-buffer 820 (nntp-copy-to-buffer nntp-server-buffer
@@ -830,7 +827,9 @@ command whose response triggered the error."
830 (delete-region (match-beginning 0) 827 (delete-region (match-beginning 0)
831 (progn (forward-line 1) (point)))) 828 (progn (forward-line 1) (point))))
832 (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max)) 829 (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max))
833 (gnus-active-to-gnus-format method gnus-active-hashtb nil t))))))) 830 (with-current-buffer nntp-server-buffer
831 (gnus-active-to-gnus-format method gnus-active-hashtb
832 nil t))))))))
834 833
835(deffoo nntp-retrieve-groups (groups &optional server) 834(deffoo nntp-retrieve-groups (groups &optional server)
836 "Retrieve group info on GROUPS." 835 "Retrieve group info on GROUPS."