diff options
author | Lennart Poettering <lennart@poettering.net> | 2005-11-23 21:11:27 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2005-11-23 21:11:27 +0000 |
commit | a0a94f90295df37da659b06d6ecf5d2b01046d72 (patch) | |
tree | a14dab5860e3fcf446dcf9591a54abb4bc0e0d94 | |
parent | 8bd358b061e86c72e49955be8bf5c4a2e15f082b (diff) |
try to handle broken archvies properly
git-svn-id: file:///home/lennart/svn/public/sse/trunk@46 5fbabb74-0606-0410-a5e4-b5cc6a42724e
-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]) |