From a7e2c587c07804f946e00668084af47c8803e6b2 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sat, 1 Oct 2011 10:49:25 +0100 Subject: [PATCH] 0store copy: cope with someone else doing the copy first --- zeroinstall/zerostore/manifest.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/zeroinstall/zerostore/manifest.py b/zeroinstall/zerostore/manifest.py index d23afdf..77ecece 100644 --- a/zeroinstall/zerostore/manifest.py +++ b/zeroinstall/zerostore/manifest.py @@ -316,13 +316,18 @@ def copy_tree_with_verify(source, target, manifest_data, required_digest): "in 0store and should be reported.\n" "Expected: %(required_digest)s\n" "Actual: %(actual_digest)s") % {'required_digest': required_digest, 'actual_digest': actual_digest}) - os.rename(tmpdir, target_impl) - # TODO: catch already-exists, delete tmpdir and return success - except: - info(_("Deleting tmpdir '%s'") % tmpdir) - from zeroinstall.support import ro_rmtree - ro_rmtree(tmpdir) - raise + try: + os.rename(tmpdir, target_impl) + tmpdir = None + except OSError: + if not os.path.isdir(target_impl): + raise + # else someone else installed it already - return success + finally: + if tmpdir is not None: + info(_("Deleting tmpdir '%s'") % tmpdir) + from zeroinstall.support import ro_rmtree + ro_rmtree(tmpdir) def _parse_manifest(manifest_data): """Parse a manifest file. -- 2.11.4.GIT