diff options
author | Konstantin Ryabitsev <konstantin@linuxfoundation.org> | 2020-02-13 11:36:14 -0500 |
---|---|---|
committer | Konstantin Ryabitsev <konstantin@linuxfoundation.org> | 2020-02-13 11:36:14 -0500 |
commit | 0544b2ca93e68e8bee9a34b958aca0bd05029af3 (patch) | |
tree | 4576e30a49b7d0db2a113003609dafb91054be16 | |
parent | f7a4eab9ef08b5998389c89317574a3c012040ed (diff) | |
download | korg-helpers-0544b2ca93e68e8bee9a34b958aca0bd05029af3.tar.gz |
Add -Q to save the mbox as quilt patches
By popular demand, add -Q, which will write out a directory full of
patches and the "series" file that can be manipulated using quilt.
Signed-off-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
-rwxr-xr-x | get-lore-mbox.py | 76 |
1 files changed, 65 insertions, 11 deletions
diff --git a/get-lore-mbox.py b/get-lore-mbox.py index 2f4014d..40a931f 100755 --- a/get-lore-mbox.py +++ b/get-lore-mbox.py @@ -272,7 +272,7 @@ class LoreSeries: if addmysob: usercfg = get_config_from_git(r'user\..*') if 'name' not in usercfg or 'email' not in usercfg: - logger.critical('WARNING: Unable to add your Signed-Off-By: git returned no user.name or user.email') + logger.critical('WARNING: Unable to add your Signed-off-by: git returned no user.name or user.email') addmysob = False mbx = mailbox.mbox(outfile) @@ -284,7 +284,7 @@ class LoreSeries: if self.has_cover and covertrailers and self.patches[0].followup_trailers: lmsg.followup_trailers += self.patches[0].followup_trailers if addmysob: - lmsg.followup_trailers.append(('Signed-Off-By', '%s <%s>' % (usercfg['name'], usercfg['email']))) + lmsg.followup_trailers.append(('Signed-off-by', '%s <%s>' % (usercfg['name'], usercfg['email']))) if addlink: lmsg.followup_trailers.append(('Link', linkmask % lmsg.msgid)) logger.info(' %s', lmsg.full_subject) @@ -484,6 +484,7 @@ class LoreMessage: if wanthdr: new_hdrval = LoreMessage.clean_header(hdrval) am_msg.add_header(hdrname, new_hdrval) + am_msg.set_charset('utf-8') return am_msg @@ -709,8 +710,8 @@ def mbox_to_am(mboxfile, config, cmdargs): else: slug = lser.get_slug() - am_filename = os.path.join(outdir, '%s.mbx' % lser.get_slug()) - am_cover = os.path.join(outdir, '%s.cover' % lser.get_slug()) + am_filename = os.path.join(outdir, '%s.mbx' % slug) + am_cover = os.path.join(outdir, '%s.cover' % slug) am_mbx = lser.save_am_mbox(am_filename, covertrailers, addmysob=cmdargs.addmysob, addlink=cmdargs.addlink, linkmask=config['linkmask']) @@ -744,7 +745,12 @@ def mbox_to_am(mboxfile, config, cmdargs): return linkurl = config['linkmask'] % top_msgid - logger.critical('Link: %s', linkurl) + if cmdargs.quiltready: + q_dirname = os.path.join(outdir, '%s.patches' % slug) + am_mbox_to_quilt(am_mbx, q_dirname) + logger.critical('Quilt: %s', q_dirname) + + logger.critical(' Link: %s', linkurl) base_commit = None matches = re.search(r'base-commit: .*?([0-9a-f]+)', first_body, re.MULTILINE) @@ -757,18 +763,64 @@ def mbox_to_am(mboxfile, config, cmdargs): base_commit = matches.groups()[0] if base_commit: - logger.critical('Base-commit included, you can branch using:') - logger.critical(' git checkout -b %s %s', slug, base_commit) - logger.critical(' git am %s', am_filename) + logger.critical(' Base: %s', base_commit) + logger.critical(' git checkout -b %s %s', slug, base_commit) + logger.critical(' git am %s', am_filename) else: - logger.info('No base-commit information included, sorry.') - logger.info(' git checkout -b %s master', slug) - logger.info(' git am %s', am_filename) + logger.critical(' Base: not found, sorry') + logger.critical(' git checkout -b %s master', slug) + logger.critical(' git am %s', am_filename) + am_mbx.close() return am_filename +def am_mbox_to_quilt(am_mbx, q_dirname): + if os.path.exists(q_dirname): + logger.critical('ERROR: Directory %s exists, not saving quilt patches', q_dirname) + return + os.mkdir(q_dirname, 0o755) + patch_filenames = list() + for key, msg in am_mbx.items(): + # Run each message through git mailinfo + msg_out = mkstemp(suffix=None, prefix=None, dir=q_dirname) + patch_out = mkstemp(suffix=None, prefix=None, dir=q_dirname) + cmdargs = ['mailinfo', '--encoding=UTF-8', msg_out[1], patch_out[1]] + info = git_run_command(None, cmdargs, msg.as_string().encode('utf-8')) + if not len(info.strip()): + logger.critical('ERROR: Could not get mailinfo from patch %s', msg['Subject']) + continue + patchinfo = dict() + for line in info.split('\n'): + chunks = line.split(':', 1) + patchinfo[chunks[0]] = chunks[1] + + slug = re.sub(r'\W+', '_', patchinfo['Subject']).strip('_').lower() + patch_filename = '%04d_%s.patch' % (key+1, slug) + patch_filenames.append(patch_filename) + quilt_out = os.path.join(q_dirname, patch_filename) + with open(quilt_out, 'wb') as fh: + line = 'From: %s <%s>\n' % (patchinfo['Author'].strip(), patchinfo['Email'].strip()) + fh.write(line.encode('utf-8')) + line = 'Subject: %s\n' % patchinfo['Subject'].strip() + fh.write(line.encode('utf-8')) + line = 'Date: %s\n' % patchinfo['Date'].strip() + fh.write(line.encode('utf-8')) + fh.write('\n'.encode('utf-8')) + with open(msg_out[1], 'r') as mfh: + fh.write(mfh.read().encode('utf-8')) + with open(patch_out[1], 'r') as pfh: + fh.write(pfh.read().encode('utf-8')) + logger.debug(' Wrote: %s', patch_filename) + os.unlink(msg_out[1]) + os.unlink(patch_out[1]) + # Write the series file + with open(os.path.join(q_dirname, 'series'), 'w') as sfh: + for patch_filename in patch_filenames: + sfh.write('%s\n' % patch_filename) + + def get_newest_series(mboxfile): # Open the mbox and find the latest series mentioned in it mbx = mailbox.mbox(mboxfile) @@ -937,6 +989,8 @@ if __name__ == '__main__': help='Add a lore.kernel.org/r/ link to every patch (use with -a)') parser.add_argument('-n', '--mbox-name', dest='wantname', default=None, help='Filename to name the mbox file') + parser.add_argument('-Q', '--quilt-ready', dest='quiltready', action='store_true', default=False, + help='Save mbox patches in a quilt-ready folder (use with -a)') parser.add_argument('-d', '--debug', action='store_true', default=False, help='Add more debugging info to the output') parser.add_argument('-q', '--quiet', action='store_true', default=False, |