From ad1abcb556bfff2744928a8f29d216aee43fdbe3 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Tue, 1 Nov 2016 11:34:55 -0700 Subject: [PATCH] Port os.rename calls to work on Windows os.rename fails on Windows if the destination exists, so replace os.rename to platform_utils.rename which handles the platform differences. Change-Id: I15a86f10f65eedee5b003b80f88a0c28a3e1aa48 --- platform_utils.py | 17 +++++++++++++++++ project.py | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/platform_utils.py b/platform_utils.py index 4417c5a3..e0fa9dcc 100644 --- a/platform_utils.py +++ b/platform_utils.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import errno import os import platform import select @@ -225,3 +226,19 @@ def handle_rmtree_error(function, path, excinfo): # Allow deleting read-only files os.chmod(path, stat.S_IWRITE) function(path) + + +def rename(src, dst): + if isWindows(): + # On Windows, rename fails if destination exists, see + # https://docs.python.org/2/library/os.html#os.rename + try: + os.rename(src, dst) + except OSError as e: + if e.errno == errno.EEXIST: + os.remove(dst) + os.rename(src, dst) + else: + raise + else: + os.rename(src, dst) diff --git a/project.py b/project.py index ba18337b..e8de4842 100644 --- a/project.py +++ b/project.py @@ -63,7 +63,7 @@ def _lwrite(path, content): fd.close() try: - os.rename(lock, path) + platform_utils.rename(lock, path) except OSError: os.remove(lock) raise @@ -2198,7 +2198,7 @@ class Project(object): if os.path.exists(tmpPath): if curlret == 0 and self._IsValidBundle(tmpPath, quiet): - os.rename(tmpPath, dstPath) + platform_utils.rename(tmpPath, dstPath) return True else: os.remove(tmpPath)