| Index: depot_tools/chrome-update.py
|
| ===================================================================
|
| --- depot_tools/chrome-update.py (revision 0)
|
| +++ depot_tools/chrome-update.py (revision 0)
|
| @@ -0,0 +1,170 @@
|
| +#!/usr/bin/python
|
| +# Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +# 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
|
| +
|
| +def Message(str):
|
| + """Prints a status message."""
|
| + print "[chrome-update]", str
|
| +
|
| +def FixupPath(path):
|
| + """Returns the OS-ified version of a windows path."""
|
| + return os.path.sep.join(path.split("\\"))
|
| +
|
| +def GetRevision():
|
| + """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))
|
| + 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.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]
|
| +
|
| + 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.")
|
| +
|
| + # 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]
|
| +
|
| + 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")
|
| + if rv != 0:
|
| + Message("Debug build failed. Sad face :(")
|
| +
|
| + if options.release:
|
| + rv = DoBuild(chrome_root, chrome_sln, options.clean, "Release")
|
| + if rv != 0:
|
| + Message("Release build failed. Sad face :(")
|
| +
|
| + if rv != 0:
|
| + sys.exit(rv)
|
| +
|
| + Message("Success!")
|
| +
|
| +if __name__ == "__main__":
|
| + Main()
|
|
|
| Property changes on: depot_tools\chrome-update.py
|
| ___________________________________________________________________
|
| Added: svn:executable
|
| + *
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|