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
90
91
92
93
94
95
96
97
|
#!/usr/bin/env python3
import glob
import tarfile
import sys
from optparse import OptionParser
import os
class GitImportTar(object):
def __init__(self, filename, head):
self.mark = 1
self.git = sys.stdout
self.files = {}
self.name = filename
self.mtime = 0
self.head = head
def addfile(self, info, prefix = '', file = None):
if info.isdir():
return
self.git.write("blob\n" +
"mark :%d\n" % self.mark)
mode = info.mode
if info.issym():
self.git.write("data %d\n" % len(info.linkname) +
info.linkname)
mode = 0o120000
elif file:
self.git.write("data %d\n" % (info.size))
self.git.flush()
self.git.buffer.write(file.read(info.size))
self.git.write("\n")
if not prefix in self.files:
self.files[prefix] = {}
self.files[prefix][info.name] = (self.mark, mode)
self.mark += 1
if info.mtime > self.mtime:
self.mtime = info.mtime
def close(self):
self.git.write("commit refs/heads/%s\n" % (self.head) +
"author T Ar Creator' <tar@example.com> %d +0000\n" % (self.mtime) +
"committer T Ar Creator' <tar@example.com> %d +0000\n" % (self.mtime) +
"data <<EOM\n" +
"Imported from %s\n" % (self.name) +
"EOM\n\n" +
"from refs/heads/%s^0\n" % (self.head) +
"deleteall\n")
for prefix, fileset in self.files.items():
basedir = os.path.commonprefix(list(fileset.keys()))
for path, info in fileset.items():
(mark, mode) = info
if mode != 0o120000:
mode = 0o755 if (mode & 0o111) else 0o644
path = path[len(basedir):].lstrip('/')
if prefix != '':
path = prefix + '/' + path
self.git.write("M %o :%d %s\n" % (mode, mark, path))
def main():
parser = OptionParser()
parser.add_option("-H", "--head", dest="head",
help="import on the given head", metavar="NAME")
(options, args) = parser.parse_args()
if not options.head:
options.head = "upstream"
(name, ext) = os.path.splitext(args[0])
if ext[0:2] != '.t':
(name, ext) = os.path.splitext(name)
git_import = GitImportTar(os.path.basename(args[0]), options.head)
for file in [args[0]] + glob.glob(name + "-*" + ext + "*"):
(_, this_ext) = os.path.splitext(file)
if this_ext == ext:
prefix = file[len(name)+1:-len(this_ext)]
else:
prefix = file[len(name)+1:-len(this_ext) - len(ext)]
tar = tarfile.open(file, "r:*")
while True:
info = tar.next()
if not info:
break
if info.isfile():
file = tar.extractfile(info)
git_import.addfile(info, prefix, file)
else:
git_import.addfile(info, prefix)
tar.close()
git_import.close()
if __name__ == '__main__':
main()
|