summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authoryuzo@chromium.org <yuzo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-13 07:16:14 +0000
committeryuzo@chromium.org <yuzo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-13 07:16:14 +0000
commit697a650a1084ef9c77f9c5675f891d6157f36e99 (patch)
tree3a15110752daf89248cb3234ccc899843951f39a /webkit
parentf5bbdefb5cfe24a60df24d336822b5c06a266ef0 (diff)
downloadchromium_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-xwebkit/tools/layout_tests/canary-webkit-revisions.py85
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)