#!/usr/bin/python

## zip archive frontend for git-fast-import
##
## For example:
##
##  mkdir project; cd project; git init
##  python import-zips.py *.zip
##  git log --stat import-zips

from os import popen, path
from sys import argv, exit
from time import mktime
from zipfile import ZipFile

if len(argv) < 2:
	print 'Usage:', argv[0], '<zipfile>...'
	exit(1)

branch_ref = 'refs/heads/import-zips'
committer_name = 'Z Ip Creator'
committer_email = 'zip@example.com'

fast_import = popen('git fast-import --quiet', 'w')
def printlines(list):
	for str in list:
		fast_import.write(str + "\n")

for zipfile in argv[1:]:
	commit_time = 0
	next_mark = 1
	common_prefix = None
	mark = dict()

	zip = ZipFile(zipfile, 'r')
	for name in zip.namelist():
		if name.endswith('/'):
			continue
		info = zip.getinfo(name)

		if commit_time < info.date_time:
			commit_time = info.date_time
		if common_prefix == None:
			common_prefix = name[:name.rfind('/') + 1]
		else:
			while not name.startswith(common_prefix):
				last_slash = common_prefix[:-1].rfind('/') + 1
				common_prefix = common_prefix[:last_slash]

		mark[name] = ':' + str(next_mark)
		next_mark += 1

		printlines(('blob', 'mark ' + mark[name], \
					'data ' + str(info.file_size)))
		fast_import.write(zip.read(name) + "\n")

	committer = committer_name + ' <' + committer_email + '> %d +0000' % \
		mktime(commit_time + (0, 0, 0))

	printlines(('commit ' + branch_ref, 'committer ' + committer, \
		'data <<EOM', 'Imported from ' + zipfile + '.', 'EOM', \
		'', 'deleteall'))

	for name in mark.keys():
		fast_import.write('M 100644 ' + mark[name] + ' ' +
			name[len(common_prefix):] + "\n")

	printlines(('',  'tag ' + path.basename(zipfile), \
		'from ' + branch_ref, 'tagger ' + committer, \
		'data <<EOM', 'Package ' + zipfile, 'EOM', ''))

if fast_import.close():
	exit(1)
