diff options
Diffstat (limited to 'feed/sse_tar.py')
-rwxr-xr-x | feed/sse_tar.py | 136 |
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]) |