Index: tools/clang/scripts/update.py |
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py |
index 25aa5a50ee1cc646a2985927974e126b151fa706..041087f68731db3350a77e9b513718ee3f7de281 100755 |
--- a/tools/clang/scripts/update.py |
+++ b/tools/clang/scripts/update.py |
@@ -10,7 +10,9 @@ import os |
import re |
import shutil |
import subprocess |
+import stat |
import sys |
+import time |
# Do NOT CHANGE this if you don't know what you're doing -- see |
# https://code.google.com/p/chromium/wiki/UpdatingClang |
@@ -58,16 +60,16 @@ def WriteStampFile(s): |
f.write(s) |
-def DeleteFiles(dir, pattern): |
- """Delete all files in dir matching pattern.""" |
- n = 0 |
- regex = re.compile(r'^' + pattern + r'$') |
- for root, _, files in os.walk(dir): |
- for f in files: |
- if regex.match(f): |
- os.remove(os.path.join(root, f)) |
- n += 1 |
- return n |
+def RmTree(dir): |
+ """Delete dir.""" |
+ def ChmodAndRetry(func, path, _): |
+ # Subversion can leave read-only files around. |
+ if not os.access(path, os.W_OK): |
+ os.chmod(path, stat.S_IWUSR) |
+ return func(path) |
+ raise |
+ |
+ shutil.rmtree(dir, onerror=ChmodAndRetry) |
def ClobberChromiumBuildFiles(): |
@@ -75,18 +77,21 @@ def ClobberChromiumBuildFiles(): |
print 'Clobbering Chromium build files...' |
out_dir = os.path.join(CHROMIUM_DIR, 'out') |
if os.path.isdir(out_dir): |
- shutil.rmtree(out_dir) |
+ RmTree(out_dir) |
print 'Removed Chromium out dir: %s.' % (out_dir) |
-def RunCommand(command, tries=1): |
- """Run a command, possibly with multiple retries.""" |
- for i in range(0, tries): |
- print 'Running %s (try #%d)' % (str(command), i + 1) |
- if subprocess.call(command, shell=True) == 0: |
- return |
- print 'Failed.' |
- sys.exit(1) |
+def RunCommand(command, fail_hard=True): |
+ """Run command and return success (True) or failure; or if fail_hard is |
+ True, exit on failure.""" |
+ |
+ print 'Running %s' % (str(command)) |
+ if subprocess.call(command, shell=True) == 0: |
+ return True |
+ print 'Failed.' |
+ if fail_hard: |
+ sys.exit(1) |
+ return False |
def CopyFile(src, dst): |
@@ -110,8 +115,17 @@ def CopyDirectoryContents(src, dst, filename_filter=None): |
def Checkout(name, url, dir): |
"""Checkout the SVN module at url into dir. Use name for the log message.""" |
print "Checking out %s r%s into '%s'" % (name, LLVM_WIN_REVISION, dir) |
- RunCommand(['svn', 'checkout', '--force', |
- url + '@' + LLVM_WIN_REVISION, dir], tries=2) |
+ |
+ command = ['svn', 'checkout', '--force', url + '@' + LLVM_WIN_REVISION, dir] |
+ if RunCommand(command, fail_hard=False): |
+ return |
+ |
+ if os.path.isdir(dir): |
+ print "Removing %s." % (dir) |
+ RmTree(dir) |
+ |
+ print "Retrying." |
+ RunCommand(command) |
def AddCMakeToPath(): |