- Revision
- 94717
- Author
- [email protected]
- Date
- 2011-09-07 14:44:49 -0700 (Wed, 07 Sep 2011)
Log Message
Add a new PortFactory class for creating new-style ports and deprecate the old PortFactory
https://bugs.webkit.org/show_bug.cgi?id=67734
Reviewed by Adam Barth.
Right now every place that creates a Port object has to be very careful
to pass in a MockSCM/MockUser/MockFilesystem when appropriate.
The correct fix is for port/factory.py (which creates most port objects)
to know how to pass these in automatically. However, currently all port/factory.py
functions are free functions instead of being on an object. This patch
adds a new PortFactory object and deprecates the PortFactory for the old-style Port objects.
In a follow-up patch I will add PortFactory to the Host object and teach PortFactory how to
pass along the proper scm/user/filesystem to the Port object.
* Scripts/webkitpy/common/host.py:
* Scripts/webkitpy/layout_tests/port/factory.py:
* Scripts/webkitpy/tool/commands/queries.py:
* Scripts/webkitpy/tool/mocktool.py:
Modified Paths
Diff
Modified: trunk/Tools/ChangeLog (94716 => 94717)
--- trunk/Tools/ChangeLog 2011-09-07 21:42:02 UTC (rev 94716)
+++ trunk/Tools/ChangeLog 2011-09-07 21:44:49 UTC (rev 94717)
@@ -1,3 +1,25 @@
+2011-09-07 Eric Seidel <[email protected]>
+
+ Add a new PortFactory class for creating new-style ports and deprecate the old PortFactory
+ https://bugs.webkit.org/show_bug.cgi?id=67734
+
+ Reviewed by Adam Barth.
+
+ Right now every place that creates a Port object has to be very careful
+ to pass in a MockSCM/MockUser/MockFilesystem when appropriate.
+ The correct fix is for port/factory.py (which creates most port objects)
+ to know how to pass these in automatically. However, currently all port/factory.py
+ functions are free functions instead of being on an object. This patch
+ adds a new PortFactory object and deprecates the PortFactory for the old-style Port objects.
+
+ In a follow-up patch I will add PortFactory to the Host object and teach PortFactory how to
+ pass along the proper scm/user/filesystem to the Port object.
+
+ * Scripts/webkitpy/common/host.py:
+ * Scripts/webkitpy/layout_tests/port/factory.py:
+ * Scripts/webkitpy/tool/commands/queries.py:
+ * Scripts/webkitpy/tool/mocktool.py:
+
2011-09-07 Sheriff Bot <[email protected]>
Unreviewed, rolling out r94441.
Modified: trunk/Tools/Scripts/webkitpy/common/host.py (94716 => 94717)
--- trunk/Tools/Scripts/webkitpy/common/host.py 2011-09-07 21:42:02 UTC (rev 94716)
+++ trunk/Tools/Scripts/webkitpy/common/host.py 2011-09-07 21:44:49 UTC (rev 94717)
@@ -53,7 +53,7 @@
self._scm = None
self._checkout = None
self.status_server = statusserver.StatusServer()
- self.port_factory = port.factory
+ self._deprecated_port_factory = port.factory
self.platform = platforminfo.PlatformInfo()
def _initialize_scm(self, patch_directories=None):
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/factory.py (94716 => 94717)
--- trunk/Tools/Scripts/webkitpy/layout_tests/port/factory.py 2011-09-07 21:42:02 UTC (rev 94716)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/factory.py 2011-09-07 21:44:49 UTC (rev 94717)
@@ -36,99 +36,116 @@
class BuilderOptions(object):
-
def __init__(self, builder_name):
self.configuration = "Debug" if re.search(r"[d|D](ebu|b)g", builder_name) else "Release"
self.builder_name = builder_name
-def all_port_names():
- """Return a list of all valid, fully-specified, "real" port names.
+class PortFactory(object):
+ def __init__(self, host=None):
+ # FIXME: All callers should pass a port.
+ self._host = host
- This is the list of directories that are used as actual baseline_paths()
- by real ports. This does not include any "fake" names like "test"
- or "mock-mac", and it does not include any directories that are not ."""
- # FIXME: There's probably a better way to generate this list ...
- return builders.all_port_names()
+ def _port_name_from_arguments_and_options(self, **kwargs):
+ port_to_use = kwargs.get('port_name', None)
+ options = kwargs.get('options', None)
+ if port_to_use is None:
+ if sys.platform == 'win32' or sys.platform == 'cygwin':
+ if options and hasattr(options, 'chromium') and options.chromium:
+ port_to_use = 'chromium-win'
+ else:
+ port_to_use = 'win'
+ elif sys.platform.startswith('linux'):
+ port_to_use = 'chromium-linux'
+ elif sys.platform == 'darwin':
+ if options and hasattr(options, 'chromium') and options.chromium:
+ port_to_use = 'chromium-cg-mac'
+ # FIXME: Add a way to select the chromium-mac port.
+ else:
+ port_to_use = 'mac'
+ if port_to_use is None:
+ raise NotImplementedError('unknown port; sys.platform = "%s"' % sys.platform)
+ return port_to_use
-def get(port_name=None, options=None, **kwargs):
- """Returns an object implementing the Port interface. If
- port_name is None, this routine attempts to guess at the most
- appropriate port on this platform."""
- # Wrapped for backwards-compatibility
- if port_name:
- kwargs['port_name'] = port_name
- if options:
- kwargs['options'] = options
- return _get_kwargs(**kwargs)
+ def _get_kwargs(self, **kwargs):
+ port_to_use = self._port_name_from_arguments_and_options(**kwargs)
+ if port_to_use.startswith('test'):
+ import test
+ maker = test.TestPort
+ elif port_to_use.startswith('dryrun'):
+ import dryrun
+ maker = dryrun.DryRunPort
+ elif port_to_use.startswith('mock-'):
+ import mock_drt
+ maker = mock_drt.MockDRTPort
+ elif port_to_use.startswith('mac'):
+ import mac
+ maker = mac.MacPort
+ elif port_to_use.startswith('win'):
+ import win
+ maker = win.WinPort
+ elif port_to_use.startswith('gtk'):
+ import gtk
+ maker = gtk.GtkPort
+ elif port_to_use.startswith('qt'):
+ import qt
+ maker = qt.QtPort
+ elif port_to_use.startswith('chromium-gpu'):
+ import chromium_gpu
+ maker = chromium_gpu.get
+ elif port_to_use.startswith('chromium-mac') or port_to_use.startswith('chromium-cg-mac'):
+ import chromium_mac
+ maker = chromium_mac.ChromiumMacPort
+ elif port_to_use.startswith('chromium-linux'):
+ import chromium_linux
+ maker = chromium_linux.ChromiumLinuxPort
+ elif port_to_use.startswith('chromium-win'):
+ import chromium_win
+ maker = chromium_win.ChromiumWinPort
+ elif port_to_use.startswith('google-chrome'):
+ import google_chrome
+ maker = google_chrome.GetGoogleChromePort
+ else:
+ raise NotImplementedError('unsupported port: %s' % port_to_use)
+ return maker(**kwargs)
-def get_from_builder_name(builder_name):
- port_name = builders.port_name_for_builder_name(builder_name)
- assert(port_name) # Need to update port_name_for_builder_name
- port = get(port_name, BuilderOptions(builder_name))
- assert(port) # Need to update port_name_for_builder_name
- return port
+ def all_port_names(self):
+ """Return a list of all valid, fully-specified, "real" port names.
+ This is the list of directories that are used as actual baseline_paths()
+ by real ports. This does not include any "fake" names like "test"
+ or "mock-mac", and it does not include any directories that are not ."""
+ # FIXME: There's probably a better way to generate this list ...
+ return builders.all_port_names()
-def _get_kwargs(**kwargs):
- port_to_use = kwargs.get('port_name', None)
- options = kwargs.get('options', None)
- if port_to_use is None:
- if sys.platform == 'win32' or sys.platform == 'cygwin':
- if options and hasattr(options, 'chromium') and options.chromium:
- port_to_use = 'chromium-win'
- else:
- port_to_use = 'win'
- elif sys.platform.startswith('linux'):
- port_to_use = 'chromium-linux'
- elif sys.platform == 'darwin':
- if options and hasattr(options, 'chromium') and options.chromium:
- port_to_use = 'chromium-cg-mac'
- # FIXME: Add a way to select the chromium-mac port.
- else:
- port_to_use = 'mac'
+ def get(self, port_name=None, options=None, **kwargs):
+ """Returns an object implementing the Port interface. If
+ port_name is None, this routine attempts to guess at the most
+ appropriate port on this platform."""
+ # Wrapped for backwards-compatibility
+ if port_name:
+ kwargs['port_name'] = port_name
+ if options:
+ kwargs['options'] = options
+ return self._get_kwargs(**kwargs)
- if port_to_use is None:
- raise NotImplementedError('unknown port; sys.platform = "%s"' % sys.platform)
+ def get_from_builder_name(self, builder_name):
+ port_name = builders.port_name_for_builder_name(builder_name)
+ assert(port_name) # Need to update port_name_for_builder_name
+ port = self.get(port_name, BuilderOptions(builder_name))
+ assert(port) # Need to update port_name_for_builder_name
+ return port
- if port_to_use.startswith('test'):
- import test
- maker = test.TestPort
- elif port_to_use.startswith('dryrun'):
- import dryrun
- maker = dryrun.DryRunPort
- elif port_to_use.startswith('mock-'):
- import mock_drt
- maker = mock_drt.MockDRTPort
- elif port_to_use.startswith('mac'):
- import mac
- maker = mac.MacPort
- elif port_to_use.startswith('win'):
- import win
- maker = win.WinPort
- elif port_to_use.startswith('gtk'):
- import gtk
- maker = gtk.GtkPort
- elif port_to_use.startswith('qt'):
- import qt
- maker = qt.QtPort
- elif port_to_use.startswith('chromium-gpu'):
- import chromium_gpu
- maker = chromium_gpu.get
- elif port_to_use.startswith('chromium-mac') or port_to_use.startswith('chromium-cg-mac'):
- import chromium_mac
- maker = chromium_mac.ChromiumMacPort
- elif port_to_use.startswith('chromium-linux'):
- import chromium_linux
- maker = chromium_linux.ChromiumLinuxPort
- elif port_to_use.startswith('chromium-win'):
- import chromium_win
- maker = chromium_win.ChromiumWinPort
- elif port_to_use.startswith('google-chrome'):
- import google_chrome
- maker = google_chrome.GetGoogleChromePort
- else:
- raise NotImplementedError('unsupported port: %s' % port_to_use)
- return maker(**kwargs)
+
+
+# FIXME: These free functions are all deprecated. Callers should be using PortFactory instead.
+def all_port_names():
+ return PortFactory().all_port_names()
+
+def get(port_name=None, options=None, **kwargs):
+ return PortFactory().get(port_name, options, **kwargs)
+
+def get_from_builder_name(builder_name):
+ return PortFactory().get_from_builder_name(builder_name)
Modified: trunk/Tools/Scripts/webkitpy/tool/commands/queries.py (94716 => 94717)
--- trunk/Tools/Scripts/webkitpy/tool/commands/queries.py 2011-09-07 21:42:02 UTC (rev 94716)
+++ trunk/Tools/Scripts/webkitpy/tool/commands/queries.py 2011-09-07 21:44:49 UTC (rev 94717)
@@ -387,7 +387,7 @@
def execute(self, options, args, tool):
results = dict([(test_name, []) for test_name in args])
- for port_name, port_object in tool.port_factory.get_all().iteritems():
+ for port_name, port_object in tool._deprecated_port_factory.get_all().iteritems():
for test_name in args:
if port_object.skips_layout_test(test_name):
results[test_name].append(port_name)
Modified: trunk/Tools/Scripts/webkitpy/tool/mocktool.py (94716 => 94717)
--- trunk/Tools/Scripts/webkitpy/tool/mocktool.py 2011-09-07 21:42:02 UTC (rev 94716)
+++ trunk/Tools/Scripts/webkitpy/tool/mocktool.py 2011-09-07 21:44:49 UTC (rev 94717)
@@ -801,7 +801,7 @@
return test_name == "media/foo/bar.html"
-class MockPortFactory(object):
+class MockDeprecatedPortFactory(object):
def get_all(self, options=None):
return {"test_port1": MockTestPort1(), "test_port2": MockTestPort2()}
@@ -845,7 +845,7 @@
self._checkout = MockCheckout()
self.status_server = MockStatusServer()
self.irc_password = "MOCK irc password"
- self.port_factory = MockPortFactory()
+ self._deprecated_port_factory = MockDeprecatedPortFactory()
self.platform = MockPlatformInfo()
def scm(self):