summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-11-23 21:11:27 +0000
committerLennart Poettering <lennart@poettering.net>2005-11-23 21:11:27 +0000
commita0a94f90295df37da659b06d6ecf5d2b01046d72 (patch)
treea14dab5860e3fcf446dcf9591a54abb4bc0e0d94
parent8bd358b061e86c72e49955be8bf5c4a2e15f082b (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-xfeed/sse_tar.py59
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])