summaryrefslogtreecommitdiffstats
path: root/debian/import-tar.py
diff options
context:
space:
mode:
Diffstat (limited to 'debian/import-tar.py')
-rwxr-xr-xdebian/import-tar.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/debian/import-tar.py b/debian/import-tar.py
new file mode 100755
index 0000000000..36772f81f1
--- /dev/null
+++ b/debian/import-tar.py
@@ -0,0 +1,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):]
+ 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()