Mercurial > emacs
annotate lisp/gnus/gnus-sync.el @ 110995:29c951d93e6d
Merge changes made in Gnus trunk.
gnus-group.el (gnus-group-insert-group-line): Fix group argument to `gnus-group-get-icon'.
nnimap.el (nnimap-open-connection): tls-program should be a list of programs.
author | Katsumi Yamaoka <yamaoka@jpl.org> |
---|---|
date | Thu, 14 Oct 2010 10:16:59 +0000 |
parents | d2b45bb936b6 |
children | b1eac6d41a93 |
rev | line source |
---|---|
109766 | 1 ;;; gnus-sync.el --- synchronization facility for Gnus |
2 | |
109774
7a46ef068de4
* lisp/gnus/gnus-sync.el (gnus-sync): Fix defgroup version.
Glenn Morris <rgm@gnu.org>
parents:
109769
diff
changeset
|
3 ;; Copyright (C) 2010 Free Software Foundation, Inc. |
109766 | 4 |
5 ;; Author: Ted Zlatanov <tzz@lifelogs.com> | |
6 ;; Keywords: news synchronization nntp nnrss | |
7 | |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software: you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation, either version 3 of the License, or | |
13 ;; (at your option) any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
22 | |
23 ;;; Commentary: | |
24 | |
25 ;; This is the gnus-sync.el package. | |
26 | |
110799
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
27 ;; It's due for a rewrite using gnus-after-set-mark-hook and |
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
28 ;; gnus-before-update-mark-hook. Until then please consider it |
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
29 ;; experimental. |
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
30 |
109766 | 31 ;; Put this in your startup file (~/.gnus.el for instance) |
32 | |
109769
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
33 ;; possibilities for gnus-sync-backend: |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
34 ;; Tramp over SSH: /ssh:user@host:/path/to/filename |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
35 ;; Tramp over IMAP: /imaps:user@yourhosthere.com:/INBOX.test/filename |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
36 ;; ...or any other file Tramp and Emacs can handle... |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
37 |
109777
729aca322fce
Doc fixes and keep unknown groups.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109774
diff
changeset
|
38 ;; (setq gnus-sync-backend "/remote:/path.gpg" ; will use Tramp+EPA if loaded |
109766 | 39 ;; gnus-sync-global-vars `(gnus-newsrc-last-checked-date) |
40 ;; gnus-sync-newsrc-groups `("nntp" "nnrss") | |
109777
729aca322fce
Doc fixes and keep unknown groups.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109774
diff
changeset
|
41 ;; gnus-sync-newsrc-offsets `(2 3)) |
109766 | 42 |
43 ;; TODO: | |
44 | |
45 ;; - after gnus-sync-read, the message counts are wrong | |
46 | |
110799
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
47 ;; - use gnus-after-set-mark-hook and gnus-before-update-mark-hook to |
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
48 ;; catch the mark updates |
d2b45bb936b6
gnus-int.el, gnus-util.el: Gnus hooks for the mark get/set operations.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109811
diff
changeset
|
49 |
109766 | 50 ;;; Code: |
51 | |
52 (eval-when-compile (require 'cl)) | |
109811
d06b7ff1ea84
Silence more Gnus compiler warnings.
Glenn Morris <rgm@gnu.org>
parents:
109783
diff
changeset
|
53 (require 'gnus) |
d06b7ff1ea84
Silence more Gnus compiler warnings.
Glenn Morris <rgm@gnu.org>
parents:
109783
diff
changeset
|
54 (require 'gnus-start) |
109766 | 55 (require 'gnus-util) |
56 | |
57 (defgroup gnus-sync nil | |
58 "The Gnus synchronization facility." | |
109774
7a46ef068de4
* lisp/gnus/gnus-sync.el (gnus-sync): Fix defgroup version.
Glenn Morris <rgm@gnu.org>
parents:
109769
diff
changeset
|
59 :version "24.1" |
109766 | 60 :group 'gnus) |
61 | |
62 (defcustom gnus-sync-newsrc-groups `("nntp" "nnrss") | |
63 "List of groups to be synchronized in the gnus-newsrc-alist. | |
64 The group names are matched, they don't have to be fully | |
65 qualified. Typically you would choose all of these. That's the | |
66 default because there is no active sync backend by default, so | |
67 this setting is harmless until the user chooses a sync backend." | |
68 :group 'gnus-sync | |
69 :type '(repeat regexp)) | |
70 | |
71 (defcustom gnus-sync-newsrc-offsets '(2 3) | |
72 "List of per-group data to be synchronized." | |
73 :group 'gnus-sync | |
74 :type '(set (const :tag "Read ranges" 2) | |
75 (const :tag "Marks" 3))) | |
76 | |
77 (defcustom gnus-sync-global-vars nil | |
78 "List of global variables to be synchronized. | |
79 You may want to sync `gnus-newsrc-last-checked-date' but pretty | |
80 much any symbol is fair game. You could additionally sync | |
81 `gnus-newsrc-alist', `gnus-server-alist', `gnus-topic-topology', | |
82 and `gnus-topic-alist' to cover all the variables in | |
83 newsrc.eld (except for `gnus-format-specs' which should not be | |
84 synchronized, I believe). Also see `gnus-variable-list'." | |
85 :group 'gnus-sync | |
86 :type '(repeat (choice (variable :tag "A known variable") | |
87 (symbol :tag "Any symbol")))) | |
88 | |
89 (defcustom gnus-sync-backend nil | |
90 "The synchronization backend." | |
91 :group 'gnus-sync | |
92 :type '(radio (const :format "None" nil) | |
93 (string :tag "Sync to a file"))) | |
94 | |
95 (defvar gnus-sync-newsrc-loader nil | |
96 "Carrier for newsrc data") | |
97 | |
98 (defun gnus-sync-save () | |
99 "Save the Gnus sync data to the backend." | |
100 (interactive) | |
101 (cond | |
102 ((stringp gnus-sync-backend) | |
103 (gnus-message 7 "gnus-sync: saving to backend %s" gnus-sync-backend) | |
104 ;; populate gnus-sync-newsrc-loader from all but the first dummy | |
105 ;; entry in gnus-newsrc-alist whose group matches any of the | |
106 ;; gnus-sync-newsrc-groups | |
109783
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
107 ;; TODO: keep the old contents for groups we don't have! |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
108 (let ((gnus-sync-newsrc-loader |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
109 (loop for entry in (cdr gnus-newsrc-alist) |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
110 when (gnus-grep-in-list |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
111 (car entry) ;the group name |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
112 gnus-sync-newsrc-groups) |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
113 collect (cons (car entry) |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
114 (mapcar (lambda (offset) |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
115 (cons offset (nth offset entry))) |
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
116 gnus-sync-newsrc-offsets))))) |
109766 | 117 (with-temp-file gnus-sync-backend |
118 (progn | |
119 (let ((coding-system-for-write gnus-ding-file-coding-system) | |
120 (standard-output (current-buffer))) | |
121 (princ (format ";; -*- mode:emacs-lisp; coding: %s; -*-\n" | |
122 gnus-ding-file-coding-system)) | |
123 (princ ";; Gnus sync data v. 0.0.1\n") | |
124 (let* ((print-quoted t) | |
125 (print-readably t) | |
126 (print-escape-multibyte nil) | |
127 (print-escape-nonascii t) | |
128 (print-length nil) | |
129 (print-level nil) | |
130 (print-circle nil) | |
131 (print-escape-newlines t) | |
132 (variables (cons 'gnus-sync-newsrc-loader | |
109767
f7cd57edb2ca
Minor bug fixes for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109766
diff
changeset
|
133 gnus-sync-global-vars)) |
f7cd57edb2ca
Minor bug fixes for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109766
diff
changeset
|
134 variable) |
109766 | 135 (while variables |
109778
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
136 (if (and (boundp (setq variable (pop variables))) |
109766 | 137 (symbol-value variable)) |
109778
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
138 (progn |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
139 (princ "\n(setq ") |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
140 (princ (symbol-name variable)) |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
141 (princ " '") |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
142 (prin1 (symbol-value variable)) |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
143 (princ ")\n")) |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
144 (princ "\n;;; skipping empty variable ") |
e253995f955c
Ammended for bug fix on the loader nunion.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109777
diff
changeset
|
145 (princ (symbol-name variable))))) |
109766 | 146 (gnus-message |
147 7 | |
148 "gnus-sync: stored variables %s and %d groups in %s" | |
149 gnus-sync-global-vars | |
150 (length gnus-sync-newsrc-loader) | |
151 gnus-sync-backend) | |
152 | |
153 ;; Idea from Dan Christensen <jdc@chow.mat.jhu.edu> | |
154 ;; Save the .eld file with extra line breaks. | |
155 (gnus-message 8 "gnus-sync: adding whitespace to %s" | |
156 gnus-sync-backend) | |
157 (save-excursion | |
158 (goto-char (point-min)) | |
159 (while (re-search-forward "^(\\|(\\\"" nil t) | |
160 (replace-match "\n\\&" t)) | |
161 (goto-char (point-min)) | |
162 (while (re-search-forward " $" nil t) | |
163 (replace-match "" t t)))))))) | |
164 ;; the pass-through case: gnus-sync-backend is not a known choice | |
165 (nil))) | |
166 | |
167 (defun gnus-sync-read () | |
168 "Load the Gnus sync data from the backend." | |
169 (interactive) | |
170 (when gnus-sync-backend | |
171 (gnus-message 7 "gnus-sync: loading from backend %s" gnus-sync-backend) | |
172 (cond ((stringp gnus-sync-backend) | |
173 ;; read data here... | |
174 (if (or debug-on-error debug-on-quit) | |
175 (load gnus-sync-backend nil t) | |
176 (condition-case var | |
177 (load gnus-sync-backend nil t) | |
178 (error | |
179 (error "Error in %s: %s" gnus-sync-backend (cadr var))))) | |
109769
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
180 (let ((valid-count 0) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
181 invalid-groups) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
182 (dolist (node gnus-sync-newsrc-loader) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
183 (if (gnus-gethash (car node) gnus-newsrc-hashtb) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
184 (progn |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
185 (incf valid-count) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
186 (loop for store in (cdr node) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
187 do (setf (nth (car store) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
188 (assoc (car node) gnus-newsrc-alist)) |
109766 | 189 (cdr store)))) |
109769
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
190 (push (car node) invalid-groups))) |
109766 | 191 (gnus-message |
192 7 | |
193 "gnus-sync: loaded %d groups (out of %d) from %s" | |
109769
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
194 valid-count (length gnus-sync-newsrc-loader) |
109766 | 195 gnus-sync-backend) |
109769
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
196 (when invalid-groups |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
197 (gnus-message |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
198 7 |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
199 "gnus-sync: skipped %d groups (out of %d) from %s" |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
200 (length invalid-groups) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
201 (length gnus-sync-newsrc-loader) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
202 gnus-sync-backend) |
fe81389a263d
Optimizations for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109768
diff
changeset
|
203 (gnus-message 9 "gnus-sync: skipped groups: %s" |
109777
729aca322fce
Doc fixes and keep unknown groups.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109774
diff
changeset
|
204 (mapconcat 'identity invalid-groups ", "))))) |
109766 | 205 (nil)) |
206 ;; make the hashtable again because the newsrc-alist may have been modified | |
109767
f7cd57edb2ca
Minor bug fixes for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109766
diff
changeset
|
207 (when gnus-sync-newsrc-offsets |
109766 | 208 (gnus-message 9 "gnus-sync: remaking the newsrc hashtable") |
209 (gnus-make-hashtable-from-newsrc-alist)))) | |
210 | |
211 ;;;###autoload | |
212 (defun gnus-sync-initialize () | |
213 "Initialize the Gnus sync facility." | |
214 (interactive) | |
215 (gnus-message 5 "Initializing the sync facility") | |
216 (gnus-sync-install-hooks)) | |
217 | |
218 ;;;###autoload | |
219 (defun gnus-sync-install-hooks () | |
220 "Install the sync hooks." | |
221 (interactive) | |
109768
9c65ce5bc0db
Minor bug fixes for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109767
diff
changeset
|
222 ;; (add-hook 'gnus-get-new-news-hook 'gnus-sync-read) |
109766 | 223 (add-hook 'gnus-save-newsrc-hook 'gnus-sync-save) |
109783
43f98127e0f3
Typo fix "hoo4a" -> "hook".
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109778
diff
changeset
|
224 (add-hook 'gnus-read-newsrc-el-hook 'gnus-sync-read)) |
109766 | 225 |
226 (defun gnus-sync-unload-hook () | |
227 "Uninstall the sync hooks." | |
228 (interactive) | |
109768
9c65ce5bc0db
Minor bug fixes for gnus-sync.el.
Katsumi Yamaoka <yamaoka@jpl.org>
parents:
109767
diff
changeset
|
229 ;; (remove-hook 'gnus-get-new-news-hook 'gnus-sync-read) |
109766 | 230 (remove-hook 'gnus-save-newsrc-hook 'gnus-sync-save) |
231 (remove-hook 'gnus-read-newsrc-el-hook 'gnus-sync-read)) | |
232 | |
233 (add-hook 'gnus-sync-unload-hook 'gnus-sync-unload-hook) | |
234 | |
235 ;; this is harmless by default, until the gnus-sync-backend is set | |
236 (gnus-sync-initialize) | |
237 | |
238 (provide 'gnus-sync) | |
239 | |
240 ;;; gnus-sync.el ends here |