chiark / gitweb /
Allow the editing of the cover message before sending it by e-mail
authorCatalin Marinas <catalin.marinas@gmail.com>
Fri, 21 Oct 2005 13:25:23 +0000 (14:25 +0100)
committerCatalin Marinas <catalin.marinas@gmail.com>
Fri, 21 Oct 2005 13:25:23 +0000 (14:25 +0100)
When sending e-mails, it is easier to automatically invoke the editor on
the cover message than writing it separately. This patch renames the
--first option to --cover and allows a --edit option to edit the final
message before sending it. With --edit only, the tool will use the default
template in .git/covermail.tmpl or
/usr/share/stgit/templates/covermail.tmpl.

Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com>
examples/firstmail.tmpl [deleted file]
stgit/commands/mail.py
templates/covermail.tmpl [new file with mode: 0644]

diff --git a/examples/firstmail.tmpl b/examples/firstmail.tmpl
deleted file mode 100644 (file)
index 3b8073a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-From: Your Name <your.name@yourcompany.com>
-To: Some Address <some.address@somelist.com>
-Cc: other.address@otherlist.com, other.person@othercompany.com
-Bcc: Your Name <your.name@yourcompany.com>
-Subject: [PATCH%(version)s%(number)s] Series short description
-Date: %(date)s
-%(endofheaders)s
-The following series implements...
-
---
-Your signature
index a53f3afefe090b58d3af3c419059141df6e460da..6c761bdbb8a3f3735dfe151a25c120d0c0475e8a 100644 (file)
@@ -36,10 +36,15 @@ or /usr/share/stgit/templates/patchmail.tmpl). The To/Cc/Bcc addresses
 can either be added to the template file or passed via the
 corresponding command line options.
 
 can either be added to the template file or passed via the
 corresponding command line options.
 
-A preamble e-mail can be sent using the '--first' option. All the
-subsequent e-mails appear as replies to the first e-mail sent (either
-the preamble or the first patch). E-mails can be seen as replies to a
-different e-mail by using the '--refid' option.
+A preamble e-mail can be sent using the '--cover' and/or '--edit'
+options. The first allows the user to specify a file to be used as a
+template. The latter option will invoke the editor on the specified
+file (defaulting to .git/covermail.tmpl or
+/usr/share/stgit/templates/covermail.tmpl).
+
+All the subsequent e-mails appear as replies to the first e-mail sent
+(either the preamble or the first patch). E-mails can be seen as
+replies to a different e-mail by using the '--refid' option.
 
 SMTP authentication is also possible with '--smtp-user' and
 '--smtp-password' options, also available as configuration settings:
 
 SMTP authentication is also possible with '--smtp-user' and
 '--smtp-password' options, also available as configuration settings:
@@ -91,8 +96,11 @@ options = [make_option('-a', '--all',
                        help = 'add VERSION to the [PATCH ...] prefix'),
            make_option('-t', '--template', metavar = 'FILE',
                        help = 'use FILE as the message template'),
                        help = 'add VERSION to the [PATCH ...] prefix'),
            make_option('-t', '--template', metavar = 'FILE',
                        help = 'use FILE as the message template'),
