Index: gclient_utils.py |
diff --git a/gclient_utils.py b/gclient_utils.py |
index 8385deb054a8b6823f13b5cfeef4816f45999304..e3c504a9da614fd3dfaee4f7483d5645311188af 100644 |
--- a/gclient_utils.py |
+++ b/gclient_utils.py |
@@ -96,6 +96,29 @@ def FileWrite(filename, content, mode='w'): |
f.write(content) |
+def safe_rename(old, new): |
+ """Renames a file reliably. |
+ |
+ Sometimes os.rename does not work because a dying git process keeps a handle |
+ on it for a few seconds. An exception is then thrown, which make the program |
+ give up what it was doing and remove what was deleted. |
+ The only solution is to catch the exception and try again until it works. |
+ """ |
+ # roughly 10s |
+ retries = 100 |
+ for i in range(retries): |
+ try: |
+ os.rename(old, new) |
+ break |
+ except OSError: |
+ if i == (retries - 1): |
+ # Give up. |
+ raise |
+ # retry |
+ logging.debug("Renaming failed from %s to %s. Retrying ..." % (old, new)) |
+ time.sleep(0.1) |
+ |
+ |
def rmtree(path): |
"""shutil.rmtree() on steroids. |