Ask git for author and committer name
[stgit] / stgit / commands / mail.py
index 154df9c..5d71657 100644 (file)
@@ -52,33 +52,28 @@ SMTP authentication is also possible with '--smtp-user' and
 '--smtp-password' options, also available as configuration settings:
 'smtpuser' and 'smtppassword'.
 
-The template e-mail headers and body must be separated by
-'%(endofheaders)s' variable, which is replaced by StGIT with
-additional headers and a blank line. The patch e-mail template accepts
-the following variables:
+The patch e-mail template accepts the following variables:
 
   %(patch)s        - patch name
-  %(maintainer)s   - 'authname <authemail>' as read from the config file
+  %(sender)s       - 'sender'  or 'authname <authemail>' as per the config file
   %(shortdescr)s   - the first line of the patch description
   %(longdescr)s    - the rest of the patch description, after the first line
-  %(endofheaders)s - delimiter between e-mail headers and body
   %(diff)s         - unified diff of the patch
   %(diffstat)s     - diff statistics
-  %(date)s         - current date/time
   %(version)s      - ' version' string passed on the command line (or empty)
   %(prefix)s       - 'prefix ' string passed on the command line
   %(patchnr)s      - patch number
   %(totalnr)s      - total number of patches to be sent
   %(number)s       - empty if only one patch is sent or ' patchnr/totalnr'
+  %(fromauth)s     - 'From: author\\n\\n' if different from sender
   %(authname)s     - author's name
   %(authemail)s    - author's email
   %(authdate)s     - patch creation date
   %(commname)s     - committer's name
   %(commemail)s    - committer's e-mail
 
-For the preamble e-mail template, only the %(maintainer)s, %(date)s,
-%(endofheaders)s, %(version)s, %(patchnr)s, %(totalnr)s and %(number)s
-variables are supported."""
+For the preamble e-mail template, only the %(sender)s, %(version)s,
+%(patchnr)s, %(totalnr)s and %(number)s variables are supported."""
 
 options = [make_option('-a', '--all',
                        help = 'e-mail all the applied patches',
@@ -127,16 +122,22 @@ options = [make_option('-a', '--all',
                        action = 'store_true')]
 
 
-def __get_maintainer():
+def __get_sender():
     """Return the 'authname <authemail>' string as read from the
     configuration file
     """
-    if config.has_option('stgit', 'authname') \
-           and config.has_option('stgit', 'authemail'):
-        return '%s <%s>' % (config.get('stgit', 'authname'),
-                            config.get('stgit', 'authemail'))
+    if config.has_option('stgit', 'sender'):
+        sender = config.get('stgit', 'sender')
     else:
-        return None
+        try:
+            sender = str(git.user())
+        except git.GitException:
+            sender = str(git.author())
+
+    if not sender:
+        raise CmdException, 'unknown sender details'
+
+    return sender
 
 def __parse_addresses(addresses):
     """Return a two elements tuple: (from, [to])
@@ -270,7 +271,7 @@ def __encode_message(msg):
     # encode the body and set the MIME and encoding headers
     msg.set_charset(charset)
 
-def edit_message(msg):
+def __edit_message(msg):
     fname = '.stgitmail.txt'
 
     # create the initial file
@@ -301,9 +302,7 @@ def edit_message(msg):
 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 = ''
+    sender = __get_sender()
 
     if options.version:
         version_str = ' %s' % options.version
@@ -322,7 +321,9 @@ def __build_cover(tmpl, total_nr, msg_id, options):
     else:
         number_str = ''
 
-    tmpl_dict = {'maintainer':   maintainer,
+    tmpl_dict = {'sender':       sender,
+                 # for backward template compatibility
+                 'maintainer':   sender,
                  # for backward template compatibility
                  'endofheaders': '',
                  # for backward template compatibility
@@ -342,6 +343,9 @@ def __build_cover(tmpl, total_nr, msg_id, options):
         raise CmdException, 'Only "%(name)s" variables are ' \
               'supported in the patch template'
 
+    if options.edit_cover:
+        msg_string = __edit_message(msg_string)
+
     # The Python email message
     try:
         msg = email.message_from_string(msg_string)
@@ -354,9 +358,6 @@ def __build_cover(tmpl, total_nr, msg_id, options):
 
     msg_string = msg.as_string(options.mbox)
 
-    if options.edit_cover:
-        msg_string = edit_message(msg_string)
-
     return msg_string.strip('\n')
 
 def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
@@ -370,9 +371,18 @@ def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
     short_descr = descr_lines[0].rstrip()
     long_descr = '\n'.join(descr_lines[1:]).lstrip()
 
-    maintainer = __get_maintainer()
-    if not maintainer:
-        maintainer = '%s <%s>' % (p.get_commname(), p.get_commemail())
+    authname = p.get_authname();
+    authemail = p.get_authemail();
+    commname = p.get_commname();
+    commemail = p.get_commemail();
+
+    sender = __get_sender()
+
+    fromauth = '%s <%s>' % (authname, authemail)
+    if fromauth != sender:
+        fromauth = 'From: %s\n\n' % fromauth
+    else:
+        fromauth = ''
 
     if options.version:
         version_str = ' %s' % options.version
@@ -392,7 +402,9 @@ def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
         number_str = ''
 
     tmpl_dict = {'patch':        patch,
-                 'maintainer':   maintainer,
+                 'sender':       sender,
+                 # for backward template compatibility
+                 'maintainer':   sender,
                  'shortdescr':   short_descr,
                  'longdescr':    long_descr,
                  # for backward template compatibility
@@ -408,11 +420,12 @@ def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
                  'patchnr':      patch_nr_str,
                  'totalnr':      total_nr_str,
                  'number':       number_str,
-                 'authname':     p.get_authname(),
-                 'authemail':    p.get_authemail(),
+                 'fromauth':     fromauth,
+                 'authname':     authname,
+                 'authemail':    authemail,
                  'authdate':     p.get_authdate(),
-                 'commname':     p.get_commname(),
-                 'commemail':    p.get_commemail()}
+                 'commname':     commname,
+                 'commemail':    commemail}
     # change None to ''
     for key in tmpl_dict:
         if not tmpl_dict[key]:
@@ -427,6 +440,9 @@ def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
         raise CmdException, 'Only "%(name)s" variables are ' \
               'supported in the patch template'
 
+    if options.edit_patches:
+        msg_string = __edit_message(msg_string)
+
     # The Python email message
     try:
         msg = email.message_from_string(msg_string)
@@ -444,9 +460,6 @@ def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
 
     msg_string = msg.as_string(options.mbox)
 
-    if options.edit_patches:
-        msg_string = edit_message(msg_string)
-
     return msg_string.strip('\n')
 
 def func(parser, options, args):