# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: m.kupfer@acm.org-20140929040526-o9l4xz8v0cgv964w # target_branch: bzr://bzr.savannah.gnu.org/emacs/emacs-24/ # testament_sha1: dae0aa9c4d55efb8fd1f70ddff82aa23c47c1f04 # timestamp: 2014-09-28 21:05:58 -0700 # base_revision_id: monnier@iro.umontreal.ca-20140927162553-\ # hjq3w3mbdp5jwa4s # # Begin patch === modified file 'lisp/mh-e/ChangeLog' --- lisp/mh-e/ChangeLog 2014-03-17 00:50:05 +0000 +++ lisp/mh-e/ChangeLog 2014-09-29 04:05:26 +0000 @@ -1,3 +1,19 @@ +2014-09-28 Mike Kupfer + + * mh-comp.el (mh-bare-components): Improve the temp folder and + file names as per a suggestion from Bill Wohler. Also address + XEmacs compatibility issues: use mm-make-temp-file instead of + make-temp-file, and only pass one argument to delete-directory. + +2014-09-26 Mike Kupfer + + * mh-comp.el (mh-insert-x-face): Ensure that mh-x-face-file is a + string before trying to use it (closes SF #474). + (mh-bare-components): New function to create a temporary initial + components file; replaces mh-find-components. + (mh-edit-again, mh-send-sub): Use mh-bare-components instead of + mh-find-components (partially closes SF #468). + 2014-03-16 Bill Wohler * mh-folder.el (mh-regenerate-headers): Fix scan: bad message list === modified file 'lisp/mh-e/mh-comp.el' --- lisp/mh-e/mh-comp.el 2014-01-01 07:43:34 +0000 +++ lisp/mh-e/mh-comp.el 2014-09-29 04:05:26 +0000 @@ -411,6 +411,7 @@ (interactive (list (mh-get-msg-num t))) (let* ((from-folder mh-current-folder) (config (current-window-configuration)) + (components-file (mh-bare-components)) (draft (cond ((and mh-draft-folder (equal from-folder mh-draft-folder)) (pop-to-buffer (find-file-noselect (mh-msg-filename message)) @@ -467,7 +468,8 @@ ;; Text field, that's an easy case (t (mh-modify-header-field field value)))))) - (mh-components-to-list (mh-find-components))) + (mh-components-to-list components-file)) + (delete-file components-file) (goto-char (point-min)) (save-buffer) (mh-compose-and-send-mail @@ -885,22 +887,6 @@ (t nil)))) -(defun mh-find-components () - "Return the path to the components file." - (let (components) - (cond - ((file-exists-p - (setq components - (expand-file-name mh-comp-formfile mh-user-path))) - components) - ((file-exists-p - (setq components - (expand-file-name mh-comp-formfile mh-lib))) - components) - (t - (error "Can't find %s in %s or %s" - mh-comp-formfile mh-user-path mh-lib))))) - (defun mh-send-sub (to cc subject config) "Do the real work of composing and sending a letter. Expects the TO, CC, and SUBJECT fields as arguments. @@ -910,8 +896,8 @@ (message "Composing a message...") (let ((draft (mh-read-draft "message" - (mh-find-components) - nil))) + (mh-bare-components) + t))) (mh-insert-fields "To:" to "Subject:" subject "Cc:" cc) (goto-char (point-max)) (mh-compose-and-send-mail draft "" folder msg-num @@ -920,6 +906,29 @@ (mh-letter-mode-message) (mh-letter-adjust-point)))) +(defun mh-bare-components () + "Generate a temporary, clean components file and return its path." + ;; Let comp(1) create the skeleton for us. This is particularly + ;; important with nmh-1.5, because its default "components" needs + ;; some processing before it can be used. Unfortunately, comp(1) + ;; doesn't have a -build option. So, to avoid the possibility of + ;; clobbering an existing draft, create a temporary directory and + ;; use it as the drafts folder. Then copy the skeleton to a regular + ;; temp file, and return the regular temp file. + (let (new + (temp-folder (mm-make-temp-file + (concat mh-user-path "draftfolder.") t))) + (mh-exec-cmd "comp" "-nowhatnowproc" + "-draftfolder" (format "+%s" + (file-name-nondirectory temp-folder)) + (if (stringp mh-comp-formfile) + (list "-form" mh-comp-formfile))) + (setq new (mm-make-temp-file "comp.")) + (rename-file (concat temp-folder "/" "1") new t) + (delete-file (concat temp-folder "/" ".mh_sequences")) + (delete-directory temp-folder) + new)) + (defun mh-read-draft (use initial-contents delete-contents-file) "Read draft file into a draft buffer and make that buffer the current one. @@ -1069,7 +1078,8 @@ (defun mh-insert-x-face () "Append X-Face, Face or X-Image-URL field to header. If the field already exists, this function does nothing." - (when (and (file-exists-p mh-x-face-file) + (when (and (stringp mh-x-face-file) + (file-exists-p mh-x-face-file) (file-readable-p mh-x-face-file)) (save-excursion (unless (or (mh-position-on-field "X-Face") # Begin bundle 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 YhwNyzkgG9y8J/4u5IpwoSEVCJu+