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
diff --git a/platform_utils.py b/platform_utils.py
index 4417c5a..e0fa9dc 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 @@
# 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 ba18337..e8de484 100644
--- a/project.py
+++ b/project.py
@@ -63,7 +63,7 @@
fd.close()
try:
- os.rename(lock, path)
+ platform_utils.rename(lock, path)
except OSError:
os.remove(lock)
raise
@@ -2198,7 +2198,7 @@
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)