Gnus development mailing list
 help / color / mirror / Atom feed
* self-contained nnml
@ 2001-08-18 11:34 Simon Josefsson
  2001-08-18 15:40 ` Kai Großjohann
  2001-08-24 23:00 ` self-contained nnml Rob Browning
  0 siblings, 2 replies; 23+ messages in thread
From: Simon Josefsson @ 2001-08-18 11:34 UTC (permalink / raw)


This patch makes nnml self-contained as far as marks are concerned.
Marks are stored in e.g. ~/Mail/misc/.marks.

Once the .marks file has been (automatically) created you should be
able to tar up a nnml server, move it to some other machine or back it
on tape up or whatever, and be able to plunk it back into a Gnus and
the marks should be discovered.  You could also be able to share a
nnml server between users, and have flags shared as well.

If you don't care about the above, this should NOT cause any problems.
But there may be bugs or design flaws.  Please report.  If you can't
even live with a small .marks file in the nnml directory and the
hopefully small performance penalty, you can disable it by toggling
`nnml-marks-is-evil'.  Erhm, perhaps that's not a good variable name,
who's Mark?  Maybe it should be Marx.  Nah, then it would have to be a
function rather than a variable. :-)

Known bug: If the .marks file is changed, you need to `g' (or `M-g')
before the new marks are noticed.  Simply entering the group is not
enough.  This is because `nnml-request-update-info' is not called when
the group is entered.  Maybe it should?  (FWIW, in nnimap,
`n-request-group' calls the equivalent of `n-request-update-info'.
But Gnus should do that.  Or not.)

Todo: Port to nnfolder etc.  It should be _really_ trivial.  Any
takers?

Caveat: I don't use nnml so I didn't test it.

2001-08-18  Simon Josefsson  <jas@extundo.com>

	Make nnml groups self-contained as far as marks are concerned.

	* nnml.el (nnml-request-delete-group): Delete marks file.
	(nnml-request-rename-group): Move marks file.
	(nnml-marks-file-name, nnml-marks-is-evil, nnml-marks): New server
	variables.
	(nnml-request-set-mark, nnml-request-update-info): New server
	functions.
	(nnml-save-marks, nnml-open-marks): New functions.

--- nnml.el.~6.9.~	Sat Aug 18 10:20:10 2001
+++ nnml.el	Sat Aug 18 13:12:56 2001
@@ -442,7 +442,8 @@
 	   (directory-files
 	    nnml-current-directory t
 	    (concat nnheader-numerical-short-files
-		    "\\|" (regexp-quote nnml-nov-file-name) "$")))
+		    "\\|" (regexp-quote nnml-nov-file-name) "$"
+		    "\\|" (regexp-quote nnml-marks-file-name) "$")))
 	  article)
       (while articles
 	(setq article (pop articles))
@@ -480,6 +481,10 @@
       (let ((overview (concat old-dir nnml-nov-file-name)))
 	(when (file-exists-p overview)
 	  (rename-file overview (concat new-dir nnml-nov-file-name))))
+      ;; Move .marks file.
+      (let ((marks (concat old-dir nnml-marks-file-name)))
+	(when (file-exists-p marks)
+	  (rename-file marks (concat new-dir nnml-marks-file-name))))
       (when (<= (length (directory-files old-dir)) 2)
 	(ignore-errors (delete-directory old-dir)))
       ;; That went ok, so we change the internal structures.
@@ -852,6 +857,85 @@
 	    force)
     (setq nnml-article-file-alist
 	  (nnheader-article-to-file-alist nnml-current-directory))))
