]> code.delx.au - gnu-emacs/commitdiff
Prevent locked-file errors in Rmail
authorKen Olum <kdo@cosmos.phy.tufts.edu>
Sat, 28 May 2016 10:46:22 +0000 (13:46 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 28 May 2016 10:46:22 +0000 (13:46 +0300)
* lisp/mail/rmail.el (rmail-get-new-mail-1): Lock file before
calling 'rmail-insert-inbox-text'.  Unlock if
'rmail-insert-inbox-text' doesn't modify buffer.
(rmail-insert-inbox-text): Remove lock-checking code.  (Bug#17706)

lisp/mail/rmail.el

index 734155e217d9118718b47fd84f7b374fd16dcecd..e9882253c70246cb220df9eb1ebc746cc783da1a 100644 (file)
@@ -1818,9 +1818,21 @@ not be a new one).  It returns non-nil if it got any new messages."
        ;; Read in the contents of the inbox files, renaming them as
        ;; necessary, and adding to the list of files to delete
        ;; eventually.
-       (if file-name
-           (rmail-insert-inbox-text files nil)
-         (setq delete-files (rmail-insert-inbox-text files t)))
+       (unwind-protect
+           (progn
+             ;; Set modified now to lock the file, so that we don't
+             ;; encounter locking problems later in the middle of
+             ;; reading the mail.
+             (set-buffer-modified-p t)
+             (if file-name
+                 (rmail-insert-inbox-text files nil)
+               (setq delete-files (rmail-insert-inbox-text files t))))
+         ;; If there was no new mail, or we aborted before actually
+         ;; trying to get any, mark buffer unmodified.  Otherwise the
+         ;; buffer is correctly marked modified and the file locked
+         ;; until we save out the new mail.
+         (if (= (point-min) (point-max))
+             (set-buffer-modified-p nil)))
        ;; Scan the new text and convert each message to
        ;; Rmail/mbox format.
        (goto-char (point-min))
@@ -1969,11 +1981,6 @@ Value is the size of the newly read mail after conversion."
     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.)
-  (or (memq (file-locked-p buffer-file-name) '(nil t))
-      (error "RMAIL file %s is locked"
-            (file-name-nondirectory buffer-file-name)))
   (let (file tofile delete-files popmail got-password password)
     (while files
       ;; Handle remote mailbox names specially; don't expand as filenames