convert.py   [plain text]


#!/usr/bin/env python

"""
Convert the raw message sources from git patch emails to git-am friendly files.

Usage:

1. Mail.app -> Save As -> api.eml (Raw Message Source)
2. .../convert.py api.eml
3. git am [--signoff] < api.eml
4. git svn dcommit [--commit-url https://id@llvm.org/svn/llvm-project/lldb/trunk]
"""

import os, re, sys
import StringIO

def usage(problem_file=None):
    if problem_file:
        print "%s is not a file" % problem_file
    print "Usage: convert.py raw-message-source [raw-message-source2 ...]"
    sys.exit(0)

def do_convert(file):
    """Skip all preceding mail message headers until 'From: ' is encountered.
    Then for each line ('From: ' header included), replace the dos style CRLF
    end-of-line with unix style LF end-of-line.
    """
    print "converting %s ..." % file

    with open(file, 'r') as f_in:
        content = f_in.read()

    # The new content to be written back to the same file.
    new_content = StringIO.StringIO()

    # Boolean flag controls whether to start printing lines.
    from_header_seen = False

    # By default, splitlines() don't include line breaks.  CRLF should be gone.
    for line in content.splitlines():
        # Wait till we scan the 'From: ' header before start printing the lines.
        if not from_header_seen:
            if not line.startswith('From: '):
                continue
            else:
                from_header_seen = True

        print >> new_content, line

    with open(file, 'w') as f_out:
        f_out.write(new_content.getvalue())

    print "done"

def main():
    if len(sys.argv) == 1:
        usage()
    # Convert the raw message source one by one.
    for file in sys.argv[1:]:
        if not os.path.isfile(file):
            usage(file)
        do_convert(file)

if __name__ == '__main__':
    main()