diff options
| author | Richard M. Stallman | 1996-09-19 03:21:11 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1996-09-19 03:21:11 +0000 |
| commit | 563ab60dbde5429aa7bc2c96f7bfcbea6c581b39 (patch) | |
| tree | 658e6d0fee519cd180c49992a53864ea543cfb54 | |
| parent | 2a6334563b477eaabb675ac23d4d49d1b00305fa (diff) | |
| download | emacs-563ab60dbde5429aa7bc2c96f7bfcbea6c581b39.tar.gz emacs-563ab60dbde5429aa7bc2c96f7bfcbea6c581b39.zip | |
(rmail-insert-inbox-text): Detect locked
RMAIL files at the outset, before copying any files.
(rmail-find-all-files): Eliminate recursive scan. Rely on directory-files
to do the filtering.
(rmail-convert-to-babyl-format):
Increase sit-for timeout to 3 seconds.
(rmail-get-new-mail): Handle files in multiple batches,
in case two inboxes have the same last name component.
(rmail-show-message): Bind `end' after clearing the
"unseen" attribute.
(rmail-show-message): Clear `unseen' even if header
is already reformatted--but don't do it if rmail-not-really-seen.
(rmail-not-really-seen): New variable.
| -rw-r--r-- | lisp/mail/rmail.el | 225 |
1 files changed, 121 insertions, 104 deletions
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index c4933969f3c..6791b3eab75 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el | |||
| @@ -796,30 +796,20 @@ original copy." | |||
| 796 | (interactive "FRun rmail on RMAIL file: ") | 796 | (interactive "FRun rmail on RMAIL file: ") |
| 797 | (rmail filename)) | 797 | (rmail filename)) |
| 798 | 798 | ||
| 799 | ;; Return a list of file names for all files in or under START | 799 | |
| 800 | ;; whose names match rmail-secondary-file-regexp. | 800 | ;; This used to scan subdirectories recursively, but someone pointed out |
| 801 | ;; This includes START itself, if that name matches. | 801 | ;; that if the user wants that, person can put all the files in one dir. |
| 802 | ;; But normally START is a directory. | 802 | ;; And the recursive scan was slow. So I took it out. |
| 803 | ;; rms, Sep 1996. | ||
| 803 | (defun rmail-find-all-files (start) | 804 | (defun rmail-find-all-files (start) |
| 805 | "Return list of file in dir START that match `rmail-secondary-file-regexp'." | ||
| 804 | (if (file-accessible-directory-p start) | 806 | (if (file-accessible-directory-p start) |
| 805 | ;; Don't sort here. | 807 | ;; Don't sort here. |
| 806 | (let ((files (directory-files start t | 808 | (let* ((case-fold-search t) |
| 807 | rmail-secondary-file-regexp t)) | 809 | (files (directory-files start t rmail-secondary-file-regexp))) |
| 808 | (ret nil) | ||
| 809 | file) | ||
| 810 | (while files | ||
| 811 | (setq file (car files)) | ||
| 812 | (setq files (cdr files)) | ||
| 813 | (or (member (file-name-nondirectory start) '("." "..")) | ||
| 814 | (setq ret (nconc | ||
| 815 | (rmail-find-all-files file) | ||
| 816 | ret)))) | ||
| 817 | ;; Sort here instead of in directory-files | 810 | ;; Sort here instead of in directory-files |
| 818 | ;; because this list is usually much shorter. | 811 | ;; because this list is usually much shorter. |
| 819 | (sort ret 'string<)) | 812 | (sort files 'string<)))) |
| 820 | (let ((case-fold-search nil)) | ||
| 821 | (if (string-match rmail-secondary-file-regexp start) | ||
| 822 | (list (file-name-nondirectory start)))))) | ||
| 823 | 813 | ||
| 824 | (defun rmail-list-to-menu (menu-name l action &optional full-name) | 814 | (defun rmail-list-to-menu (menu-name l action &optional full-name) |
| 825 | (let ((menu (make-sparse-keymap menu-name))) | 815 | (let ((menu (make-sparse-keymap menu-name))) |
| @@ -907,86 +897,112 @@ It returns t if it got any new messages." | |||
| 907 | ;; Get rid of all undo records for this buffer. | 897 | ;; Get rid of all undo records for this buffer. |
| 908 | (or (eq buffer-undo-list t) | 898 | (or (eq buffer-undo-list t) |
| 909 | (setq buffer-undo-list nil)) | 899 | (setq buffer-undo-list nil)) |
| 910 | (unwind-protect | 900 | (let ((all-files (if file-name (list file-name) |
| 911 | (let ((opoint (point)) | 901 | rmail-inbox-list))) |
| 912 | (new-messages 0) | 902 | (unwind-protect |
| 913 | (delete-files ()) | 903 | (while all-files |
| 914 | ;; If buffer has not changed yet, and has not been saved yet, | 904 | (let ((opoint (point)) |
| 915 | ;; don't replace the old backup file now. | 905 | (new-messages 0) |
| 916 | (make-backup-files (and make-backup-files (buffer-modified-p))) | 906 | (delete-files ()) |
| 917 | (buffer-read-only nil) | 907 | ;; If buffer has not changed yet, and has not been saved yet, |
| 918 | ;; Don't make undo records for what we do in getting mail. | 908 | ;; don't replace the old backup file now. |
| 919 | (buffer-undo-list t) | 909 | (make-backup-files (and make-backup-files (buffer-modified-p))) |
| 920 | success) | 910 | (buffer-read-only nil) |
| 921 | (goto-char (point-max)) | 911 | ;; Don't make undo records for what we do in getting mail. |
| 922 | (skip-chars-backward " \t\n") ; just in case of brain damage | 912 | (buffer-undo-list t) |
| 923 | (delete-region (point) (point-max)) ; caused by require-final-newline | 913 | success |
| 924 | (save-excursion | 914 | ;; Files to insert this time around. |
| 925 | (save-restriction | 915 | files |
| 926 | (narrow-to-region (point) (point)) | 916 | ;; Last names of those files. |
| 927 | ;; Read in the contents of the inbox files, | 917 | file-last-names) |
| 928 | ;; renaming them as necessary, | 918 | ;; Pull files off all-files onto files |
| 929 | ;; and adding to the list of files to delete eventually. | 919 | ;; as long as there is no name conflict. |
| 930 | (if file-name | 920 | ;; A conflict happens when two inbox file names |
| 931 | (rmail-insert-inbox-text (list file-name) nil) | 921 | ;; have the same last component. |
| 932 | (setq delete-files (rmail-insert-inbox-text rmail-inbox-list t))) | 922 | (while (and all-files |
| 933 | ;; Scan the new text and convert each message to babyl format. | 923 | (not (member (file-name-nondirectory (car all-files)) |
| 934 | (goto-char (point-min)) | 924 | file-last-names))) |
| 935 | (unwind-protect | 925 | (setq files (cons (car all-files) files) |
| 936 | (save-excursion | 926 | file-last-names |
| 937 | (setq new-messages (rmail-convert-to-babyl-format) | 927 | (cons (file-name-nondirectory (car all-files)) files)) |
| 938 | success t)) | 928 | (setq all-files (cdr all-files))) |
| 939 | ;; If we could not convert the file's inboxes, | 929 | ;; Put them back in their original order. |
| 940 | ;; rename the files we tried to read | 930 | (setq files (nreverse files)) |
| 941 | ;; so we won't over and over again. | 931 | |
| 942 | (if (and (not file-name) (not success)) | 932 | (goto-char (point-max)) |
| 943 | (let ((files delete-files) | 933 | (skip-chars-backward " \t\n") ; just in case of brain damage |
| 944 | (count 0)) | 934 | (delete-region (point) (point-max)) ; caused by require-final-newline |
| 945 | (while files | 935 | (save-excursion |
| 946 | (while (file-exists-p (format "RMAILOSE.%d" count)) | 936 | (save-restriction |
| 947 | (setq count (1+ count))) | 937 | (narrow-to-region (point) (point)) |
| 948 | (rename-file (car files) | 938 | ;; Read in the contents of the inbox files, |
| 949 | (format "RMAILOSE.%d" count)) | 939 | ;; renaming them as necessary, |
| 950 | (setq files (cdr files)))))) | 940 | ;; and adding to the list of files to delete eventually. |
| 951 | (or (zerop new-messages) | 941 | (if file-name |
| 952 | (let (success) | 942 | (rmail-insert-inbox-text files nil) |
| 953 | (widen) | 943 | (setq delete-files (rmail-insert-inbox-text files t))) |
| 954 | (search-backward "\n\^_" nil t) | 944 | ;; Scan the new text and convert each message to babyl format. |
| 955 | (narrow-to-region (point) (point-max)) | 945 | (goto-char (point-min)) |
| 956 | (goto-char (1+ (point-min))) | 946 | (unwind-protect |
| 957 | (rmail-count-new-messages) | 947 | (save-excursion |
| 958 | (run-hooks 'rmail-get-new-mail-hook) | 948 | (setq new-messages (rmail-convert-to-babyl-format) |
| 959 | (save-buffer))) | 949 | success t)) |
| 960 | ;; Delete the old files, now that babyl file is saved. | 950 | ;; If we could not convert the file's inboxes, |
| 961 | (while delete-files | 951 | ;; rename the files we tried to read |
| 962 | (condition-case () | 952 | ;; so we won't over and over again. |
| 963 | ;; First, try deleting. | 953 | (if (and (not file-name) (not success)) |
| 954 | (let ((delfiles delete-files) | ||
| 955 | (count 0)) | ||
| 956 | (while delfiles | ||
| 957 | (while (file-exists-p (format "RMAILOSE.%d" count)) | ||
| 958 | (setq count (1+ count))) | ||
| 959 | (rename-file (car delfiles) | ||
| 960 | (format "RMAILOSE.%d" count)) | ||
| 961 | (setq delfiles (cdr delfiles)))))) | ||
| 962 | (or (zerop new-messages) | ||
| 963 | (let (success) | ||
| 964 | (widen) | ||
| 965 | (search-backward "\n\^_" nil t) | ||
| 966 | (narrow-to-region (point) (point-max)) | ||
| 967 | (goto-char (1+ (point-min))) | ||
| 968 | (rmail-count-new-messages) | ||
| 969 | (run-hooks 'rmail-get-new-mail-hook) | ||
| 970 | (save-buffer))) | ||
| 971 | ;; Delete the old files, now that babyl file is saved. | ||
| 972 | (while delete-files | ||
| 964 | (condition-case () | 973 | (condition-case () |
| 965 | (delete-file (car delete-files)) | 974 | ;; First, try deleting. |
| 966 | (file-error | 975 | (condition-case () |
| 967 | ;; If we can't delete it, truncate it. | 976 | (delete-file (car delete-files)) |
| 968 | (write-region (point) (point) (car delete-files)))) | 977 | (file-error |
| 969 | (file-error nil)) | 978 | ;; If we can't delete it, truncate it. |
| 970 | (setq delete-files (cdr delete-files))))) | 979 | (write-region (point) (point) (car delete-files)))) |
| 971 | (if (= new-messages 0) | 980 | (file-error nil)) |
| 972 | (progn (goto-char opoint) | 981 | (setq delete-files (cdr delete-files))))) |
| 973 | (if (or file-name rmail-inbox-list) | 982 | (if (= new-messages 0) |
| 974 | (message "(No new mail has arrived)")) | 983 | (progn (goto-char opoint) |
| 975 | nil) | 984 | (if (or file-name rmail-inbox-list) |
| 976 | (if (rmail-summary-exists) | 985 | (message "(No new mail has arrived)")) |
| 977 | (rmail-select-summary | 986 | nil) |
| 978 | (rmail-update-summary))) | 987 | (if (rmail-summary-exists) |
| 979 | (message "%d new message%s read" | 988 | (rmail-select-summary |
| 980 | new-messages (if (= 1 new-messages) "" "s")) | 989 | (rmail-update-summary))) |
| 981 | ;; Move to the first new message | 990 | (message "%d new message%s read" |
| 982 | ;; unless we have other unseen messages before it. | 991 | new-messages (if (= 1 new-messages) "" "s")) |
| 983 | (rmail-show-message (rmail-first-unseen-message)) | 992 | ;; Move to the first new message |
| 984 | (run-hooks 'rmail-after-get-new-mail-hook) | 993 | ;; unless we have other unseen messages before it. |
| 985 | t)) | 994 | (rmail-show-message (rmail-first-unseen-message)) |
| 986 | ;; Don't leave the buffer screwed up if we get a disk-full error. | 995 | (run-hooks 'rmail-after-get-new-mail-hook) |
| 987 | (rmail-show-message))) | 996 | t))) |
| 997 | ;; Don't leave the buffer screwed up if we get a disk-full error. | ||
| 998 | (rmail-show-message)))) | ||
| 988 | 999 | ||
| 989 | (defun rmail-insert-inbox-text (files renamep) | 1000 | (defun rmail-insert-inbox-text (files renamep) |
| 1001 | ;; Detect a locked file now, so that we avoid moving mail | ||
| 1002 | ;; out of the real inbox file. (That could scare people.) | ||
| 1003 | (or (memq (file-locked-p buffer-file-name) '(nil t)) | ||
| 1004 | (error "RMAIL file %s is locked" | ||
| 1005 | (file-name-nondirectory buffer-file-name))) | ||
| 990 | (let (file tofile delete-files movemail popmail) | 1006 | (let (file tofile delete-files movemail popmail) |
| 991 | (while files | 1007 | (while files |
| 992 | (setq file (file-truename | 1008 | (setq file (file-truename |
| @@ -1142,7 +1158,7 @@ Optional DEFAULT is password to start with." | |||
| 1142 | (invalid-input-resync | 1158 | (invalid-input-resync |
| 1143 | (function (lambda () | 1159 | (function (lambda () |
| 1144 | (message "Invalid Babyl format in inbox!") | 1160 | (message "Invalid Babyl format in inbox!") |
| 1145 | (sit-for 1) | 1161 | (sit-for 3) |
| 1146 | ;; Try to get back in sync with a real message. | 1162 | ;; Try to get back in sync with a real message. |
| 1147 | (if (re-search-forward | 1163 | (if (re-search-forward |
| 1148 | (concat mmdf-delim1 "\\|^From") nil t) | 1164 | (concat mmdf-delim1 "\\|^From") nil t) |
| @@ -1647,16 +1663,17 @@ If summary buffer is currently displayed, update current message there also." | |||
| 1647 | blurb "No following message")) | 1663 | blurb "No following message")) |
| 1648 | (t | 1664 | (t |
| 1649 | (setq rmail-current-message n)))) | 1665 | (setq rmail-current-message n)))) |
| 1650 | (let ((beg (rmail-msgbeg n)) | 1666 | (let ((beg (rmail-msgbeg n))) |
| 1651 | (end (rmail-msgend n))) | ||
| 1652 | (goto-char beg) | 1667 | (goto-char beg) |
| 1653 | (forward-line 1) | 1668 | (forward-line 1) |
| 1654 | (if (= (following-char) ?0) | 1669 | ;; Clear the "unseen" attribute when we show a message. |
| 1655 | (progn | 1670 | (rmail-set-attribute "unseen" nil) |
| 1671 | ;; Reformat the header, or else find the reformatted header. | ||
| 1672 | (let ((end (rmail-msgend n))) | ||
| 1673 | (if (= (following-char) ?0) | ||
| 1656 | (rmail-reformat-message beg end) | 1674 | (rmail-reformat-message beg end) |
| 1657 | (rmail-set-attribute "unseen" nil)) | 1675 | (search-forward "\n*** EOOH ***\n" end t) |
| 1658 | (search-forward "\n*** EOOH ***\n" end t) | 1676 | (narrow-to-region (point) end))) |
| 1659 | (narrow-to-region (point) end)) | ||
| 1660 | (goto-char (point-min)) | 1677 | (goto-char (point-min)) |
| 1661 | (rmail-display-labels) | 1678 | (rmail-display-labels) |
| 1662 | (rmail-highlight-headers) | 1679 | (rmail-highlight-headers) |