1#!/usr/local/bin/python 2 3## zip archive frontend for git-fast-import 4## 5## For example: 6## 7## mkdir project; cd project; git init 8## python import-zips.py *.zip 9## git log --stat import-zips 10 11from os import popen, path 12from sys import argv, exit, hexversion, stderr 13from time import mktime 14from zipfile import ZipFile 15 16if hexversion < 0x01060000: 17 # The limiter is the zipfile module 18 stderr.write("import-zips.py: requires Python 1.6.0 or later.\n") 19 exit(1) 20 21if len(argv) < 2: 22 print 'usage:', argv[0], '<zipfile>...' 23 exit(1) 24 25branch_ref = 'refs/heads/import-zips' 26committer_name = 'Z Ip Creator' 27committer_email = 'zip@example.com' 28 29fast_import = popen('git fast-import --quiet', 'w') 30def printlines(list): 31 for str in list: 32 fast_import.write(str + "\n") 33 34for zipfile in argv[1:]: 35 commit_time = 0 36 next_mark = 1 37 common_prefix = None 38 mark = dict() 39 40 zip = ZipFile(zipfile, 'r') 41 for name in zip.namelist(): 42 if name.endswith('/'): 43 continue 44 info = zip.getinfo(name) 45 46 if commit_time < info.date_time: 47 commit_time = info.date_time 48 if common_prefix == None: 49 common_prefix = name[:name.rfind('/') + 1] 50 else: 51 while not name.startswith(common_prefix): 52 last_slash = common_prefix[:-1].rfind('/') + 1 53 common_prefix = common_prefix[:last_slash] 54 55 mark[name] = ':' + str(next_mark) 56 next_mark += 1 57 58 printlines(('blob', 'mark ' + mark[name], \ 59 'data ' + str(info.file_size))) 60 fast_import.write(zip.read(name) + "\n") 61 62 committer = committer_name + ' <' + committer_email + '> %d +0000' % \ 63 mktime(commit_time + (0, 0, 0)) 64 65 printlines(('commit ' + branch_ref, 'committer ' + committer, \ 66 'data <<EOM', 'Imported from ' + zipfile + '.', 'EOM', \ 67 '', 'deleteall')) 68 69 for name in mark.keys(): 70 fast_import.write('M 100644 ' + mark[name] + ' ' + 71 name[len(common_prefix):] + "\n") 72 73 printlines(('', 'tag ' + path.basename(zipfile), \ 74 'from ' + branch_ref, 'tagger ' + committer, \ 75 'data <<EOM', 'Package ' + zipfile, 'EOM', '')) 76 77if fast_import.close(): 78 exit(1) 79