diff options
Diffstat (limited to 'feed/sse_tar.py')
-rwxr-xr-x | feed/sse_tar.py | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/feed/sse_tar.py b/feed/sse_tar.py index d408fd7..b2e5e0d 100755 --- a/feed/sse_tar.py +++ b/feed/sse_tar.py @@ -93,6 +93,25 @@ def uncompress_zip(archive, root, package_id, meta = {}): f.close() return n +def uncompress_archive(archive, root, package_id, meta = {}): + + n = -1 + + try: + n = uncompress_tar(archive, root, package_id, meta) + except tarfile.TarError: + try: + n = uncompress_zip(archive, root, package_id, meta) + except zipfile.error: + print "Unknown file format." + except IOError, e: + if e[0] == "CRC check failed": + print "Broken archive." + else: + raise e + + return n + def calc_md(fn): m = message_digest() f = file(fn) @@ -120,6 +139,15 @@ def rm_rf(root): os.rmdir(root) +def clear_dir(root): + + try: + rm_rf(root) + except: + pass + + os.makedirs(root) + def process_archive(archive, meta = {}, recid = None, provider_id = SSE_PROVIDER_NONE): if recid is None: @@ -130,6 +158,7 @@ def process_archive(archive, meta = {}, recid = None, provider_id = SSE_PROVIDER meta["md"] = md sse_db.start_transaction() + done = False try: package_id = sse_db.find_package(md) @@ -140,7 +169,10 @@ def process_archive(archive, meta = {}, recid = None, provider_id = SSE_PROVIDER # Update provider record sse_db.new_provider_record(recid, package_id, provider_id, meta) - + + sse_db.commit() + done = True + else: root = os.path.join(HOME, "sources", md) @@ -149,29 +181,18 @@ def process_archive(archive, meta = {}, recid = None, provider_id = SSE_PROVIDER print "Package '%s' is new in database." % recid sse_db.new_provider_record(recid, package_id, provider_id, meta) - try: - rm_rf(root) - except: - pass - os.makedirs(root) - - 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 = -1 - print "Unknown file format." + clear_dir(root) + n = uncompress_archive(archive, root, package_id, meta) if n >= 0: print "Successfully processed %i files." % n + sse_db.commit() + done = True - sse_db.commit() + finally: - except Exception, e: - sse_db.rollback() - raise e + if not done: + sse_db.rollback() if __name__ == "__main__": process_archive(sys.argv[1]) |