summaryrefslogtreecommitdiffstats
path: root/feed/sse_tar.py
diff options
context:
space:
mode:
Diffstat (limited to 'feed/sse_tar.py')
-rwxr-xr-xfeed/sse_tar.py136
1 files changed, 119 insertions, 17 deletions
diff --git a/feed/sse_tar.py b/feed/sse_tar.py
index 79671f6..bb01987 100755
--- a/feed/sse_tar.py
+++ b/feed/sse_tar.py
@@ -1,12 +1,19 @@
#!/usr/bin/python
-import tarfile, zipfile, sys, os
-import sse_feed
+import sse_feed, sse_db
-def archive_uncompress(archive, root, meta = {}):
+from sse_config import *
+from sse_defs import *
+import tarfile, zipfile, sys, os, time
+from md5 import new as message_digest
+
+def uncompress_tar(archive, root, package_id, meta = {}):
+ n = 0
f = tarfile.open(archive, "r")
+ print "Processing TAR file %s." % archive
+
while True:
i = f.next()
@@ -21,46 +28,141 @@ def archive_uncompress(archive, root, meta = {}):
continue
dst = os.path.join(root, i.name)
- f.extract(i, dst)
+
+ try:
+ os.makedirs(os.path.dirname(dst))
+ except:
+ pass
+
+ x = f.extractfile(i)
+ o = file(dst, "w")
+ while True:
+ data = x.read(SSE_BLOCK_SIZE)
+
+ if len(data) <= 0:
+ break
+
+ o.write(data)
+ o.close()
+
os.utime(dst, (i.mtime, i.mtime))
- sse_feed.process_source(archive, root, i.name, meta)
+ sse_feed.process_source(archive, root, i.name, package_id, meta)
+ n += 1
+
+ f.close()
+ return n
+
+def uncompress_zip(archive, root, package_id, meta = {}):
+ n = 0
+ f = zipfile.ZipFile(archive, "r")
+
+ print "Processing ZIP file %s." % archive
+
+ for i in f.infolist():
+
+ if not sse_feed.supported_source(i.filename):
+ continue
+
+ dst = os.path.join(root, i.filename)
+
+ try:
+ os.makedirs(os.path.dirname(dst))
+ except:
+ pass
+
+ o = file(dst, "w")
+ o.write(f.read(i.filename))
+ o.close()
+
+ (year, month, day, hour, minute, second) = i.date_time
+ t = time.mktime([year, month, day, hour, minute, second, 0, 0, 0])
+ os.utime(dst, (t, t))
- del f
+ sse_feed.process_source(archive, root, i.filename, package_id, meta)
+ n += 1
+
+ f.close()
+ return n
def calc_md(fn):
- m = md5.new()
- f = fopen(fn)
+ m = message_digest()
+ f = file(fn)
while True:
- data = m.read(1024)
+ data = f.read(1024)
if len(data) <= 0:
break
m.update(data)
- del f
+ f.close()
return m.hexdigest()
+
+def rm_rf(root):
+
+ for root, dirs, files in os.walk(root, topdown = False):
+ for f in files:
+ os.remove(os.path.join(root, f))
+ for d in dirs:
+ os.rmdir(os.path.join(root, d))
+
+ os.rmdir(root)
-def process_archive(archive, meta = {}):
+
+def process_archive(archive, meta = {}, recid = None, provider_id = SSE_PROVIDER_NONE):
+
+ if recid is None:
+ recid = archive
md = calc_md(archive)
root = os.path.join(HOME, "sources", md)
-
+
try:
- os.mkdir(root)
+ rm_rf(root)
except:
pass
+ os.makedirs(root)
meta["md"] = md
-
- archive_uncompress(archive, root, meta)
+
+ sse_db.start_transaction()
+
+ package_id = sse_db.find_package(md)
+
+ if package_id is None:
+ package_id = sse_db.new_package(archive, root, meta)
+
+ print "Package '%s' is new in database." % recid
+
+ if not recid is None:
+ sse_db.new_provider_record(recid, package_id, provider_id, meta)
+
+ try:
+ n = uncompress_tar(archive, root, package_id, meta)
+ except tarfile.TarError:
+ try:
+ n = uncompress_zip(archive, root, package_id, meta)
+ except zipfile.error:
+ n = None
+ print "Unknown file format."
+
+ if not n is None:
+ print "Successfully processed %i files." % n
+
+ else:
+
+ print "Package '%s' already in database." % recid
+
+ if not recid is None:
+ sse_db.new_provider_record(recid, package_id, provider_id, meta)
+
+ sse_db.commit()
if __name__ == "__main__":
-
- archive_uncompress(sys.argv[1])
+ process_archive(sys.argv[1])