# HG changeset patch # User Eli Zaretskii # Date 1239360079 0 # Node ID f0dd383a41d7f911780d3ba0acdc768e0a800aea # Parent 41e596f3a3f8d8724e5117b8d9e71ecb97864b8f (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) diff -r 41e596f3a3f8 -r f0dd383a41d7 lisp/mail/rmail.el --- 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