[Win] webkitpy is applying abspath to DOS paths, yielding invalid paths
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Nov 2015 00:21:13 +0000 (00:21 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Nov 2015 00:21:13 +0000 (00:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151156

Reviewed by Anders Carlsson.

My earlier patch was incomplete. There are some Python libraries that want
to receive UNIX style paths, even though all of our applications and tools
use DOS paths. To handle this special case, we need to track a UNIX-style
absolute path that can be given to things like the Python socket server.

When we cut over to all-native Windows Python we can get rid of this
special case code.

* Scripts/webkitpy/common/system/filesystem.py:
(FileSystem.abspath): Add special code for Cygwin to convert a DOS-style
path into something Cygwin can use internally.
* Scripts/webkitpy/port/base.py:
(Port.results_directory): Remove custom Windows code. Instead, override
the method in the windows port object.
(Port.abs_results_directory): Add stub.
(Port.to.start_websocket_server): For Cygwin, use special cygwin absolute
path.
* Scripts/webkitpy/port/win.py:
(WinPort.__init__): Added to initialze new _abs_results_directory value.
(WinPort.abs_results_directory): Added,
(WinPort.results_directory): Modified to also create a value for
_abs_results_directory

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@192395 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/webkitpy/common/system/filesystem.py
Tools/Scripts/webkitpy/port/base.py
Tools/Scripts/webkitpy/port/win.py

index 4d02b8d..b4a0596 100644 (file)
@@ -1,3 +1,33 @@
+2015-11-12  Brent Fulgham  <bfulgham@apple.com>
+
+        [Win] webkitpy is applying abspath to DOS paths, yielding invalid paths
+        https://bugs.webkit.org/show_bug.cgi?id=151156
+
+        Reviewed by Anders Carlsson.
+
+        My earlier patch was incomplete. There are some Python libraries that want
+        to receive UNIX style paths, even though all of our applications and tools
+        use DOS paths. To handle this special case, we need to track a UNIX-style
+        absolute path that can be given to things like the Python socket server.
+        
+        When we cut over to all-native Windows Python we can get rid of this
+        special case code.
+        
+        * Scripts/webkitpy/common/system/filesystem.py:
+        (FileSystem.abspath): Add special code for Cygwin to convert a DOS-style
+        path into something Cygwin can use internally.
+        * Scripts/webkitpy/port/base.py:
+        (Port.results_directory): Remove custom Windows code. Instead, override
+        the method in the windows port object.
+        (Port.abs_results_directory): Add stub.
+        (Port.to.start_websocket_server): For Cygwin, use special cygwin absolute
+        path.
+        * Scripts/webkitpy/port/win.py:
+        (WinPort.__init__): Added to initialze new _abs_results_directory value.
+        (WinPort.abs_results_directory): Added,
+        (WinPort.results_directory): Modified to also create a value for
+        _abs_results_directory
+
 2015-11-12  Keith Miller  <keith_miller@apple.com>
 
         Unreviewed, add Michael Saboff to the JavaScriptCore watchlist, per request.
index 3116a5f..747486c 100644 (file)
@@ -49,6 +49,15 @@ class FileSystem(object):
     pardir = os.pardir
 
     def abspath(self, path):
+        # FIXME: This gross hack is needed while we transition from Cygwin to native Windows, because we
+        # have some mixing of file conventions from different tools:
+        if sys.platform == 'cygwin':
+            path = os.path.normpath(path)
+            path_components = path.split(os.sep)
+            if path_components and len(path_components[0]) == 2 and path_components[0][1] == ':':
+                path_components[0] = path_components[0][0]
+                path = os.path.join('/', 'cygdrive', *path_components)
+
         return os.path.abspath(path)
 
     def realpath(self, path):
index e23b6f3..dd52fd3 100644 (file)
@@ -775,12 +775,12 @@ class Port(object):
         """Absolute path to the place to store the test results (uses --results-directory)."""
         if not self._results_directory:
             option_val = self.get_option('results_directory') or self.default_results_directory()
-            if sys.platform in ('win32', 'cygwin'):
-                self._results_directory = option_val
-            else:
-                self._results_directory = self._filesystem.abspath(option_val)
+            self._results_directory = self._filesystem.abspath(option_val)
         return self._results_directory
 
+    def abs_results_directory(self):
+        return self.results_directory()
+
     def perf_results_directory(self):
         return self._build_path()
 
@@ -907,7 +907,12 @@ class Port(object):
         Ports can stub this out if they don't need a websocket server to be running."""
         assert not self._websocket_server, 'Already running a websocket server.'
 
-        server = websocket_server.PyWebSocket(self, self.results_directory())
+        work_directory = self.results_directory()
+        if self.host.platform.is_cygwin():
+            # Cygwin socket server needs a UNIX path.
+            work_directory = self.abs_results_directory()
+
+        server = websocket_server.PyWebSocket(self, work_directory)
         server.start()
         self._websocket_server = server
 
index 32c53ac..4e2a268 100644 (file)
@@ -61,6 +61,24 @@ class WinPort(ApplePort):
 
     previous_error_reporting_values = {}
 
+    def __init__(self, host, port_name, **kwargs):
+        ApplePort.__init__(self, host, port_name, **kwargs)
+
+        self._abs_results_directory = None
+
+    def abs_results_directory(self):
+        if not self._results_directory:
+            self.results_directory()
+        return self._abs_results_directory
+
+    def results_directory(self):
+        """Absolute path to the place to store the test results (uses --results-directory)."""
+        if not self._results_directory:
+            option_val = self.get_option('results_directory') or self.default_results_directory()
+            self._results_directory = option_val
+            self._abs_results_directory = self._filesystem.abspath(option_val)
+        return self._results_directory
+
     def do_text_results_differ(self, expected_text, actual_text):
         # Sanity was restored in WK2, so we don't need this hack there.
         if self.get_option('webkit_test_runner'):