Title: [94717] trunk/Tools
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):
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to