summaryrefslogtreecommitdiff
path: root/lorry.gzip-importer
blob: 1830ff9df90916efccd909caaab25b80de92c58f (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python3

# Copyright 2015, 2019-2020 Codethink Limited

# gzip archive frontend for git-fast-import

import os.path
import struct
import subprocess
import sys
from gzip import GzipFile

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


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


def export(zipfile, fast_import):
    def printlines(list):
        for str in list:
            fast_import.write(str.encode("utf-8") + b"\n")

    # 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 = os.path.getmtime(zipfile)
    file_size = uncompressedsize(zipfile)
    zip = GzipFile(zipfile, "rb")

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

    committer = committer_name + " <" + committer_email + "> %d +0000" % mtime

    zipfile_basename = os.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]
    printlines(("M 100644 :1 " + unzipped_file,))

    zipname, _ = os.path.splitext(zipfile_basename)
    printlines(
        (
            "",
            "tag " + zipname,
            "from " + branch_ref,
            "tagger " + committer,
            "data <<EOM",
            "Package " + zipfile,
            "EOM",
            "",
        )
    )


def main():
    if len(sys.argv) < 2:
        print("usage:", sys.argv[0], "<gzipfile>...")
        sys.exit(1)

    with subprocess.Popen(
        "git fast-import --quiet", shell=True, stdin=subprocess.PIPE
    ) as import_proc:
        for zipfile in sys.argv[1:]:
            export(zipfile, import_proc.stdin)
        import_proc.stdin.close()
        if import_proc.wait() != 0:
            sys.exit(1)


main()