Index: chrome-update.py |
=================================================================== |
--- chrome-update.py (revision 32063) |
+++ chrome-update.py (working copy) |
@@ -3,171 +3,85 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
-# Author: mpcomplete |
-# |
-# This script updates and does a clean build of chrome for you. |
-# Usage: python chrome-update.py C:\path\to\chrome\trunk |
-# |
-# It assumes the following: |
-# - You have gclient.bat and devenv.com in your path (use the wrapper batch |
-# file to ensure this). |
- |
-import sys |
import os |
-import subprocess |
-import httplib |
import re |
-import shutil |
-import optparse |
+import subprocess |
+import sys |
+import urllib |
-def Message(str): |
- """Prints a status message.""" |
- print "[chrome-update]", str |
+IS_WIN = sys.platform.startswith('win') |
+BASE_URL = 'http://src.chromium.org/svn/trunk/tools/buildbot/scripts/' |
+COMPILE_URL = BASE_URL + 'slave/compile.py' |
+UTILS_URL = BASE_URL + 'common/chromium_utils.py' |
-def FixupPath(path): |
- """Returns the OS-ified version of a windows path.""" |
- return os.path.sep.join(path.split("\\")) |
-def GetRevision(): |
+def Fetch(url, file): |
+ if not os.path.exists(file): |
+ urllib.urlretrieve(url, file) |
+ |
+ |
+def GetLastestRevision(): |
"""Returns the revision number of the last build that was archived, or |
None on failure.""" |
- HOST = "build.chromium.org" |
- PATH = "/buildbot/continuous/LATEST/REVISION" |
- EXPR = r"(\d+)" |
- |
- connection = httplib.HTTPConnection(HOST) |
- connection.request("GET", PATH) |
- response = connection.getresponse() |
- text = response.read() |
- match = re.search(EXPR, text) |
- if match: |
- return int(match.group(1)) |
+ url = 'http://build.chromium.org/buildbot/continuous/' |
+ if sys.platform.startswith('win'): |
+ url += 'win/' |
+ elif sys.platform.startswith('linux'): |
+ url += 'linux/' |
+ elif sys.platform.startswith('darwin'): |
+ url += 'mac/' |
+ else: |
+ # This path is actually win. |
+ pass |
+ url += 'LATEST/REVISION' |
+ text = urllib.urlopen(url).read() |
+ if text: |
+ match = re.search(r"(\d+)", text) |
+ if match: |
+ return int(match.group(1)) |
return None |
-def SetRevisionForUpdate(chrome_root): |
- """Prepares environment so gclient syncs to a good revision, if possible.""" |
- # Find a buildable revision. |
- rev = GetRevision() |
- if rev == None: |
- Message("WARNING: Failed to find a buildable revision. Syncing to trunk.") |
- return "trunk" |
- # Read the .gclient file. |
- gclient_file = chrome_root + FixupPath("\\.gclient") |
- if not os.path.exists(gclient_file): |
- Message("WARNING: Failed to find .gclient file. Syncing to trunk.") |
- return "trunk" |
- scope = {} |
- execfile(gclient_file, scope) |
- solutions = scope["solutions"] |
- |
- # Edit the url of the chrome 'src' solution, unless the user wants a |
- # specific revision. |
- for solution in solutions: |
- if solution["name"] == "src": |
- splitter = solution["url"].split("@") |
- if len(splitter) == 1: |
- solution["url"] = splitter[0] + "@" + str(rev) |
- else: |
- rev = int(splitter[1]) |
- break |
- |
- # Write out the new .gclient file. |
- gclient_override = gclient_file + "-update-chrome" |
- f = open(gclient_override, "w") |
- f.write("solutions = " + str(solutions)) |
- f.close() |
- |
- # Set the env var that the gclient tool looks for. |
- os.environ["GCLIENT_FILE"] = gclient_override |
- return rev |
- |
def DoUpdate(chrome_root): |
"""gclient sync to the latest build.""" |
- # gclient sync |
- rev = SetRevisionForUpdate(chrome_root) |
+ cmd = ["gclient", "sync"] |
+ rev = GetLastestRevision() |
+ if rev: |
+ cmd.extend(['--revision', 'src@%d' % rev]) |
+ return subprocess.call(cmd, cwd=chrome_root, shell=IS_WIN) |
- cmd = ["gclient.bat", "sync"] |
- Message("Updating to %s: %s" % (rev, cmd)) |
- sys.stdout.flush() |
- return subprocess.call(cmd, cwd=chrome_root) |
-def DoClean(chrome_root, type): |
- """Clean our build dir.""" |
- # rm -rf src/chrome/Debug |
- rv = [0] |
- def onError(func, path, excinfo): |
- Message("Couldn't remove '%s': %s" % (path, excinfo)) |
- rv[0] = [1] |
+def DoBuild(chrome_root, args): |
+ """Download compile.py and run it.""" |
+ compile = os.path.join(chrome_root, 'compile.py') |
+ Fetch(COMPILE_URL, compile) |
+ Fetch(UTILS_URL, os.path.join(chrome_root, 'chromium_utils.py')) |
+ cmd = ['python', compile] + args |
+ return subprocess.call(cmd, cwd=chrome_root, shell=IS_WIN) |
- build_path = chrome_root + FixupPath("\\src\\chrome\\" + type) |
- Message("Cleaning: %s" % build_path) |
- shutil.rmtree(build_path, False, onError) |
- return rv[0] |
-def DoBuild(chrome_root, chrome_sln, clean, type): |
- """devenv /build what we just checked out.""" |
- if clean: |
- rv = DoClean(chrome_root, type) |
- if rv != 0: |
- Message("WARNING: Clean failed. Doing a build without clean.") |
+def Main(args): |
+ if len(args) < 3: |
+ print('Usage: chrome-update.py <path> [options]') |
+ print('See options from compile.py at') |
+ print(' %s' % COMPILE_URL) |
+ print('\nFor more example, see the compile steps on the waterfall') |
+ return 1 |
- # devenv chrome.sln /build Debug |
- cmd = ["devenv.com", chrome_sln, "/build", type] |
- |
- Message("Building: %s" % cmd) |
- sys.stdout.flush() |
- return subprocess.call(cmd, cwd=chrome_root) |
- |
-def Main(): |
- parser = optparse.OptionParser() |
- parser.add_option("", "--clean", action="store_true", default=False, |
- help="wipe Debug output directory before building") |
- parser.add_option("", "--solution", default="src\\chrome\\chrome.sln", |
- help="path to the .sln file to build (absolute, or " |
- "relative to chrome trunk") |
- parser.add_option("", "--release", action="store_true", default=False, |
- help="build the release configuration in addition of the " |
- "debug configuration.") |
- parser.add_option("", "--nosync", action="store_true", default=False, |
- help="doesn't sync before building") |
- parser.add_option("", "--print-latest", action="store_true", default=False, |
- help="print the latest buildable revision and exit") |
- options, args = parser.parse_args() |
- |
- if options.print_latest: |
- print GetRevision() or "HEAD" |
- sys.exit(0) |
- |
- if not args: |
- Message("Usage: %s <path\\to\\chrome\\root> [options]" % sys.argv[0]) |
- sys.exit(1) |
- |
- chrome_root = args[0] |
+ chrome_root = args[1] |
if not os.path.isdir(chrome_root): |
- Message("Path to chrome root (%s) not found." % repr(chrome_root)) |
- sys.exit(1) |
+ print('Path to chrome root (%s) not found.' % chrome_root) |
+ return 1 |
- if not options.nosync: |
- rv = DoUpdate(chrome_root) |
- if rv != 0: |
- Message("Update Failed. Bailing.") |
- sys.exit(rv) |
- |
- chrome_sln = FixupPath(options.solution) |
- rv = DoBuild(chrome_root, chrome_sln, options.clean, "Debug") |
+ rv = DoUpdate(chrome_root) |
if rv != 0: |
- Message("Debug build failed. Sad face :(") |
+ print('Update Failed. Bailing.') |
+ return rv |
- if options.release: |
- rv = DoBuild(chrome_root, chrome_sln, options.clean, "Release") |
- if rv != 0: |
- Message("Release build failed. Sad face :(") |
+ DoBuild(chrome_root, args[2:]) |
+ print('Success!') |
+ return 0 |
- if rv != 0: |
- sys.exit(rv) |
- Message("Success!") |
- |
if __name__ == "__main__": |
- Main() |
+ sys.exit(Main(sys.argv)) |