Home | History | Annotate | Download | only in git-svn
      1 #!/usr/bin/env python
      2 
      3 """
      4 Convert the raw message sources from git patch emails to git-am friendly files.
      5 
      6 Usage:
      7 
      8 1. Mail.app -> Save As -> api.eml (Raw Message Source)
      9 2. .../convert.py api.eml
     10 3. git am [--signoff] < api.eml
     11 4. git svn dcommit [--commit-url https://id@llvm.org/svn/llvm-project/lldb/trunk]
     12 """
     13 
     14 import os, re, sys
     15 import StringIO
     16 
     17 def usage(problem_file=None):
     18     if problem_file:
     19         print "%s is not a file" % problem_file
     20     print "Usage: convert.py raw-message-source [raw-message-source2 ...]"
     21     sys.exit(0)
     22 
     23 def do_convert(file):
     24     """Skip all preceding mail message headers until 'From: ' is encountered.
     25     Then for each line ('From: ' header included), replace the dos style CRLF
     26     end-of-line with unix style LF end-of-line.
     27     """
     28     print "converting %s ..." % file
     29 
     30     with open(file, 'r') as f_in:
     31         content = f_in.read()
     32 
     33     # The new content to be written back to the same file.
     34     new_content = StringIO.StringIO()
     35 
     36     # Boolean flag controls whether to start printing lines.
     37     from_header_seen = False
     38 
     39     # By default, splitlines() don't include line breaks.  CRLF should be gone.
     40     for line in content.splitlines():
     41         # Wait till we scan the 'From: ' header before start printing the lines.
     42         if not from_header_seen:
     43             if not line.startswith('From: '):
     44                 continue
     45             else:
     46                 from_header_seen = True
     47 
     48         print >> new_content, line
     49 
     50     with open(file, 'w') as f_out:
     51         f_out.write(new_content.getvalue())
     52 
     53     print "done"
     54 
     55 def main():
     56     if len(sys.argv) == 1:
     57         usage()
     58     # Convert the raw message source one by one.
     59     for file in sys.argv[1:]:
     60         if not os.path.isfile(file):
     61             usage(file)
     62         do_convert(file)
     63 
     64 if __name__ == '__main__':
     65     main()
     66