diff options
author | yuzo@chromium.org <yuzo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-13 07:16:14 +0000 |
---|---|---|
committer | yuzo@chromium.org <yuzo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-13 07:16:14 +0000 |
commit | 697a650a1084ef9c77f9c5675f891d6157f36e99 (patch) | |
tree | 3a15110752daf89248cb3234ccc899843951f39a /webkit | |
parent | f5bbdefb5cfe24a60df24d336822b5c06a266ef0 (diff) | |
download | chromium_src-697a650a1084ef9c77f9c5675f891d6157f36e99.zip chromium_src-697a650a1084ef9c77f9c5675f891d6157f36e99.tar.gz chromium_src-697a650a1084ef9c77f9c5675f891d6157f36e99.tar.bz2 |
Check the canary builds up to the last-rolled WebKit revision.
The script now examines the DEPS file to know the WebKit revision.
This patch solves the last half of BUG 78538.
TEST=run canary-webkit-revisions.py and observe.
BUG=78538
Review URL: http://codereview.chromium.org/6993006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85246 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rwxr-xr-x | webkit/tools/layout_tests/canary-webkit-revisions.py | 85 |
1 files changed, 70 insertions, 15 deletions
diff --git a/webkit/tools/layout_tests/canary-webkit-revisions.py b/webkit/tools/layout_tests/canary-webkit-revisions.py index cd7dd39..577fce9 100755 --- a/webkit/tools/layout_tests/canary-webkit-revisions.py +++ b/webkit/tools/layout_tests/canary-webkit-revisions.py @@ -15,10 +15,12 @@ are retrieved and printed. import json import optparse +import re import sys import urllib2 - +_WEBKIT_REVISION_IN_DEPS_RE = re.compile(r'"webkit_revision"\s*:\s*"(\d+)"') +_DEPS_FILE_URL = "http://src.chromium.org/viewvc/chrome/trunk/src/DEPS" _DEFAULT_BUILDERS = [ "Webkit Win", "Webkit Vista", @@ -41,6 +43,39 @@ _TEST_SUFFIX = '">' _WEBKIT_TESTS = "webkit_tests" +def _OpenUrl(url): + """Opens a URL. + + Returns: + A file-like object in case of success, an empty list otherwise. + """ + try: + return urllib2.urlopen(url) + except urllib2.URLError, url_error: + message = "" + # Surprisingly, urllib2.URLError has different attributes based on the + # kinds of errors -- "code" for HTTP-level errors, "reason" for others. + if hasattr(url_error, "code"): + message = "Status code: %d" % url_error.code + if hasattr(url_error, "reason"): + message = url_error.reason + print >>sys.stderr, "Failed to open %s: %s" % (url, message) + return [] + + +def _WebkitRevisionInDeps(): + """Returns the WebKit revision specified in DEPS file. + + Returns: + Revision number as int. -1 in case of error. + """ + for line in _OpenUrl(_DEPS_FILE_URL): + match = _WEBKIT_REVISION_IN_DEPS_RE.search(line) + if match: + return int(match.group(1)) + return -1 + + class _BuildResult(object): """Build result for a builder. @@ -59,8 +94,11 @@ class _BuildResult(object): def _BuilderUrlFor(builder, max_builds): """Constructs the URL for a builder to retrieve the last results.""" - return ("http://build.chromium.org/p/chromium.webkit/json/builders/" + - urllib2.quote(builder) + "/builds?as_text=1&" + + url = ("http://build.chromium.org/p/chromium.webkit/json/builders/%s/builds" % + urllib2.quote(builder)) + if max_builds == -1: + return url + "/_all?as_text=1" + return (url + "?as_text=1&" + '&'.join(["select=%d" % -i for i in range(1, 1 + max_builds)])) @@ -75,7 +113,7 @@ def _ExtractFailingTests(build): return sorted(text[prefix + len(_TEST_PREFIX): suffix].split(",")) -def _RetrieveBuildResult(builder, max_builds): +def _RetrieveBuildResult(builder, max_builds, oldest_revision_to_check): """Retrieves build results for a builder. Checks the last passing revision, the last run revision, and failing tests @@ -84,6 +122,7 @@ def _RetrieveBuildResult(builder, max_builds): Args: builder: Builder name. max_builds: Maximum number of builds to check. + oldest_revision_to_check: Oldest WebKit revision to check. Returns: _BuildResult instance. @@ -91,7 +130,7 @@ def _RetrieveBuildResult(builder, max_builds): last_run_revision = 0 failing_tests = [] succeeded = False - builds_json = urllib2.urlopen(_BuilderUrlFor(builder, max_builds)) + builds_json = _OpenUrl(_BuilderUrlFor(builder, max_builds)) if not builds_json: return _BuildResult(builder, 0, 0, failing_tests) builds = [(int(value["number"]), value) for unused_key, value @@ -115,6 +154,8 @@ def _RetrieveBuildResult(builder, max_builds): revision = int(build["sourceStamp"]["changes"][-1]["revision"]) if revision and not last_run_revision: last_run_revision = revision + if revision and revision < oldest_revision_to_check: + break if not succeeded or not revision: continue return _BuildResult(builder, revision, last_run_revision, failing_tests) @@ -128,19 +169,21 @@ def _PrintPassingRevisions(results): results: A list of build results. """ print "**** Passing revisions *****" - minimum_revision = sys.maxint - maximum_revision = 0 + min_passing_revision = sys.maxint + max_passing_revision = 0 for result in results: if result.last_passing_revision: - minimum_revision = min(minimum_revision, result.last_passing_revision) - maximum_revision = max(maximum_revision, result.last_passing_revision) + min_passing_revision = min(min_passing_revision, + result.last_passing_revision) + max_passing_revision = max(max_passing_revision, + result.last_passing_revision) print 'The last passing run was at r%d on "%s"' % ( result.last_passing_revision, result.builder) else: print 'No passing runs on "%s"' % result.builder - if maximum_revision: + if max_passing_revision: print "Passing revision range: r%d - r%d" % ( - minimum_revision, maximum_revision) + min_passing_revision, max_passing_revision) def _PrintFailingRevisions(results): @@ -163,8 +206,13 @@ def _ParseOptions(): """Parses command-line options.""" parser = optparse.OptionParser(usage="%prog [options] [builders]") parser.add_option("-m", "--max_builds", type="int", - default=_DEFAULT_MAX_BUILDS, - help="maximum number of builds to check for each builder") + default=-1, + help="Maximum number of builds to check for each builder." + " Defaults to all builds for which record is" + " available. Checking is ended either when the maximum" + " number is reached, the remaining builds are older" + " than the DEPS WebKit revision, or a passing" + " revision is found.") return parser.parse_args() @@ -173,13 +221,20 @@ def _Main(): options, builders = _ParseOptions() if not builders: builders = _DEFAULT_BUILDERS - print "Checking the last %d builds for:" % options.max_builds + oldest_revision_to_check = _WebkitRevisionInDeps() + if options.max_builds == -1 and oldest_revision_to_check == -1: + options.max_builds = _DEFAULT_MAX_BUILDS + if options.max_builds != -1: + print "Maxium number of builds to check: %d" % options.max_builds + if oldest_revision_to_check != -1: + print "Oldest revision to check: %d" % oldest_revision_to_check sys.stdout.flush() results = [] for builder in builders: print '"%s"' % builder sys.stdout.flush() - results.append(_RetrieveBuildResult(builder, options.max_builds)) + results.append(_RetrieveBuildResult( + builder, options.max_builds, oldest_revision_to_check)) _PrintFailingRevisions(results) _PrintPassingRevisions(results) |