[MERGE] EmacsMail improvements

Christophe TROESTLER Christophe.Troestler+bzr at umh.ac.be
Sat Jul 5 15:25:59 BST 2008


On Thu, 03 Jul 2008 14:00:07 +1000, Ian Clatworthy wrote:
> 
> (...) replace tabs with spaces (...) NEWS ought to be tweaked as well

Done.  New patch attached.

Cheers,
Christophe
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: christophe.troestler at umh.ac.be-20080705141934-\
#   7vl7b4zfm3tvfili
# target_branch: ../bzr.dev/
# testament_sha1: 67c774a79b7902bfe15a330b9937de1ffa370365
# timestamp: 2008-07-05 16:20:19 +0200
# base_revision_id: pqm at pqm.ubuntu.com-20080620010918-64z4xylh1ap5hgyf
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2008-06-20 00:44:46 +0000
+++ NEWS	2008-07-05 14:19:34 +0000
@@ -14,6 +14,10 @@
       to stdout; also ``tar`` and ``tbz2``.
       (Martin Pool)
 
+    * ``bzr send'' documents and better supports `emacsclient' (proper
+      escaping of mail headers and handling of the MUA Mew).
+      (Christophe Troestler)
+
   BUGFIXES:
 
     * Clearer message about how to set the PYTHONPATH if bzrlib can't be

=== modified file 'bzrlib/builtins.py'
--- bzrlib/builtins.py	2008-06-17 03:55:49 +0000
+++ bzrlib/builtins.py	2008-06-30 09:34:02 +0000
@@ -4168,7 +4168,8 @@
     To use a specific mail program, set the mail_client configuration option.
     (For Thunderbird 1.5, this works around some bugs.)  Supported values for
     specific clients are "evolution", "kmail", "mutt", and "thunderbird";
-    generic options are "default", "editor", "mapi", and "xdg-email".
+    generic options are "default", "editor", "emacsclient", "mapi", and
+    "xdg-email".
 
     If mail is being sent, a to address is required.  This can be supplied
     either on the commandline, by setting the submit_to configuration

=== modified file 'bzrlib/mail_client.py'
--- bzrlib/mail_client.py	2008-04-13 11:48:00 +0000
+++ bzrlib/mail_client.py	2008-07-05 14:19:34 +0000
@@ -328,31 +328,40 @@
         This temporary file will be loaded at runtime in
         _get_compose_commandline function.
 
-        FIXME: this function does not remove the file. That's a wanted
+        This function does not remove the file.  That's a wanted
         behaviour since _get_compose_commandline won't run the send
         mail function directly but return the eligible command line.
         Removing our temporary file here would prevent our sendmail
-        function to work.
-
-        A possible workaround could be to load the function here with
-        emacsclient --eval '(load temp)' but this is not robust since
-        emacs could have been stopped between here and the call to
-        mail client.
+        function to work.  (The file is deleted by some elisp code
+        after being read by Emacs.)
         """
 
         _defun = r"""(defun bzr-add-mime-att (file)
-  "Attach FILe to a mail buffer as a MIME attachment."
+  "Attach FILE to a mail buffer as a MIME attachment."
   (let ((agent mail-user-agent))
-    (mail-text)
-    (newline)
     (if (and file (file-exists-p file))
         (cond
          ((eq agent 'sendmail-user-agent)
-          (etach-attach file))
+          (progn
+            (mail-text)
+            (newline)
+            (if (functionp 'etach-attach)
+              (etach-attach file)
+              (mail-attach-file file))))
          ((or (eq agent 'message-user-agent)(eq agent 'gnus-user-agent))
-          (mml-attach-file file "text/x-patch" "BZR merge" "attachment"))
+          (progn
+            (mml-attach-file file "text/x-patch" "BZR merge" "inline")))
+         ((eq agent 'mew-user-agent)
+          (progn
+            (mew-draft-prepare-attachments)
+            (mew-attach-link file (file-name-nondirectory file))
+            (let* ((nums (mew-syntax-nums))
+                   (syntax (mew-syntax-get-entry mew-encode-syntax nums)))
+              (mew-syntax-set-cd syntax "BZR merge")
+              (mew-encode-syntax-print mew-encode-syntax))
+            (mew-header-goto-body)))
          (t
-          (message "Unhandled MUA")))
+          (message "Unhandled MUA, report it on bazaar at lists.canonical.com")))
       (error "File %s does not exist." file))))
 """
 
@@ -371,9 +380,10 @@
         _subject = "nil"
 
         if to is not None:
-            _to = ("\"%s\"" % self._encode_safe(to))
+            _to = ("\"%s\"" % self._encode_safe(to).replace('"', '\\"'))
         if subject is not None:
-            _subject = ("\"%s\"" % self._encode_safe(subject))
+            _subject = ("\"%s\"" %
+                        self._encode_safe(subject).replace('"', '\\"'))
 
         # Funcall the default mail composition function
         # This will work with any mail mode including default mail-mode
@@ -385,11 +395,14 @@
         # Try to attach a MIME attachment using our wrapper function
         if attach_path is not None:
             # Do not create a file if there is no attachment
-            lmmform = '(load "%s")' % self._prepare_send_function()
+            elisp = self._prepare_send_function()
+            lmmform = '(load "%s")' % elisp
             mmform  = '(bzr-add-mime-att "%s")' % \
                 self._encode_path(attach_path, 'attachment')
+            rmform = '(delete-file "%s")' % elisp
             commandline.append(lmmform)
             commandline.append(mmform)
+            commandline.append(rmform)
 
         return commandline
 

# Begin bundle
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


More information about the bazaar mailing list