From 99e73103880bdd564b1ffbb264171c2412ae85ac Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Sun, 11 Dec 2005 09:46:52 +0000 Subject: [PATCH] Make StGIT comply with the author information retrieving 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 --- stgit/commands/export.py | 11 ++++++++ stgit/commands/imprt.py | 64 ++++++++++++++++++++++++++++++++++++---------- templates/patchexport.tmpl | 6 ++++- templates/patchmail.tmpl | 2 ++ 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/stgit/commands/export.py b/stgit/commands/export.py index 30b6986..096fb68 100644 --- a/stgit/commands/export.py +++ b/stgit/commands/export.py @@ -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(), diff --git a/stgit/commands/imprt.py b/stgit/commands/imprt.py index 14bf0b6..3759722 100644 --- a/stgit/commands/imprt.py +++ b/stgit/commands/imprt.py @@ -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 diff --git a/templates/patchexport.tmpl b/templates/patchexport.tmpl index cbc938e..e7f3481 100644 --- a/templates/patchexport.tmpl +++ b/templates/patchexport.tmpl @@ -1,4 +1,8 @@ -%(description)s +%(shortdescr)s + +From: %(authname)s <%(authemail)s> + +%(longdescr)s --- %(diffstat)s diff --git a/templates/patchmail.tmpl b/templates/patchmail.tmpl index 1333e85..7881993 100644 --- a/templates/patchmail.tmpl +++ b/templates/patchmail.tmpl @@ -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 --- -- 2.11.0