Make StGIT comply with the author information retrieving
authorCatalin Marinas <catalin.marinas@gmail.com>
Sun, 11 Dec 2005 09:46:52 +0000 (09:46 +0000)
committerCatalin Marinas <catalin.marinas@gmail.com>
Sun, 11 Dec 2005 09:46:52 +0000 (09:46 +0000)
The import command should search for a "From:" line in the body of the mail
(or patch description) and use the author information from there. The
export and mail commands should automatically add a "From:" line to the
patch description.

Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com>
stgit/commands/export.py
stgit/commands/imprt.py
templates/patchexport.tmpl
templates/patchmail.tmpl

index 30b6986..096fb68 100644 (file)
@@ -37,6 +37,8 @@ patch format. The following variables are supported in the template
 file:
 
   %(description)s - patch description
+  %(shortdescr)s  - the first line of the patch description
+  %(longdescr)s   - the rest of the patch description, after the first line
   %(diffstat)s    - the diff statistics
   %(authname)s    - author's name
   %(authemail)s   - author's e-mail
@@ -158,7 +160,16 @@ def func(parser, options, args):
         # get the patch description
         patch = crt_series.get_patch(p)
 
+        descr = patch.get_description().strip()
+        descr_lines = descr.split('\n')
+
+        short_descr = descr_lines[0].rstrip()
+        long_descr = reduce(lambda x, y: x + '\n' + y,
+                            descr_lines[1:], '').strip()
+
         tmpl_dict = {'description': patch.get_description().rstrip(),
+                     'shortdescr': short_descr,
+                     'longdescr': long_descr,
                      'diffstat': git.diffstat(rev1 = patch.get_bottom(),
                                               rev2 = patch.get_top()),
                      'authname': patch.get_authname(),
index 14bf0b6..3759722 100644 (file)
@@ -34,8 +34,7 @@ mail format, the Subject, From and Date headers being used for
 generating the patch information.
 
 The patch description has to be separated from the data with a '---'
-line. For a normal file, if no author information is given, the first
-'Signed-off-by:' line is used."""
+line."""
 
 options = [make_option('-m', '--mail',
                        help = 'import the patch from a standard e-mail file',
@@ -67,7 +66,43 @@ options = [make_option('-m', '--mail',
 def __end_descr(line):
     return re.match('---\s*$', line) or re.match('diff -', line) or \
             re.match('Index: ', line)
-    
+
+def __parse_description(descr):
+    """Parse the patch description and return the new description and
+    author information (if any).
+    """
+    subject = body = ''
+    authname = authemail = None
+
+    descr_lines = [line.strip() for line in descr.split('\n')]
+    if not descr_lines:
+        raise CmdException, "Empty patch description"
+
+    pos = 1
+    end = len(descr_lines)
+
+    # get the subject
+    subject = descr_lines[0]
+
+    # ignore the empty lines after subject
+    while pos < end and descr_lines[pos] == '':
+        pos += 1
+
+    # check for a "From:" line
+    if pos < end and re.match('from:\s+', descr_lines[pos], re.I):
+        auth = re.findall('^.*?:\s+(.*)$', descr_lines[pos])[0]
+        authname, authemail = name_email(auth)
+        pos += 1
+
+        # ignore the empty lines
+        while pos < end and descr_lines[pos] == '':
+            pos += 1
+
+    # get the body
+    body = reduce(lambda x, y: x + '\n' + y, descr_lines[pos:], '').strip()
+
+    return (subject + '\n\n' + body, authname, authemail)
+
 def __parse_mail(filename = None):
     """Parse the input file in a mail format and return (description,
     authname, authemail, authdate)
@@ -118,6 +153,13 @@ def __parse_mail(filename = None):
     if filename:
         f.close()
 
+    # parse the description for author information
+    descr, descr_authname, descr_authemail = __parse_description(descr)
+    if descr_authname:
+        authname = descr_authname
+    if descr_authemail:
+        authemail = descr_authemail
+
     return (descr, authname, authemail, authdate)
 
 def __parse_patch(filename = None):
@@ -129,32 +171,26 @@ def __parse_patch(filename = None):
     else:
         f = sys.stdin
 
-    authname = authemail = authdate = None
-
     descr = ''
     while True:
         line = f.readline()
         if not line:
             break
 
-        # the first 'Signed-of-by:' is the author
-        if not authname and re.match('signed-off-by:\s+', line, re.I):
-            auth = re.findall('^.*?:\s+(.*)$', line)[0]
-            authname, authemail = name_email(auth)
-
         if __end_descr(line):
             break
         else:
             descr += line
     descr.rstrip()
 
-    if descr == '':
-        descr = None
-
     if filename:
         f.close()
 
-    return (descr, authname, authemail, authdate)
+    descr, authname, authemail = __parse_description(descr)
+
+    # we don't yet have an agreed place for the creation date.
+    # Just return None
+    return (descr, authname, authemail, None)
 
 def func(parser, options, args):
     """Import a GNU diff file as a new patch
index cbc938e..e7f3481 100644 (file)
@@ -1,4 +1,8 @@
-%(description)s
+%(shortdescr)s
+
+From: %(authname)s <%(authemail)s>
+
+%(longdescr)s
 ---
 
 %(diffstat)s
index 1333e85..7881993 100644 (file)
@@ -2,6 +2,8 @@ From: %(maintainer)s
 Subject: [PATCH%(version)s%(number)s] %(shortdescr)s
 Date: %(date)s
 %(endofheaders)s
+From: %(authname)s <%(authemail)s>
+
 %(longdescr)s
 ---