+
+(defvoo nnml-marks-file-name ".marks")
+(defvoo nnml-marks-is-evil nil)
+(defvoo nnml-marks nil)
+
+(deffoo nnml-request-set-mark (group actions &optional server)
+  (nnml-possibly-change-directory group server)
+  (unless nnml-marks-is-evil
+    (nnml-open-marks group server)
+    (dolist (action actions)
+      (let ((range (nth 0 action))
+	    (what  (nth 1 action))
+	    (marks (nth 2 action)))
+	(assert (or (eq what 'add) (eq what 'del)) t
+		"Unknown request-set-mark action: %s" what)
+	(dolist (mark marks)
+	  (setq nnml-marks (nnimap-update-alist-soft
+			    mark
+			    (funcall (if (eq what 'add) 'gnus-range-add
+				       'gnus-remove-from-range)
+				     (cdr (assoc mark nnml-marks)) range)
+			    nnml-marks)))))
+    (nnml-save-marks group server)))
+
+(deffoo nnml-request-update-info (group info &optional server)
+  (nnml-possibly-change-directory group server)
+  (unless nnml-marks-is-evil
+    (nnml-open-marks group server)
+    ;; Update info using `nnml-marks'.
+    (mapcar (lambda (pred)
+	      (gnus-info-set-marks
+	       info
+	       (nnimap-update-alist-soft
+		(cdr pred)
+		(cdr (assq (cdr pred) nnml-marks))
+		(gnus-info-marks info))
+	       t))
+	    gnus-article-mark-lists)
+    (let ((seen (cdr (assq 'read nnml-marks))))
+      (gnus-info-set-read info
+			  (if (and (integerp (car seen))
+				   (null (cdr seen)))
+			      (list (cons (car seen) (car seen)))
+			    seen))))
+  info)
+
+(defun nnml-save-marks (group server)
+  (let ((file-name-coding-system nnmail-pathname-coding-system)
+	(file (expand-file-name nnml-marks-file-name
+				(nnmail-group-pathname group nnml-directory))))
+    (gnus-make-directory (file-name-directory file))
+    (with-temp-file file
+      (erase-buffer)
+      (princ nnml-marks (current-buffer))
+      (insert "\n"))))
+
+(defun nnml-open-marks (group server)
+  (with-temp-buffer
+    (let ((file (expand-file-name 
+		 nnml-marks-file-name 
+		 (nnmail-group-pathname group nnml-directory))))
+      (if (file-exists-p file)
+	  (setq nnml-marks (condition-case err
+			       (progn
+				 (nnheader-insert-file-contents file)
+				 (read (current-buffer)))
+			     (error (or (gnus-yes-or-no-p
+					 (format "Error reading nnml marks file %s (%s).  Continuing will use marks from .newsrc.eld.  Continue? " file err))
+					(error "Cannot read nnml marks file %s (%s)" file err)))))
+	;; User didn't have a .marks file.  Probably first time
+	;; user of the .marks stuff.  Bootstrap it from .newsrc.eld.
+	(let ((info (gnus-get-info
+		     (gnus-group-prefixed-name
+		      group
+		      (gnus-server-to-method (format "nnml:%s" server))))))
+	  (nnheader-message 6 "Boostrapping nnml marks...")
+	  (setq nnml-marks (gnus-info-marks info))
+	  (push (cons 'read (gnus-info-read info)) nnml-marks)
+	  (nnml-save-marks group server))))))
 
 (provide 'nnml)
 



^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2001-08-26 18:28 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-08-18 11:34 self-contained nnml Simon Josefsson
2001-08-18 15:40 ` Kai Großjohann
2001-08-18 16:42   ` Simon Josefsson
2001-08-19  6:21     ` Daniel Pittman
2001-08-19  9:44       ` Simon Josefsson
2001-08-20  2:35         ` Problems with .newsrc.eld (aws: Re: self-contained nnml) Daniel Pittman
2001-08-20  3:18           ` Daniel Pittman
2001-08-20  9:23           ` Simon Josefsson
2001-08-21  5:07             ` Daniel Pittman
2001-08-21 16:31               ` Simon Josefsson
2001-08-21 18:13                 ` Paul Jarc
2001-08-21 20:30                   ` Simon Josefsson
2001-08-21 23:57                     ` Daniel Pittman
2001-08-21 23:56                 ` Daniel Pittman
2001-08-24 23:00 ` self-contained nnml Rob Browning
2001-08-25  0:20   ` Rob Browning
2001-08-25  0:58     ` Rob Browning
2001-08-25  2:11       ` ShengHuo ZHU
2001-08-26 18:15         ` Rob Browning
2001-08-25  9:43     ` Simon Josefsson
2001-08-26 15:29       ` Rob Browning
2001-08-26 16:32         ` Simon Josefsson
2001-08-26 18:28           ` Rob Browning

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).