Diff
Modified: trunk/Tools/ChangeLog (224656 => 224657)
--- trunk/Tools/ChangeLog 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/ChangeLog 2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,3 +1,63 @@
+2017-11-09 Jonathan Bedard <[email protected]>
+
+ webkitpy: Unify version parsing code
+ https://bugs.webkit.org/show_bug.cgi?id=179426
+ <rdar://problem/35415191>
+
+ Reviewed by David Kilzer.
+
+ webkitpy needs to parse version strings or version lists frequently. Rather than
+ duplicate this code each time it's needed, unify it in a Version class.
+
+ * Scripts/webkitpy/common/system/platforminfo.py:
+ (PlatformInfo.__init__): Convert mac version string to version object and
+ use _win_version instead of _win_version_tuple.
+ (PlatformInfo.xcode_sdk_version): Convert SDK version string to Version object
+ before returning it.
+ (PlatformInfo.xcode_version): Return Version object instead of version string.
+ (PlatformInfo._determine_mac_version): Accept Version object instead of string,
+ eliminate parsing.
+ (PlatformInfo._determine_win_version): Accept Version object instead of tuple.
+ (PlatformInfo._win_version): Return Version object instead of tuple, have Version
+ object own version string parsing.
+ (PlatformInfo._win_version_tuple): Renamed to _win_version().
+ (PlatformInfo._win_version_tuple_from_cmd): Deleted.
+ * Scripts/webkitpy/common/system/platforminfo_mock.py:
+ (MockPlatformInfo.xcode_sdk_version): Return Version object instead of string.
+ (MockPlatformInfo.xcode_version): Dittio.
+ * Scripts/webkitpy/common/version.py: Added.
+ (Version): Version object.
+ (Version.__init__): Initialize the Version object with a string, integer,
+ tuple of integers, list of integers or another Version object.
+ (Version.__len__): Return 5 so that the Version object can be treated as
+ a list or tuple.
+ (Version.__getitem__): Get item in Version object by index or string.
+ (Version.__setitem__): Set item in Version object by index or string.
+ (Version.__str__): Convert version to printable string, omitting trailing 0's.
+ (Version.__cmp__): Compare two version strings, major taking precedence over
+ minor, minor taking precedence over build.
+ * Scripts/webkitpy/common/version_unittest.py: Added.
+ (VersionTestCase): Test behavior of Version object.
+ * Scripts/webkitpy/port/ios.py:
+ (IOSPort.default_baseline_search_path): ios_version now returns a Version object.
+ (IOSPort._is_valid_ios_version): Deleted.
+ (IOSPort.get_option): Deleted.
+ * Scripts/webkitpy/port/ios_device.py:
+ (IOSDevicePort.determine_full_port_name): Use Version object instead of owning parsing.
+ (IOSDevicePort.ios_version): Return Version object instead of string.
+ * Scripts/webkitpy/port/ios_simulator.py:
+ (IOSSimulatorPort.simulator_runtime): Use from_version instead of from_version_string.
+ (IOSSimulatorPort.ios_version): Return Version object instead of string.
+ (IOSSimulatorPort.use_multiple_simulator_apps): Use Version object instead of string.
+ * Scripts/webkitpy/xcode/simulator.py:
+ (Runtime.from_version): Accept Version object instead of string.
+ (Runtime.from_version_string): Replaced by from_version.
+ (Runtime.__repr__): When printing, a runtime's version will be a Version object instead
+ of a tuple.
+ (Simulator._parse_runtimes): Use Version object instead of tuple.
+ (Simulator._parse_devices): Ditto.
+ * Scripts/webkitpy/xcode/simulator_unittest.py: Use Version object instead of tuples.
+
2017-11-09 Basuke Suzuki <[email protected]>
[WinCairo] Cannot find ImageDiff executable
Modified: trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,5 +1,5 @@
# Copyright (c) 2011 Google Inc. All rights reserved.
-# Copyright (c) 2015 Apple Inc. All rights reserved.
+# Copyright (c) 2015-2017 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
@@ -30,6 +30,7 @@
import re
import sys
+from webkitpy.common.version import Version
from webkitpy.common.system.executive import Executive
@@ -55,9 +56,9 @@
if self.os_name == 'freebsd' or self.os_name == 'openbsd' or self.os_name == 'netbsd' or self.os_name == 'ios':
self.os_version = platform_module.release()
if self.os_name.startswith('mac'):
- self.os_version = self._determine_mac_version(platform_module.mac_ver()[0])
+ self.os_version = self._determine_mac_version(Version(platform_module.mac_ver()[0]))
if self.os_name.startswith('win'):
- self.os_version = self._determine_win_version(self._win_version_tuple(sys_module))
+ self.os_version = self._determine_win_version(self._win_version(sys_module))
self._is_cygwin = sys_module.platform == 'cygwin'
def is_mac(self):
@@ -127,8 +128,8 @@
def xcode_sdk_version(self, sdk_name):
if self.is_mac():
# Assumes that xcrun does not write to standard output on failure (e.g. SDK does not exist).
- return self._executive.run_command(["xcrun", "--sdk", sdk_name, "--show-sdk-version"], return_stderr=False, error_handler=Executive.ignore_error).rstrip()
- return ''
+ return Version(self._executive.run_command(["xcrun", "--sdk", sdk_name, "--show-sdk-version"], return_stderr=False, error_handler=Executive.ignore_error).rstrip())
+ return None
def xcode_simctl_list(self):
if not self.is_mac():
@@ -139,7 +140,7 @@
def xcode_version(self):
if not self.is_mac():
raise NotImplementedError
- return self._executive.run_command(['xcodebuild', '-version']).split()[1]
+ return Version(self._executive.run_command(['xcodebuild', '-version']).split()[1])
def _determine_os_name(self, sys_platform):
if sys_platform == 'darwin':
@@ -158,8 +159,7 @@
return 'haiku'
raise AssertionError('unrecognized platform string "%s"' % sys_platform)
- def _determine_mac_version(self, mac_version_string):
- release_version = int(mac_version_string.split('.')[1])
+ def _determine_mac_version(self, mac_version):
version_strings = {
5: 'leopard',
6: 'snowleopard',
@@ -171,34 +171,27 @@
12: 'sierra',
13: 'highsierra',
}
- assert release_version >= min(version_strings.keys())
- return version_strings.get(release_version, 'future')
+ assert mac_version.minor >= min(version_strings.keys())
+ return version_strings.get(mac_version.minor, 'future')
def _determine_linux_version(self):
# FIXME: we ignore whatever the real version is and pretend it's lucid for now.
return 'lucid'
- def _determine_win_version(self, win_version_tuple):
- if win_version_tuple[:2] == (0, 0):
- if win_version_tuple[2] > 10000:
+ def _determine_win_version(self, win_version):
+ if win_version.major == 0 and win_version.minor == 0:
+ if win_version[2] > 10000:
return 'win10'
- if win_version_tuple[:3] == (6, 1, 7600):
+ if win_version == Version([6, 1, 7600]):
return '7sp0'
- if win_version_tuple[:2] == (6, 0):
+ if win_version.major == 6 and win_version.minor == 0:
return 'vista'
- if win_version_tuple[:2] == (5, 1):
+ if win_version.major == 5 and win_version.minor == 1:
return 'xp'
- assert win_version_tuple[0] > 6 or win_version_tuple[1] >= 1, 'Unrecognized Windows version tuple: "%s"' % (win_version_tuple,)
+ assert win_version[0] > 6 or win_version[1] >= 1, 'Unrecognized Windows version: "{}"'.format(win_version)
return 'future'
- def _win_version_tuple(self, sys_module):
+ def _win_version(self, sys_module):
if hasattr(sys_module, 'getwindowsversion'):
- return sys_module.getwindowsversion()
- return self._win_version_tuple_from_cmd()
-
- def _win_version_tuple_from_cmd(self):
- # Note that this should only ever be called on windows, so this should always work.
- ver_output = self._executive.run_command(['cmd', '/c', 'ver'], decode_output=False)
- match_object = re.search(r'(?P<major>\d)\.(?P<minor>\d)\.(?P<build>\d+)', ver_output)
- assert match_object, 'cmd returned an unexpected version string: ' + ver_output
- return tuple(map(int, match_object.groups()))
+ return Version(sys_module.getwindowsversion())
+ return Version(self._executive.run_command(['cmd', '/c', 'ver'], decode_output=False))
Modified: trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,4 +1,5 @@
# Copyright (C) 2011 Google Inc. All rights reserved.
+# Copyright (c) 2017 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
@@ -26,6 +27,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+from webkitpy.common.version import Version
class MockPlatformInfo(object):
def __init__(self, os_name='mac', os_version='snowleopard'):
@@ -61,10 +63,10 @@
return 80
def xcode_sdk_version(self, sdk_name):
- return '8.1'
+ return Version('8.1')
def xcode_version(self):
- return '8.0'
+ return Version('8.0')
def xcode_simctl_list(self):
return self.expected_xcode_simctl_list
Added: trunk/Tools/Scripts/webkitpy/common/version.py (0 => 224657)
--- trunk/Tools/Scripts/webkitpy/common/version.py (rev 0)
+++ trunk/Tools/Scripts/webkitpy/common/version.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -0,0 +1,107 @@
+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+class Version(object):
+
+ def __init__(self, ver='0'):
+ self.major = 0
+ self.minor = 0
+ self.tiny = 0
+ self.micro = 0
+ self.nano = 0
+ if isinstance(ver, int):
+ self.major = ver
+ return
+ elif isinstance(ver, str) or isinstance(ver, unicode):
+ for i in xrange(len(ver.split('.'))):
+ self[i] = ver.split('.')[i]
+ return
+ elif isinstance(ver, list) or isinstance(ver, Version) or isinstance(ver, tuple):
+ for i in xrange(len(ver)):
+ self[i] = ver[i]
+ return
+ elif ver is None:
+ return # Empty version is implicitly zero
+ raise ValueError('Version expected to be string, integer, tuple or list of integers')
+
+ def __len__(self):
+ return 5
+
+ def __getitem__(self, key):
+ if isinstance(key, int):
+ if key == 0:
+ return self.major
+ elif key == 1:
+ return self.minor
+ elif key == 2:
+ return self.tiny
+ elif key == 3:
+ return self.micro
+ elif key == 4:
+ return self.nano
+ raise ValueError('Version key must be between 0 and 4')
+ elif isinstance(key, str):
+ if hasattr(self, key):
+ return getattr(self, key)
+ raise ValueError('Version key must be major, minor, tiny, micro or nano')
+ raise ValueError('Expected version key to be string or integer')
+
+ def __setitem__(self, key, value):
+ if isinstance(key, int):
+ if key == 0:
+ self.major = int(value)
+ return self.major
+ elif key == 1:
+ self.minor = int(value)
+ return self.minor
+ elif key == 2:
+ self.tiny = int(value)
+ return self.tiny
+ elif key == 3:
+ self.micro = int(value)
+ return self.micro
+ elif key == 4:
+ self.nano = int(value)
+ return self.nano
+ raise ValueError('Version key must be between 0 and 4')
+ elif isinstance(key, str):
+ if hasattr(self, key):
+ return setattr(self, key, value)
+ raise ValueError('Version key must be major, minor, tiny, micro or nano')
+ raise ValueError('Expected version key to be string or integer')
+
+ def __str__(self):
+ len_to_print = 1
+ for i in xrange(len(self)):
+ if self[i]:
+ len_to_print = i + 1
+ result = str(self.major)
+ for i in xrange(len_to_print - 1):
+ result += '.{}'.format(self[i + 1])
+ return result
+
+ def __cmp__(self, other):
+ for i in xrange(len(self)):
+ if cmp(self[i], other[i]):
+ return cmp(self[i], other[i])
+ return 0
Added: trunk/Tools/Scripts/webkitpy/common/version_unittest.py (0 => 224657)
--- trunk/Tools/Scripts/webkitpy/common/version_unittest.py (rev 0)
+++ trunk/Tools/Scripts/webkitpy/common/version_unittest.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -0,0 +1,132 @@
+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest
+
+from version import Version
+
+
+class VersionTestCase(unittest.TestCase):
+
+ def test_string_constructor(self):
+ v = Version('1.2.3.4.5')
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 2)
+ self.assertEqual(v.tiny, 3)
+ self.assertEqual(v.micro, 4)
+ self.assertEqual(v.nano, 5)
+
+ def test_list_constructor(self):
+ v = Version([1, 2, 3, 4, 5])
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 2)
+ self.assertEqual(v.tiny, 3)
+ self.assertEqual(v.micro, 4)
+ self.assertEqual(v.nano, 5)
+
+ def test_tuple_constructor(self):
+ v = Version((1, 2, 3))
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 2)
+ self.assertEqual(v.tiny, 3)
+
+ def test_int_constructor(self):
+ v = Version(1)
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 0)
+ self.assertEqual(v.tiny, 0)
+ self.assertEqual(v.micro, 0)
+ self.assertEqual(v.nano, 0)
+
+ def test_copy_constructor(self):
+ v = Version(Version([1, 2, 3, 4, 5]))
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 2)
+ self.assertEqual(v.tiny, 3)
+ self.assertEqual(v.micro, 4)
+ self.assertEqual(v.nano, 5)
+
+ def test_none_constructor(self):
+ v = Version(None)
+ self.assertEqual(v.major, 0)
+ self.assertEqual(v.minor, 0)
+ self.assertEqual(v.tiny, 0)
+ self.assertEqual(v.micro, 0)
+ self.assertEqual(v.nano, 0)
+
+ def test_len(self):
+ self.assertEqual(len(Version('1.2.3.4.5')), 5)
+ self.assertEqual(len(Version()), 5)
+
+ def test_set_by_int(self):
+ v = Version(None)
+ v[0] = 1
+ self.assertEqual(v.major, 1)
+ v[1] = 2
+ self.assertEqual(v.minor, 2)
+ v[2] = 3
+ self.assertEqual(v.tiny, 3)
+ v[3] = 4
+ self.assertEqual(v.micro, 4)
+ v[4] = 5
+ self.assertEqual(v.nano, 5)
+
+ def test_set_by_string(self):
+ v = Version(None)
+ v['major'] = 1
+ self.assertEqual(v.major, 1)
+ v['minor'] = 2
+ self.assertEqual(v.minor, 2)
+ v['tiny'] = 3
+ self.assertEqual(v.tiny, 3)
+ v['micro'] = 4
+ self.assertEqual(v.micro, 4)
+ v['nano'] = 5
+ self.assertEqual(v.nano, 5)
+
+ def test_get_by_int(self):
+ v = Version('1.2.3.4.5')
+ self.assertEqual(v[0], v.major)
+ self.assertEqual(v[1], v.minor)
+ self.assertEqual(v[2], v.tiny)
+ self.assertEqual(v[3], v.micro)
+ self.assertEqual(v[4], v.nano)
+
+ def test_get_by_string(self):
+ v = Version('1.2.3.4.5')
+ self.assertEqual(v['major'], v.major)
+ self.assertEqual(v['minor'], v.minor)
+ self.assertEqual(v['tiny'], v.tiny)
+ self.assertEqual(v['micro'], v.micro)
+ self.assertEqual(v['nano'], v.nano)
+
+ def test_string(self):
+ self.assertEqual(str(Version('1.2.3')), '1.2.3')
+ self.assertEqual(str(Version('1.2.0')), '1.2')
+ self.assertEqual(str(Version('1.2')), '1.2')
+ self.assertEqual(str(Version('0.0.3')), '0.0.3')
+
+ def test_compare_versions(self):
+ self.assertEqual(Version('1.2.3'), Version('1.2.3'))
+ self.assertGreater(Version('1.2.4'), Version('1.2.3'))
+ self.assertGreater(Version('1.3.2'), Version('1.2.3'))
+ self.assertGreater(Version('2.1.1'), Version('1.2.3'))
Modified: trunk/Tools/Scripts/webkitpy/port/ios.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/port/ios.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/port/ios.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -24,6 +24,7 @@
import traceback
from webkitpy.common.memoized import memoized
+from webkitpy.common.version import Version
from webkitpy.layout_tests.models.test_configuration import TestConfiguration
from webkitpy.port.config import apple_additions
from webkitpy.port.darwin import DarwinPort
@@ -109,11 +110,11 @@
if self.get_option('webkit_test_runner'):
wk_string = 'wk2'
fallback_names = [
- '{}-{}-{}'.format(self.port_name, self.ios_version().split('.')[0], wk_string),
- '{}-{}'.format(self.port_name, self.ios_version().split('.')[0]),
+ '{}-{}-{}'.format(self.port_name, self.ios_version().major, wk_string),
+ '{}-{}'.format(self.port_name, self.ios_version().major),
'{}-{}'.format(self.port_name, wk_string),
self.port_name,
- '{}-{}'.format(IOSPort.port_name, self.ios_version().split('.')[0]),
+ '{}-{}'.format(IOSPort.port_name, self.ios_version().major),
'{}-{}'.format(IOSPort.port_name, wk_string),
IOSPort.port_name,
]
@@ -134,22 +135,6 @@
def test_expectations_file_position(self):
return 4
- @staticmethod
- def _is_valid_ios_version(version_identifier):
- # Examples of valid versions: '11', '10.3', '10.3.1'
- if not version_identifier:
- return False
- split_by_period = version_identifier.split('.')
- if len(split_by_period) > 3:
- return False
- return all(part.isdigit() for part in split_by_period)
-
- def get_option(self, name, default_value=None):
- result = super(IOSPort, self).get_option(name, default_value)
- if name == 'version' and result and not IOSPort._is_valid_ios_version(result):
- raise RuntimeError('{} is an invalid iOS version'.format(result))
- return result
-
def ios_version(self):
raise NotImplementedError
Modified: trunk/Tools/Scripts/webkitpy/port/ios_device.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/port/ios_device.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/port/ios_device.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -24,6 +24,7 @@
from webkitpy.common.memoized import memoized
from webkitpy.common.system.crashlogs import CrashLogs
+from webkitpy.common.version import Version
from webkitpy.port.config import apple_additions
from webkitpy.port.ios import IOSPort
@@ -64,8 +65,7 @@
iphoneos_sdk_version = host.platform.xcode_sdk_version(cls.SDK)
if not iphoneos_sdk_version:
raise Exception("Please install the iOS SDK.")
- major_version_number = iphoneos_sdk_version.split('.')[0]
- port_name = port_name + '-' + major_version_number
+ port_name = port_name + '-' + str(iphoneos_sdk_version.major)
return port_name
def path_to_crash_logs(self):
@@ -94,7 +94,7 @@
@memoized
def ios_version(self):
if self.get_option('version'):
- return self.get_option('version')
+ return Version(self.get_option('version'))
if not apple_additions():
raise RuntimeError(self.NO_ON_DEVICE_TESTING)
@@ -109,7 +109,7 @@
if device.platform.os_version != version:
raise RuntimeError('Multiple connected devices have different iOS versions')
- return version
+ return Version(version)
# FIXME: These need device implementations <rdar://problem/30497991>.
def check_for_leaks(self, process_name, process_pid):
Modified: trunk/Tools/Scripts/webkitpy/port/ios_simulator.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/port/ios_simulator.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/port/ios_simulator.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -30,6 +30,7 @@
from webkitpy.common.memoized import memoized
from webkitpy.common.system.executive import ScriptError
+from webkitpy.common.version import Version
from webkitpy.port.device import Device
from webkitpy.port.ios import IOSPort
from webkitpy.xcode.simulator import Simulator, Runtime, DeviceType
@@ -102,9 +103,9 @@
if runtime_identifier:
runtime = Runtime.from_identifier(runtime_identifier)
elif self.get_option('version'):
- runtime = Runtime.from_version_string(self.get_option('version'))
+ runtime = Runtime.from_version(Version(self.get_option('version')))
else:
- runtime = Runtime.from_version_string(self.host.platform.xcode_sdk_version('iphonesimulator'))
+ runtime = Runtime.from_version(self.host.platform.xcode_sdk_version('iphonesimulator'))
return runtime
@memoized
@@ -111,7 +112,7 @@
def ios_version(self):
runtime_identifier = self.get_option('runtime')
if self.get_option('version'):
- return self.get_option('version')
+ return Version(self.get_option('version'))
if runtime_identifier:
return '.'.join(str(i) for i in Runtime.from_identifier(runtime_identifier).version)
return self.host.platform.xcode_sdk_version('iphonesimulator')
@@ -187,7 +188,7 @@
_log.warning('Unable to remove Simulator' + str(i))
def use_multiple_simulator_apps(self):
- return int(self.host.platform.xcode_version().split('.')[0]) < 9
+ return int(self.host.platform.xcode_version().major) < 9
def _create_simulators(self):
if (self.default_child_processes() < self.child_processes()):
Modified: trunk/Tools/Scripts/webkitpy/xcode/simulator.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/xcode/simulator.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/xcode/simulator.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -30,6 +30,7 @@
from webkitpy.common.timeout_context import Timeout
from webkitpy.common.host import Host
+from webkitpy.common.version import Version
_log = logging.getLogger(__name__)
@@ -129,8 +130,8 @@
self.is_internal_runtime = is_internal_runtime
@classmethod
- def from_version_string(cls, version):
- return cls.from_identifier('com.apple.CoreSimulator.SimRuntime.iOS-' + version.replace('.', '-'))
+ def from_version(cls, version):
+ return cls.from_identifier('com.apple.CoreSimulator.SimRuntime.iOS-' + '{}-{}'.format(version[0], version[1]))
@classmethod
def from_identifier(cls, identifier):
@@ -156,7 +157,7 @@
if self.is_internal_runtime:
version_suffix = " Internal"
return '<Runtime {version}: {identifier}. Available: {available}, {num_devices} devices>'.format(
- version='.'.join(map(str, self.version)) + version_suffix,
+ version=str(self.version) + version_suffix,
identifier=self.identifier,
available=self.available,
num_devices=len(self.devices))
@@ -334,8 +335,7 @@
if line != '== Devices ==':
raise RuntimeError('Expected == Devices == header but got: "{}"'.format(line))
break
- version = tuple(map(int, runtime_match.group('version').split('.')))
- runtime = Runtime(version=version,
+ runtime = Runtime(version=Version(runtime_match.group('version')),
identifier=runtime_match.group('identifier'),
available=runtime_match.group('availability') is None,
is_internal_runtime=bool(runtime_match.group('internal')))
@@ -353,8 +353,7 @@
for line in lines:
version_match = self.version_re.match(line)
if version_match:
- version = tuple(map(int, version_match.group('version').split('.')))
- current_runtime = self.runtime(version=version, is_internal_runtime=bool(version_match.group('internal')))
+ current_runtime = self.runtime(version=Version(version_match.group('version')), is_internal_runtime=bool(version_match.group('internal')))
assert current_runtime
continue
Modified: trunk/Tools/Scripts/webkitpy/xcode/simulator_unittest.py (224656 => 224657)
--- trunk/Tools/Scripts/webkitpy/xcode/simulator_unittest.py 2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/xcode/simulator_unittest.py 2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Apple Inc. All rights reserved.
+# Copyright (C) 2015-2017 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -23,6 +23,7 @@
import unittest
from webkitpy.common.host_mock import MockHost
+from webkitpy.common.version import Version
from webkitpy.xcode.simulator import Simulator
@@ -134,7 +135,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0', runtime_ios_8.identifier)
self.assertEqual(True, runtime_ios_8.available)
self.assertEqual(False, runtime_ios_8.is_internal_runtime)
- self.assertEqual(tuple([8, 0]), runtime_ios_8.version)
+ self.assertEqual(Version([8, 0]), runtime_ios_8.version)
self.assertEqual(11, len(runtime_ios_8.devices))
device_iphone_4s = runtime_ios_8.devices[0]
@@ -207,7 +208,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0-Internal', runtime_ios_8_internal.identifier)
self.assertEqual(False, runtime_ios_8_internal.available)
self.assertEqual(True, runtime_ios_8_internal.is_internal_runtime)
- self.assertEqual(tuple([8, 0]), runtime_ios_8_internal.version)
+ self.assertEqual(Version([8, 0]), runtime_ios_8_internal.version)
self.assertEqual(0, len(runtime_ios_8_internal.devices))
runtime_ios_8_4 = simulator.runtimes[2]
@@ -214,7 +215,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-4', runtime_ios_8_4.identifier)
self.assertEqual(True, runtime_ios_8_4.available)
self.assertEqual(False, runtime_ios_8_4.is_internal_runtime)
- self.assertEqual(tuple([8, 4]), runtime_ios_8_4.version)
+ self.assertEqual(Version([8, 4]), runtime_ios_8_4.version)
self.assertEqual(0, len(runtime_ios_8_4.devices))
runtime_tvos_9 = simulator.runtimes[3]
@@ -221,7 +222,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.tvOS-9-0', runtime_tvos_9.identifier)
self.assertEqual(True, runtime_tvos_9.available)
self.assertEqual(False, runtime_tvos_9.is_internal_runtime)
- self.assertEqual(tuple([9, 0]), runtime_tvos_9.version)
+ self.assertEqual(Version([9, 0]), runtime_tvos_9.version)
self.assertEqual(1, len(runtime_tvos_9.devices))
device_apple_tv_1080p = runtime_tvos_9.devices[0]
@@ -234,7 +235,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.watchOS-2-0', runtime_watchos_2.identifier)
self.assertEqual(True, runtime_watchos_2.available)
self.assertEqual(False, runtime_watchos_2.is_internal_runtime)
- self.assertEqual(tuple([2, 0]), runtime_watchos_2.version)
+ self.assertEqual(Version([2, 0]), runtime_watchos_2.version)
self.assertEqual(2, len(runtime_watchos_2.devices))
runtime_ios_10 = simulator.runtimes[5]
@@ -241,7 +242,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-10-0', runtime_ios_10.identifier)
self.assertEqual(True, runtime_ios_10.available)
self.assertEqual(False, runtime_ios_10.is_internal_runtime)
- self.assertEqual(tuple([10, 0]), runtime_ios_10.version)
+ self.assertEqual(Version([10, 0]), runtime_ios_10.version)
self.assertEqual(0, len(runtime_ios_10.devices))
device_apple_watch_38mm = runtime_watchos_2.devices[0]
@@ -315,7 +316,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0', runtime_ios_8.identifier)
self.assertEqual(True, runtime_ios_8.available)
self.assertEqual(False, runtime_ios_8.is_internal_runtime)
- self.assertEqual(tuple([8, 0]), runtime_ios_8.version)
+ self.assertEqual(Version([8, 0]), runtime_ios_8.version)
self.assertEqual(1, len(runtime_ios_8.devices))
device_iphone_4s = runtime_ios_8.devices[0]
@@ -328,7 +329,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0-Internal', runtime_ios_8_internal.identifier)
self.assertEqual(False, runtime_ios_8_internal.available)
self.assertEqual(True, runtime_ios_8_internal.is_internal_runtime)
- self.assertEqual(tuple([8, 0]), runtime_ios_8_internal.version)
+ self.assertEqual(Version([8, 0]), runtime_ios_8_internal.version)
self.assertEqual(0, len(runtime_ios_8_internal.devices))
def test_device_pairs(self):
@@ -356,7 +357,7 @@
self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0', runtime_ios_8.identifier)
self.assertEqual(True, runtime_ios_8.available)
self.assertEqual(False, runtime_ios_8.is_internal_runtime)
- self.assertEqual(tuple([8, 0]), runtime_ios_8.version)
+ self.assertEqual(Version([8, 0]), runtime_ios_8.version)
self.assertEqual(1, len(runtime_ios_8.devices))
device_iphone_4s = runtime_ios_8.devices[0]