63801da88d
Embarrassingly, the common prefix calculation did not work properly, due to a mistake in the assignment: instead of assigning the dirname of the current file name, the dirname of the current common prefix needs to be assigned to common prefix, when the current prefix does not match the current file name. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
74 lines
1.8 KiB
Python
Executable File
74 lines
1.8 KiB
Python
Executable File
#!/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)
|