summaryrefslogtreecommitdiff
path: root/lorry.gzip-importer
blob: c1c721544313e139071dea971927a4dcef173cf6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python

# gzip archive frontend for git-fast-import

from os import popen, path
from os.path import splitext
from os.path import getmtime
from sys import argv, exit, hexversion, stderr
from gzip import GzipFile
import struct

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

branch_name = 'master'
branch_ref = 'refs/heads/%s' % branch_name
committer_name = 'Lorry Gzip Importer'
committer_email = 'lorry-gzip-importer@lorry'

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

# The size of a gzip file is stored in the last 4 bytes
def uncompressedsize(filename):
    with open(filename) as f:
        f.seek(-4, 2)
        return struct.unpack('I', f.read(4))[0]

for zipfile in argv[1:]:

    # Gzip does have an encoded mtime, however Python's GzipFile
    # just ignores it, so we just yank the mtime of the zip file itself.
    mtime = getmtime (zipfile);
    file_size = uncompressedsize (zipfile);
    zip = GzipFile(zipfile, 'rb')

    printlines(('blob', 'mark :1', 'data ' + str(file_size)))
    fast_import.write(zip.read() + "\n")

    committer = committer_name + ' <' + committer_email + '> %d +0000' % \
        mtime

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

    last_dot = zipfile_basename[:-1].rfind('.')
    unzipped_file = zipfile_basename[:last_dot]
    fast_import.write('M 100644 :1 ' + unzipped_file + '\n');

    zipname, _ = splitext(zipfile_basename)
    printlines(('',  'tag ' + zipname, \
        'from ' + branch_ref, 'tagger ' + committer, \
        'data <<EOM', 'Package ' + zipfile, 'EOM', ''))

if fast_import.close():
    exit(1)