diff options
Diffstat (limited to 'Tools/Scripts/webkitpy/common')
15 files changed, 204 insertions, 60 deletions
diff --git a/Tools/Scripts/webkitpy/common/checkout/api.py b/Tools/Scripts/webkitpy/common/checkout/api.py index 170b822..5c21028 100644 --- a/Tools/Scripts/webkitpy/common/checkout/api.py +++ b/Tools/Scripts/webkitpy/common/checkout/api.py @@ -35,7 +35,7 @@ from webkitpy.common.checkout.commitinfo import CommitInfo from webkitpy.common.checkout.scm import CommitMessage from webkitpy.common.checkout.deps import DEPS from webkitpy.common.memoized import memoized -from webkitpy.common.net.bugzilla import parse_bug_id +from webkitpy.common.net.bugzilla import parse_bug_id_from_changelog from webkitpy.common.system.executive import Executive, run_command, ScriptError from webkitpy.common.system.deprecated_logging import log @@ -85,7 +85,7 @@ class Checkout(object): return None changelog_entry = changelog_entries[0] changelog_data = { - "bug_id": parse_bug_id(changelog_entry.contents()), + "bug_id": parse_bug_id_from_changelog(changelog_entry.contents()), "author_name": changelog_entry.author_name(), "author_email": changelog_entry.author_email(), "author": changelog_entry.author(), @@ -145,7 +145,7 @@ class Checkout(object): def bug_id_for_this_commit(self, git_commit, changed_files=None): try: - return parse_bug_id(self.commit_message_for_this_commit(git_commit, changed_files).message()) + return parse_bug_id_from_changelog(self.commit_message_for_this_commit(git_commit, changed_files).message()) except ScriptError, e: pass # We might not have ChangeLogs. diff --git a/Tools/Scripts/webkitpy/common/checkout/changelog.py b/Tools/Scripts/webkitpy/common/checkout/changelog.py index ccdf9ca..a86b7a9 100644 --- a/Tools/Scripts/webkitpy/common/checkout/changelog.py +++ b/Tools/Scripts/webkitpy/common/checkout/changelog.py @@ -36,7 +36,7 @@ import textwrap from webkitpy.common.system.deprecated_logging import log from webkitpy.common.config.committers import CommitterList -from webkitpy.common.net.bugzilla import parse_bug_id +from webkitpy.common.net.bugzilla import parse_bug_id_from_changelog class ChangeLogEntry(object): @@ -87,7 +87,7 @@ class ChangeLogEntry(object): return self._contents def bug_id(self): - return parse_bug_id(self._contents) + return parse_bug_id_from_changelog(self._contents) # FIXME: Various methods on ChangeLog should move into ChangeLogEntry instead. diff --git a/Tools/Scripts/webkitpy/common/checkout/scm.py b/Tools/Scripts/webkitpy/common/checkout/scm.py index 70f65b5..e436402 100644 --- a/Tools/Scripts/webkitpy/common/checkout/scm.py +++ b/Tools/Scripts/webkitpy/common/checkout/scm.py @@ -29,6 +29,7 @@ # # Python module for interacting with an SCM system (like SVN or Git) +import logging import os import re import sys @@ -290,7 +291,7 @@ class SCM: def revert_files(self, file_paths): self._subclass_must_implement() - def commit_with_message(self, message, username=None, git_commit=None, force_squash=False): + def commit_with_message(self, message, username=None, git_commit=None, force_squash=False, changed_files=None): self._subclass_must_implement() def svn_commit_log(self, svn_revision): @@ -555,12 +556,8 @@ class SVN(SCM): # FIXME: This should probably use cwd=self.checkout_root. self.run(['svn', 'revert'] + file_paths) - def commit_with_message(self, message, username=None, git_commit=None, force_squash=False): + def commit_with_message(self, message, username=None, git_commit=None, force_squash=False, changed_files=None): # git-commit and force are not used by SVN. - if self.dryrun: - # Return a string which looks like a commit so that things which parse this output will succeed. - return "Dry run, no commit.\nCommitted revision 0." - svn_commit_args = ["svn", "commit"] if not username and not self.has_authorization_for_realm(): @@ -569,6 +566,17 @@ class SVN(SCM): svn_commit_args.extend(["--username", username]) svn_commit_args.extend(["-m", message]) + + if changed_files: + svn_commit_args.extend(changed_files) + + if self.dryrun: + _log = logging.getLogger("webkitpy.common.system") + _log.debug('Would run SVN command: "' + " ".join(svn_commit_args) + '"') + + # Return a string which looks like a commit so that things which parse this output will succeed. + return "Dry run, no commit.\nCommitted revision 0." + # FIXME: Should this use cwd=self.checkout_root? return self.run(svn_commit_args, error_handler=commit_error_handler) @@ -826,7 +834,7 @@ class Git(SCM): if num_local_commits > 1 or (num_local_commits > 0 and not working_directory_is_clean): raise AmbiguousCommitError(num_local_commits, working_directory_is_clean) - def commit_with_message(self, message, username=None, git_commit=None, force_squash=False): + def commit_with_message(self, message, username=None, git_commit=None, force_squash=False, changed_files=None): # Username is ignored during Git commits. working_directory_is_clean = self.working_directory_is_clean() diff --git a/Tools/Scripts/webkitpy/common/config/build.py b/Tools/Scripts/webkitpy/common/config/build.py index 355fa96..42d0721 100644 --- a/Tools/Scripts/webkitpy/common/config/build.py +++ b/Tools/Scripts/webkitpy/common/config/build.py @@ -33,17 +33,18 @@ def _should_file_trigger_build(target_platform, file): # precendence over later ones. # FIXME: The patterns below have only been verified to be correct on - # Windows. We should implement this for other platforms and start using - # it for their bots. Someone familiar with each platform will have to - # figure out what the right set of directories/patterns is for that - # platform. - assert(target_platform == "win") + # the platforms listed below. We should implement this for other platforms + # and start using it for their bots. Someone familiar with each platform + # will have to figure out what the right set of directories/patterns is for + # that platform. + assert(target_platform in ("mac-leopard", "mac-snowleopard", "win")) directories = [ # Directories that shouldn't trigger builds on any bots. + ("Examples", []), ("PerformanceTests", []), ("Source/WebCore/manual-tests", []), - ("Examples", []), + ("Tools/BuildSlaveSupport/build.webkit.org-config/public_html", []), ("Websites", []), ("android", []), ("brew", []), @@ -53,14 +54,13 @@ def _should_file_trigger_build(target_platform, file): ("opengl", []), ("opentype", []), ("openvg", []), - ("wx", []), ("wince", []), + ("wx", []), # Directories that should trigger builds on only some bots. ("Source/JavaScriptGlue", ["mac"]), - ("LayoutTests/platform/mac", ["mac", "win"]), - ("LayoutTests/platform/mac-snowleopard", ["mac-snowleopard", "win"]), ("Source/WebCore/image-decoders", ["chromium"]), + ("LayoutTests/platform/mac", ["mac", "win"]), ("cairo", ["gtk", "wincairo"]), ("cf", ["chromium-mac", "mac", "qt", "win"]), ("chromium", ["chromium"]), @@ -72,7 +72,7 @@ def _should_file_trigger_build(target_platform, file): ("gtk", ["gtk"]), ("mac", ["chromium-mac", "mac"]), ("mac-leopard", ["mac-leopard"]), - ("mac-snowleopard", ["mac-snowleopard"]), + ("mac-snowleopard", ["mac", "win"]), ("mac-wk2", ["mac-snowleopard", "win"]), ("objc", ["mac"]), ("qt", ["qt"]), diff --git a/Tools/Scripts/webkitpy/common/config/build_unittest.py b/Tools/Scripts/webkitpy/common/config/build_unittest.py index 1e075be..9144874 100644 --- a/Tools/Scripts/webkitpy/common/config/build_unittest.py +++ b/Tools/Scripts/webkitpy/common/config/build_unittest.py @@ -39,13 +39,13 @@ class ShouldBuildTest(unittest.TestCase): (["LayoutTests/platform/chromium-linux/foo"], ["chromium-linux"]), (["LayoutTests/platform/chromium-win/fast/compact/001-expected.txt"], ["chromium-win"]), (["LayoutTests/platform/mac-leopard/foo"], ["mac-leopard"]), - (["LayoutTests/platform/mac-snowleopard/foo"], ["mac-snowleopard", "win"]), + (["LayoutTests/platform/mac-snowleopard/foo"], ["mac-leopard", "mac-snowleopard", "win"]), (["LayoutTests/platform/mac-wk2/Skipped"], ["mac-snowleopard", "win"]), (["LayoutTests/platform/mac/foo"], ["mac-leopard", "mac-snowleopard", "win"]), (["LayoutTests/platform/win-xp/foo"], ["win"]), (["LayoutTests/platform/win-wk2/foo"], ["win"]), (["LayoutTests/platform/win/foo"], ["win"]), - (["Source/WebCore.exp.in", "Source/WebKit/mac/WebKit.exp"], ["mac"]), + (["Source/WebCore.exp.in", "Source/WebKit/mac/WebKit.exp"], ["mac-leopard", "mac-snowleopard"]), (["Source/WebCore/mac/foo"], ["chromium-mac", "mac-leopard", "mac-snowleopard"]), (["Source/WebCore/win/foo"], ["chromium-win", "win"]), (["Source/WebCore/platform/graphics/gpu/foo"], ["mac-leopard", "mac-snowleopard"]), @@ -53,13 +53,14 @@ class ShouldBuildTest(unittest.TestCase): (["Source/WebCore/rendering/RenderThemeMac.mm", "Source/WebCore/rendering/RenderThemeMac.h"], ["mac-leopard", "mac-snowleopard"]), (["Source/WebCore/rendering/RenderThemeChromiumLinux.h"], ["chromium-linux"]), (["Source/WebCore/rendering/RenderThemeWinCE.h"], []), + (["Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.js"], []), ] def test_should_build(self): for files, platforms in self._should_build_tests: # FIXME: We should test more platforms here once # build._should_file_trigger_build is implemented for them. - for platform in ["win"]: + for platform in ["mac-leopard", "mac-snowleopard", "win"]: should_build = platform in platforms or "*" in platforms self.assertEqual(build.should_build(platform, files), should_build, "%s should%s have built but did%s (files: %s)" % (platform, "" if should_build else "n't", "n't" if should_build else "", str(files))) diff --git a/Tools/Scripts/webkitpy/common/config/committers.py b/Tools/Scripts/webkitpy/common/config/committers.py index 76f4741..fd9bdbb 100644 --- a/Tools/Scripts/webkitpy/common/config/committers.py +++ b/Tools/Scripts/webkitpy/common/config/committers.py @@ -71,6 +71,7 @@ committers_unable_to_review = [ Committer("Alejandro G. Castro", ["alex@igalia.com", "alex@webkit.org"]), Committer("Alexander Kellett", ["lypanov@mac.com", "a-lists001@lypanov.net", "lypanov@kde.org"], "lypanov"), Committer("Alexander Pavlov", "apavlov@chromium.org", "apavlov"), + Committer("Alexis Menard", ["alexis.menard@openbossa.org", "menard@kde.org"], "darktears"), Committer("Andre Boule", "aboule@apple.com"), Committer("Andrei Popescu", "andreip@google.com", "andreip"), Committer("Andrew Wellington", ["andrew@webkit.org", "proton@wiretapped.net"], "proton"), @@ -87,7 +88,6 @@ committers_unable_to_review = [ Committer("Benjamin Otte", ["otte@gnome.org", "otte@webkit.org"], "otte"), Committer("Brent Fulgham", "bfulgham@webkit.org", "bfulgham"), Committer("Brett Wilson", "brettw@chromium.org", "brettx"), - Committer("Brian Weinstein", "bweinstein@apple.com", "bweinstein"), Committer("Cameron McCormack", "cam@webkit.org", "heycam"), Committer("Carlos Garcia Campos", ["cgarcia@igalia.com", "carlosgc@gnome.org", "carlosgc@webkit.org"], "KaL"), Committer("Carol Szabo", "carol.szabo@nokia.com"), @@ -119,7 +119,7 @@ committers_unable_to_review = [ Committer("Girish Ramakrishnan", ["girish@forwardbias.in", "ramakrishnan.girish@gmail.com"]), Committer("Graham Dennis", ["Graham.Dennis@gmail.com", "gdennis@webkit.org"]), Committer("Greg Bolsinga", "bolsinga@apple.com"), - Committer("Gyuyoung Kim", ["gyuyoung.kim@samsung.com", "gyuyoung@gmail.com", "gyuyoung@webkit.org"], "gyuyoung"), + Committer("Gyuyoung Kim", ["gyuyoung.kim@samsung.com", "gyuyoung.kim@webkit.org"], "gyuyoung"), Committer("Hans Wennborg", "hans@chromium.org", "hwennborg"), Committer("Hayato Ito", "hayato@chromium.org", "hayato"), Committer("Helder Correia", "helder@sencha.com", "helder"), @@ -142,7 +142,7 @@ committers_unable_to_review = [ Committer("Jochen Eisinger", "jochen@chromium.org", "jochen__"), Committer("John Abd-El-Malek", "jam@chromium.org", "jam"), Committer("John Gregg", ["johnnyg@google.com", "johnnyg@chromium.org"], "johnnyg"), - Committer("John Knottenbelt", ["jknotten@chromium.org"], "jknotten"), + Committer("John Knottenbelt", "jknotten@chromium.org", "jknotten"), Committer("Johnny Ding", ["jnd@chromium.org", "johnnyding.webkit@gmail.com"], "johnnyding"), Committer("Joone Hur", ["joone.hur@collabora.co.uk", "joone@kldp.org", "joone@webkit.org"], "joone"), Committer("Joost de Valk", ["joost@webkit.org", "webkit-dev@joostdevalk.nl"], "Altha"), @@ -152,6 +152,7 @@ committers_unable_to_review = [ Committer("Justin Schuh", "jschuh@chromium.org", "jschuh"), Committer("Keishi Hattori", "keishi@webkit.org", "keishi"), Committer("Kelly Norton", "knorton@google.com"), + Committer("Kenji Imasaki", "imasaki@chromium.org", "imasaki"), Committer("Kent Hansen", "kent.hansen@nokia.com", "khansen"), Committer("Kimmo Kinnunen", ["kimmo.t.kinnunen@nokia.com", "kimmok@iki.fi", "ktkinnun@webkit.org"], "kimmok"), Committer("Kinuko Yasuda", "kinuko@chromium.org", "kinuko"), @@ -160,6 +161,7 @@ committers_unable_to_review = [ Committer("Leandro Pereira", ["leandro@profusion.mobi", "leandro@webkit.org"], "acidx"), Committer("Levi Weintraub", ["leviw@chromium.org", "leviw@google.com", "lweintraub@apple.com"], "leviw"), Committer("Lucas De Marchi", ["lucas.demarchi@profusion.mobi", "demarchi@webkit.org"], "demarchi"), + Committer("Lucas Forschler", ["lforschler@apple.com"], "lforschler"), Committer("Luiz Agostini", ["luiz@webkit.org", "luiz.agostini@openbossa.org"], "lca"), Committer("Mads Ager", "ager@chromium.org"), Committer("Marcus Voltis Bulach", "bulach@chromium.org"), @@ -238,6 +240,7 @@ reviewers_list = [ Reviewer("Benjamin Poulain", ["benjamin@webkit.org", "benjamin.poulain@nokia.com", "ikipou@gmail.com"], "benjaminp"), Reviewer("Beth Dakin", "bdakin@apple.com", "dethbakin"), Reviewer("Brady Eidson", "beidson@apple.com", "bradee-oh"), + Reviewer("Brian Weinstein", "bweinstein@apple.com", "bweinstein"), Reviewer("Cameron Zwarich", ["zwarich@apple.com", "cwzwarich@apple.com", "cwzwarich@webkit.org"]), Reviewer("Chris Blumenberg", "cblu@apple.com", "cblu"), Reviewer("Chris Marrin", "cmarrin@apple.com", "cmarrin"), diff --git a/Tools/Scripts/webkitpy/common/config/ports.py b/Tools/Scripts/webkitpy/common/config/ports.py index 163d5ef..9a5a269 100644 --- a/Tools/Scripts/webkitpy/common/config/ports.py +++ b/Tools/Scripts/webkitpy/common/config/ports.py @@ -41,6 +41,10 @@ class WebKitPort(object): def script_path(cls, script_name): return os.path.join("Tools", "Scripts", script_name) + @classmethod + def script_shell_command(cls, script_name): + return [cls.script_path(script_name)] + @staticmethod def port(port_name): ports = { @@ -76,11 +80,11 @@ class WebKitPort(object): @classmethod def update_webkit_command(cls): - return [cls.script_path("update-webkit")] + return cls.script_shell_command("update-webkit") @classmethod def build_webkit_command(cls, build_style=None): - command = [cls.script_path("build-webkit")] + command = cls.script_shell_command("build-webkit") if build_style == "debug": command.append("--debug") if build_style == "release": @@ -89,19 +93,19 @@ class WebKitPort(object): @classmethod def run_javascriptcore_tests_command(cls): - return [cls.script_path("run-javascriptcore-tests")] + return cls.script_shell_command("run-javascriptcore-tests") @classmethod def run_webkit_tests_command(cls): - return [cls.script_path("run-webkit-tests")] + return cls.script_shell_command("run-webkit-tests") @classmethod def run_python_unittests_command(cls): - return [cls.script_path("test-webkitpy")] + return cls.script_shell_command("test-webkitpy") @classmethod def run_perl_unittests_command(cls): - return [cls.script_path("test-webkitperl")] + return cls.script_shell_command("test-webkitperl") @classmethod def layout_tests_results_path(cls): @@ -226,11 +230,10 @@ class ChromiumPort(WebKitPort): @classmethod def run_webkit_tests_command(cls): - return [ - cls.script_path("new-run-webkit-tests"), - "--chromium", - "--no-pixel-tests", - ] + command = cls.script_shell_command("new-run-webkit-tests") + command.append("--chromium") + command.append("--no-pixel-tests") + return command @classmethod def run_javascriptcore_tests_command(cls): diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/__init__.py b/Tools/Scripts/webkitpy/common/net/bugzilla/__init__.py index cfaf3b1..bde67c6 100644 --- a/Tools/Scripts/webkitpy/common/net/bugzilla/__init__.py +++ b/Tools/Scripts/webkitpy/common/net/bugzilla/__init__.py @@ -2,7 +2,7 @@ # We only export public API here. # FIXME: parse_bug_id should not be a free function. -from .bugzilla import Bugzilla, parse_bug_id +from .bugzilla import Bugzilla, parse_bug_id, parse_bug_id_from_changelog # Unclear if Bug and Attachment need to be public classes. from .bug import Bug from .attachment import Attachment diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py index 17a8515..8daf92e 100644 --- a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py +++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py @@ -53,22 +53,34 @@ from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup, SoupStrainer def parse_bug_id(message): if not message: return None - match = re.search("http\://webkit\.org/b/(?P<bug_id>\d+)", message) + match = re.search(Bugzilla.bug_url_short, message) if match: return int(match.group('bug_id')) - match = re.search( - Bugzilla.bug_server_regex + "show_bug\.cgi\?id=(?P<bug_id>\d+)", - message) + match = re.search(Bugzilla.bug_url_long, message) if match: return int(match.group('bug_id')) return None +# FIXME: parse_bug_id_from_changelog should not be a free function. +# Parse the bug ID out of a Changelog message based on the format that is +# used by prepare-ChangeLog +def parse_bug_id_from_changelog(message): + if not message: + return None + match = re.search("^\s*" + Bugzilla.bug_url_short + "$", message, re.MULTILINE) + if match: + return int(match.group('bug_id')) + match = re.search("^\s*" + Bugzilla.bug_url_long + "$", message, re.MULTILINE) + if match: + return int(match.group('bug_id')) + return None + def timestamp(): return datetime.now().strftime("%Y%m%d%H%M%S") -# A container for all of the logic for making and parsing buzilla queries. +# A container for all of the logic for making and parsing bugzilla queries. class BugzillaQueries(object): def __init__(self, bugzilla): @@ -210,6 +222,8 @@ class Bugzilla(object): bug_server_host = "bugs.webkit.org" bug_server_regex = "https?://%s/" % re.sub('\.', '\\.', bug_server_host) bug_server_url = "https://%s/" % bug_server_host + bug_url_long = bug_server_regex + r"show_bug\.cgi\?id=(?P<bug_id>\d+)(&ctype=xml)?" + bug_url_short = r"http\://webkit\.org/b/(?P<bug_id>\d+)" def quips(self): # We only fetch and parse the list of quips once per instantiation diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py index 1d08ca5..2e75ca9 100644 --- a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py +++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py @@ -30,7 +30,7 @@ import unittest import datetime import StringIO -from .bugzilla import Bugzilla, BugzillaQueries, parse_bug_id +from .bugzilla import Bugzilla, BugzillaQueries, parse_bug_id, parse_bug_id_from_changelog from webkitpy.common.system.outputcapture import OutputCapture from webkitpy.tool.mocktool import MockBrowser @@ -192,6 +192,33 @@ ZEZpbmlzaExvYWRXaXRoUmVhc29uOnJlYXNvbl07Cit9CisKIEBlbmQKIAogI2VuZGlmCg== }], } + def test_parse_bug_id_from_changelog(self): + commit_text = ''' +2011-03-23 Ojan Vafai <ojan@chromium.org> + + Add failing result for WebKit2. All tests that require + focus fail on WebKit2. See https://bugs.webkit.org/show_bug.cgi?id=56988. + + * platform/mac-wk2/fast/css/pseudo-any-expected.txt: Added. + + ''' + + self.assertEquals(None, parse_bug_id_from_changelog(commit_text)) + + commit_text = ''' +2011-03-23 Ojan Vafai <ojan@chromium.org> + + Add failing result for WebKit2. All tests that require + focus fail on WebKit2. See https://bugs.webkit.org/show_bug.cgi?id=56988. + https://bugs.webkit.org/show_bug.cgi?id=12345 + + * platform/mac-wk2/fast/css/pseudo-any-expected.txt: Added. + + ''' + + self.assertEquals(12345, parse_bug_id_from_changelog(commit_text)) + + # FIXME: This should move to a central location and be shared by more unit tests. def _assert_dictionaries_equal(self, actual, expected): # Make sure we aren't parsing more or less than we expect diff --git a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py index 9dd165c..d23a6cc 100644 --- a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py +++ b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py @@ -42,9 +42,11 @@ import urllib2 from webkitpy.common.net.failuremap import FailureMap from webkitpy.common.net.layouttestresults import LayoutTestResults from webkitpy.common.net.regressionwindow import RegressionWindow +from webkitpy.common.net.testoutputset import TestOutputSet from webkitpy.common.system.logutils import get_logger -from webkitpy.thirdparty.autoinstalled.mechanize import Browser +from webkitpy.common.system.zipfileset import ZipFileSet from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup +from webkitpy.thirdparty.autoinstalled.mechanize import Browser _log = get_logger(__file__) @@ -92,6 +94,12 @@ class Builder(object): self._builds_cache[build_number] = build return build + def latest_cached_build(self): + revision_build_pairs = self.revision_build_pairs_with_results() + revision_build_pairs.sort(key=lambda i: i[1]) + latest_build_number = revision_build_pairs[-1][1] + return self.build(latest_build_number) + def force_build(self, username="webkit-patch", comments=None): def predicate(form): try: @@ -221,6 +229,12 @@ class Build(object): results_directory = "r%s (%s)" % (self.revision(), self._number) return "%s/%s" % (self._builder.results_url(), urllib.quote(results_directory)) + def results_zip_url(self): + return "%s.zip" % self.results_url() + + def results(self): + return TestOutputSet(self._builder.name(), None, ZipFileSet(self.results_zip_url()), include_expected=False) + def _fetch_results_html(self): results_html = "%s/results.html" % (self.results_url()) # FIXME: This should use NetworkTransaction's 404 handling instead. @@ -268,8 +282,10 @@ class BuildBot(object): "SnowLeopard.*Build", "SnowLeopard.*\(Test", "SnowLeopard.*\(WebKit2 Test", - "Leopard.*Release", + "Leopard.*", "Windows.*Build", + "Windows.*\(Test", + "WinCairo", "WinCE", "EFL", "GTK.*32", diff --git a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py index 6addb56..300bc88 100644 --- a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py +++ b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py @@ -231,32 +231,37 @@ class BuildBotTest(unittest.TestCase): {'name': u'SnowLeopard Intel Release (WebKit2 Tests)', }, {'name': u'SnowLeopard Intel Leaks', }, {'name': u'Windows Release (Build)', }, - {'name': u'Windows Release (Tests)', }, + {'name': u'Windows 7 Release (Tests)', }, {'name': u'Windows Debug (Build)', }, - {'name': u'Windows Debug (Tests)', }, + {'name': u'Windows XP Debug (Tests)', }, + {'name': u'Windows 7 Release (WebKit2 Tests)', }, {'name': u'GTK Linux 32-bit Release', }, {'name': u'GTK Linux 32-bit Debug', }, {'name': u'GTK Linux 64-bit Debug', }, - {'name': u'GTK Linux 64-bit Release', }, {'name': u'Qt Linux Release', }, {'name': u'Qt Linux Release minimal', }, {'name': u'Qt Linux ARMv7 Release', }, {'name': u'Qt Windows 32-bit Release', }, {'name': u'Qt Windows 32-bit Debug', }, - {'name': u'Chromium Linux Release', }, - {'name': u'Chromium Mac Release', }, {'name': u'Chromium Win Release', }, - {'name': u'Chromium Linux Release (Tests)', }, - {'name': u'Chromium Mac Release (Tests)', }, + {'name': u'Chromium Mac Release', }, + {'name': u'Chromium Linux Release', }, {'name': u'Chromium Win Release (Tests)', }, + {'name': u'Chromium Mac Release (Tests)', }, + {'name': u'Chromium Linux Release (Tests)', }, {'name': u'New run-webkit-tests', }, + {'name': u'WinCairo Debug (Build)', }, + {'name': u'WinCE Release (Build)', }, + {'name': u'EFL Linux Release (Build)', }, ] name_regexps = [ "SnowLeopard.*Build", "SnowLeopard.*\(Test", "SnowLeopard.*\(WebKit2 Test", - "Leopard.*Release", + "Leopard.*", "Windows.*Build", + "Windows.*\(Test", + "WinCairo", "WinCE", "EFL", "GTK.*32", @@ -267,11 +272,15 @@ class BuildBotTest(unittest.TestCase): expected_builders = [ {'name': u'Leopard Intel Release (Build)', }, {'name': u'Leopard Intel Release (Tests)', }, + {'name': u'Leopard Intel Debug (Build)', }, + {'name': u'Leopard Intel Debug (Tests)', }, {'name': u'SnowLeopard Intel Release (Build)', }, {'name': u'SnowLeopard Intel Release (Tests)', }, {'name': u'SnowLeopard Intel Release (WebKit2 Tests)', }, {'name': u'Windows Release (Build)', }, + {'name': u'Windows 7 Release (Tests)', }, {'name': u'Windows Debug (Build)', }, + {'name': u'Windows XP Debug (Tests)', }, {'name': u'GTK Linux 32-bit Release', }, {'name': u'GTK Linux 32-bit Debug', }, {'name': u'GTK Linux 64-bit Debug', }, @@ -280,9 +289,12 @@ class BuildBotTest(unittest.TestCase): {'name': u'Qt Linux ARMv7 Release', }, {'name': u'Qt Windows 32-bit Release', }, {'name': u'Qt Windows 32-bit Debug', }, - {'name': u'Chromium Linux Release', }, - {'name': u'Chromium Mac Release', }, {'name': u'Chromium Win Release', }, + {'name': u'Chromium Mac Release', }, + {'name': u'Chromium Linux Release', }, + {'name': u'WinCairo Debug (Build)', }, + {'name': u'WinCE Release (Build)', }, + {'name': u'EFL Linux Release (Build)', }, ] # This test should probably be updated if the default regexp list changes @@ -410,6 +422,33 @@ class BuildBotTest(unittest.TestCase): buildbot._latest_builds_from_builders = mock_builds_from_builders self.assertEqual(buildbot.last_green_revision(), 1) + def _fetch_build(self, build_number): + if build_number == 5: + return "correct build" + return "wrong build" + + def _fetch_revision_to_build_map(self): + return {'r5': 5, 'r2': 2, 'r3': 3} + + def test_latest_cached_build(self): + b = Builder('builder', BuildBot()) + b._fetch_build = self._fetch_build + b._fetch_revision_to_build_map = self._fetch_revision_to_build_map + self.assertEquals("correct build", b.latest_cached_build()) + + def results_url(self): + return "some-url" + + def test_results_zip_url(self): + b = Build(None, 123, 123, False) + b.results_url = self.results_url + self.assertEquals("some-url.zip", b.results_zip_url()) + + def test_results(self): + builder = Builder('builder', BuildBot()) + b = Build(builder, 123, 123, True) + self.assertTrue(b.results()) + if __name__ == '__main__': unittest.main() diff --git a/Tools/Scripts/webkitpy/common/system/autoinstall.py b/Tools/Scripts/webkitpy/common/system/autoinstall.py index 9adab29..4ffcccc 100755 --- a/Tools/Scripts/webkitpy/common/system/autoinstall.py +++ b/Tools/Scripts/webkitpy/common/system/autoinstall.py @@ -61,7 +61,7 @@ class AutoInstaller(object): installer.install(url="http://pypi.python.org/packages/source/p/pep8/pep8-0.5.0.tar.gz#md5=512a818af9979290cd619cce8e9c2e2b", url_subpath="pep8-0.5.0/pep8.py") - installer.install(url="http://pypi.python.org/packages/source/m/mechanize/mechanize-0.1.11.zip", + installer.install(url="http://pypi.python.org/packages/source/m/mechanize/mechanize-0.2.4.zip", url_subpath="mechanize") """ @@ -512,6 +512,6 @@ if __name__=="__main__": url_subpath="pep8-0.5.0/pep8.py") installer.install(should_refresh=False, target_name="mechanize", - url="http://pypi.python.org/packages/source/m/mechanize/mechanize-0.1.11.zip", + url="http://pypi.python.org/packages/source/m/mechanize/mechanize-0.2.4.zip", url_subpath="mechanize") diff --git a/Tools/Scripts/webkitpy/common/system/filesystem.py b/Tools/Scripts/webkitpy/common/system/filesystem.py index b876807..1988546 100644 --- a/Tools/Scripts/webkitpy/common/system/filesystem.py +++ b/Tools/Scripts/webkitpy/common/system/filesystem.py @@ -195,6 +195,9 @@ class FileSystem(object): mode = 'a' return codecs.open(path, mode, 'utf8') + def open_binary_file_for_reading(self, path): + return codecs.open(path, 'rb') + def read_binary_file(self, path): """Return the contents of the file at the given path as a byte string.""" with file(path, 'rb') as f: diff --git a/Tools/Scripts/webkitpy/common/system/filesystem_mock.py b/Tools/Scripts/webkitpy/common/system/filesystem_mock.py index aa79a8c..a6d158a 100644 --- a/Tools/Scripts/webkitpy/common/system/filesystem_mock.py +++ b/Tools/Scripts/webkitpy/common/system/filesystem_mock.py @@ -228,6 +228,11 @@ class MockFileSystem(object): def read_text_file(self, path): return self.read_binary_file(path).decode('utf-8') + def open_binary_file_for_reading(self, path): + if self.files[path] is None: + self._raise_not_found(path) + return ReadableFileObject(self, path, self.files[path]) + def read_binary_file(self, path): # Intentionally raises KeyError if we don't recognize the path. if self.files[path] is None: @@ -285,3 +290,28 @@ class WritableFileObject(object): def write(self, str): self.fs.files[self.path] += str self.fs.written_files[self.path] = self.fs.files[self.path] + + +class ReadableFileObject(object): + def __init__(self, fs, path, data=""): + self.fs = fs + self.path = path + self.closed = False + self.data = data + self.offset = 0 + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + + def close(self): + self.closed = True + + def read(self, bytes=None): + if not bytes: + return self.data[self.offset:] + start = self.offset + self.offset += bytes + return self.data[start:self.offset] |