-           make_option('-f', '--first', metavar = 'FILE',
-                       help = 'send FILE as the first message'),
+           make_option('-c', '--cover', metavar = 'FILE',
+                       help = 'send FILE as the cover message'),
+           make_option('-e', '--edit',
+                       help = 'edit the cover message before sending',
+                       action = 'store_true'),
            make_option('-s', '--sleep', type = 'int', metavar = 'SECONDS',
                        help = 'sleep for SECONDS between e-mails sending'),
            make_option('--refid',
            make_option('-s', '--sleep', type = 'int', metavar = 'SECONDS',
                        help = 'sleep for SECONDS between e-mails sending'),
            make_option('--refid',
@@ -182,8 +190,8 @@ def __build_address_headers(options):
        headers_end = headers_end[:-1] + '\n'
     return headers_end
 
        headers_end = headers_end[:-1] + '\n'
     return headers_end
 
-def __build_first(tmpl, total_nr, msg_id, options):
-    """Build the first message (series description) to be sent via SMTP
+def __build_cover(tmpl, total_nr, msg_id, options):
+    """Build the cover message (series description) to be sent via SMTP
     """
     maintainer = __get_maintainer()
     if not maintainer:
     """
     maintainer = __get_maintainer()
     if not maintainer:
@@ -221,6 +229,32 @@ def __build_first(tmpl, total_nr, msg_id, options):
         raise CmdException, 'Only "%(name)s" variables are ' \
               'supported in the patch template'
 
         raise CmdException, 'Only "%(name)s" variables are ' \
               'supported in the patch template'
 
+    if options.edit:
+        fname = '.stgitmail.txt'
+
+        # create the initial file
+        f = file(fname, 'w+')
+        f.write(msg)
+        f.close()
+
+        # the editor
+        if config.has_option('stgit', 'editor'):
+            editor = config.get('stgit', 'editor')
+        elif 'EDITOR' in os.environ:
+            editor = os.environ['EDITOR']
+        else:
+            editor = 'vi'
+        editor += ' %s' % fname
+
+        print 'Invoking the editor: "%s"...' % editor,
+        sys.stdout.flush()
+        print 'done (exit code: %d)' % os.system(editor)
+
+        # read the message back
+        f = file(fname)
+        msg = f.read()
+        f.close()
+
     return msg
 
 def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
     return msg
 
 def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
@@ -370,18 +404,32 @@ def func(parser, options, args):
     else:
         sleep = 2
 
     else:
         sleep = 2
 
-    # send the first message (if any)
-    if options.first:
-        tmpl = file(options.first).read()
+    # send the cover message (if any)
+    if options.cover or options.edit:
+        # find the template file
+        if options.cover:
+            tfile_list = [options.cover]
+        else:
+            tfile_list = [os.path.join(git.base_dir, 'covermail.tmpl'),
+                          os.path.join(sys.prefix,
+                                       'share/stgit/templates/covermail.tmpl')]
+
+        tmpl = None
+        for tfile in tfile_list:
+            if os.path.isfile(tfile):
+                tmpl = file(tfile).read()
+                break
+        if not tmpl:
+            raise CmdException, 'No cover message template file found'
 
         msg_id = email.Utils.make_msgid('stgit')
 
         msg_id = email.Utils.make_msgid('stgit')
-        msg = __build_first(tmpl, total_nr, msg_id, options)
+        msg = __build_cover(tmpl, total_nr, msg_id, options)
         from_addr, to_addr_list = __parse_addresses(msg)
 
         # subsequent e-mails are seen as replies to the first one
         ref_id = msg_id
 
         from_addr, to_addr_list = __parse_addresses(msg)
 
         # subsequent e-mails are seen as replies to the first one
         ref_id = msg_id
 
-        print 'Sending file "%s"...' % options.first,
+        print 'Sending the cover message...',
         sys.stdout.flush()
 
         __send_message(smtpserver, from_addr, to_addr_list, msg, sleep,
         sys.stdout.flush()
 
         __send_message(smtpserver, from_addr, to_addr_list, msg, sleep,
@@ -393,19 +441,16 @@ def func(parser, options, args):
     if options.template:
         tfile_list = [options.template]
     else:
     if options.template:
         tfile_list = [options.template]
     else:
-        tfile_list = []
-
-    tfile_list += [os.path.join(git.base_dir, 'patchmail.tmpl'),
-                   os.path.join(sys.prefix,
-                                'share/stgit/templates/patchmail.tmpl')]
+        tfile_list = [os.path.join(git.base_dir, 'patchmail.tmpl'),
+                      os.path.join(sys.prefix,
+                                   'share/stgit/templates/patchmail.tmpl')]
     tmpl = None
     for tfile in tfile_list:
         if os.path.isfile(tfile):
             tmpl = file(tfile).read()
             break
     if not tmpl:
     tmpl = None
     for tfile in tfile_list:
         if os.path.isfile(tfile):
             tmpl = file(tfile).read()
             break
     if not tmpl:
-        raise CmdException, 'No e-mail template file: %s or %s' \
-              % (tfile_list[-1], tfile_list[-2])
+        raise CmdException, 'No e-mail template file found'
 
     for (p, patch_nr) in zip(patches, range(1, len(patches) + 1)):
         msg_id = email.Utils.make_msgid('stgit')
 
     for (p, patch_nr) in zip(patches, range(1, len(patches) + 1)):
         msg_id = email.Utils.make_msgid('stgit')
diff --git a/templates/covermail.tmpl b/templates/covermail.tmpl
new file mode 100644 (file)
index 0000000..9789c9c
--- /dev/null
@@ -0,0 +1,8 @@
+From: %(maintainer)s
+Subject: [PATCH%(version)s%(number)s] Series short description
+Date: %(date)s
+%(endofheaders)s
+The following series implements...
+
+--
+Signature