changeset 102925:f0dd383a41d7

(rmail-unrmail-new-mail, rmail-unrmail-new-mail-maybe): New functions. (rmail-insert-inbox-text): Use rmail-unrmail-new-mail-maybe to convert Babyl-formatted new mail to mbox format. (Bug#2942)
author Eli Zaretskii <eliz@gnu.org>
date Fri, 10 Apr 2009 10:41:19 +0000
parents 41e596f3a3f8
children 928b6319c991
files lisp/mail/rmail.el
diffstat 1 files changed, 48 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/mail/rmail.el	Fri Apr 10 04:59:14 2009 +0000
+++ b/lisp/mail/rmail.el	Fri Apr 10 10:41:19 2009 +0000
@@ -1834,6 +1834,49 @@
    (t
     (list file nil nil nil))))
 
+(defun rmail-unrmail-new-mail (from-file)
+  "Replace newly read mail in Babyl format with equivalent mbox format.
+
+FROM-FILE is the Babyl file from which the new mail should be read."
+  (let ((to-file (make-temp-file "rmail"))
+	size)
+    (unrmail from-file to-file)
+    (let ((inhibit-read-only t)
+	  (coding-system-for-read 'raw-text)
+	  (buffer-undo-list t))
+      (delete-region (point) (point-max))
+      (setq size (nth 1 (insert-file-contents to-file)))
+      (delete-file to-file)
+      size)))
+
+(defun rmail-unrmail-new-mail-maybe (file size)
+  "If newly read mail from FILE is in Babyl format, convert it to mbox format.
+
+SIZE is the original size of the newly read mail.
+Value is the size of the newly read mail after conversion."
+  ;; Detect previous Babyl format files.
+  (let ((case-fold-search nil)
+	(old-file file)
+	new-file)
+    (cond ((looking-at "BABYL OPTIONS:")
+	   ;; The new mail is in Babyl version 5 format.  Use unrmail
+	   ;; to convert it.
+	   (setq size (rmail-unrmail-new-mail old-file)))
+	  ((looking-at "Version: 5\n")
+	   ;; New mail is in Babyl format made by old version of
+	   ;; Rmail.  Fix the babyl file header and use unrmail to
+	   ;; convert it.
+	   (let ((buffer-read-only nil)
+		 (write-region-annotate-functions nil)
+		 (write-region-post-annotation-function nil)
+		 (old-file  (make-temp-file "rmail")))
+	     (insert "BABYL OPTIONS: -*- rmail -*-\n")
+	     (forward-line -1)
+	     (write-region (point) (point-max) old-file)
+	     (setq size (rmail-unrmail-new-mail old-file))
+	     (delete-file old-file))))
+    size))
+
 (defun rmail-insert-inbox-text (files renamep)
   ;; Detect a locked file now, so that we avoid moving mail
   ;; out of the real inbox file.  (That could scare people.)
@@ -1951,7 +1994,11 @@
 	  (let ((coding-system-for-read 'no-conversion)
 		size)
 	    (goto-char (point-max))
-	    (setq size (nth 1 (insert-file-contents tofile)))
+	    (setq size
+		  ;; If new mail is in Babyl format, convert it to mbox.
+		  (rmail-unrmail-new-mail-maybe
+		   tofile
+		   (nth 1 (insert-file-contents tofile))))
 	    ;; Determine if a pair of newline message separators need
 	    ;; to be added to the new collection of messages.  This is
 	    ;; the case for all new message collections added to a