Browse Source

Various mozbase backports

Ian Neal 3 months ago
parent
commit
10e9c69f15

+ 223 - 0
mozilla-release/patches/1190701-64a1.patch

@@ -0,0 +1,223 @@
+# HG changeset patch
+# User Edwin Gao <egao@mozilla.com>
+# Date 1538505578 0
+# Node ID 1c7f3cf86aed6b4476ffa66605f373b2ff74f960
+# Parent  3ee8f62f5081cc37725c7fdd59289f502a342ad5
+Bug 1190701 - make ADBAndroidMixin.is_app_installed() unambiguous r=bc,gbrown
+
+Behavior changes:
+- ADBAndroidMixin.is_app_installed() will now perform a strict check on `app_name` provided. Previously, the behavior was to do a fuzzy match, where as long as the provided `app_name` matched some item on the list it would return True. Now, the exact string as shown when user calls `adb shell > pm list packages` will be required in order to generate a True return value.
+
+Other changes:
+- bumped mozdevice version to 1.1.2 reflecting minor behavior change.
+- addition of unit tests for ADBAndroidMixin.is_app_installed() method call and surrounding helper methods such as mocked fixtures, manifest changes.
+
+Differential Revision: https://phabricator.services.mozilla.com/D7322
+
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb_android.py b/testing/mozbase/mozdevice/mozdevice/adb_android.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb_android.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb_android.py
+@@ -277,34 +277,32 @@ class ADBAndroid(ADBDevice):
+         data = self.command_output(cmd, timeout=timeout)
+         if data.find('Success') == -1:
+             raise ADBError("install failed for %s. Got: %s" %
+                            (apk_path, data))
+ 
+     def is_app_installed(self, app_name, timeout=None):
+         """Returns True if an app is installed on the device.
+ 
+-        :param str app_name: The name of the app to be checked.
+-        :param timeout: The maximum time in
+-            seconds for any spawned adb process to complete before
+-            throwing an ADBTimeoutError.
+-            This timeout is per adb call. The total time spent
+-            may exceed this value. If it is not specified, the value
+-            set in the ADB constructor is used.
+-        :type timeout: integer or None
++        :param str app_name: name of the app to be checked.
++        :param timeout: maximum time in seconds for any spawned
++            adb process to complete before throwing an ADBTimeoutError.
++            This timeout is per adb call. If it is not specified,
++            the value set in the ADB constructor is used.
++        :type timeout: integer or None
++
+         :raises: * ADBTimeoutError
+                  * ADBError
+         """
+         pm_error_string = 'Error: Could not access the Package Manager'
+         data = self.shell_output("pm list package %s" % app_name, timeout=timeout)
+         if pm_error_string in data:
+             raise ADBError(pm_error_string)
+-        if app_name not in data:
+-            return False
+-        return True
++        output = [line for line in data.splitlines() if line.strip()]
++        return any(['package:{}'.format(app_name) == out for out in output])
+ 
+     def launch_application(self, app_name, activity_name, intent, url=None,
+                            extras=None, wait=True, fail_if_running=True,
+                            timeout=None):
+         """Launches an Android application
+ 
+         :param str app_name: Name of application (e.g. `com.android.chrome`)
+         :param str activity_name: Name of activity to launch (e.g. `.Main`)
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.1.1'
++PACKAGE_VERSION = '1.1.2'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,
+diff --git a/testing/mozbase/mozdevice/tests/conftest.py.1190701.later b/testing/mozbase/mozdevice/tests/conftest.py.1190701.later
+new file mode 100644
+--- /dev/null
++++ b/testing/mozbase/mozdevice/tests/conftest.py.1190701.later
+@@ -0,0 +1,71 @@
++--- conftest.py
+++++ conftest.py
++@@ -22,17 +22,17 @@ def random_tcp_port():
++     return randint(8000, 12000)
++ 
++ 
++ @pytest.fixture(autouse=True)
++ def mock_command_output(monkeypatch):
++     """Monkeypatches the ADBDevice.command_output() method call.
++ 
++     Instead of calling the concrete method implemented in adb.py::ADBDevice,
++-    this method simply returns a string representaton of the command that was
+++    this method simply returns a string representation of the command that was
++     received.
++ 
++     :param object monkeypatch: pytest provided fixture for mocking.
++     """
++     def command_output_wrapper(object, cmd, timeout):
++         """Actual monkeypatch implementation of the comand_output method call.
++ 
++         :param object object: placeholder object representing ADBDevice
++@@ -43,16 +43,49 @@ def mock_command_output(monkeypatch):
++         print(str(cmd))
++         return str(cmd)
++ 
++     monkeypatch.setattr(mozdevice.ADBDevice,
++                         'command_output', command_output_wrapper)
++ 
++ 
++ @pytest.fixture(autouse=True)
+++def mock_shell_output(monkeypatch):
+++    """Monkeypatches the ADBDevice.shell_output() method call.
+++
+++    Instead of returning the output of an adb call, this method will
+++    return appropriate string output. Content of the string output is
+++    in line with the calling method's expectations.
+++
+++    :param object monkeypatch: pytest provided fixture for mocking.
+++    """
+++    def shell_output_wrapper(object, cmd, env=None, cwd=None, timeout=None, root=False):
+++        """Actual monkeypatch implementation of the shell_output method call.
+++
+++        :param object object: placeholder object representing ADBDevice
+++        :param str cmd: command to be executed
+++        :param env: contains the environment variable
+++        :type env: dict or None
+++        :param cwd: The directory from which to execute.
+++        :type cwd: str or None
+++        :param timeout: unused parameter tp represent timeout threshold
+++        :returns: string - string representation of a simulated call to adb
+++        """
+++        if 'pm list package error' in cmd:
+++            return 'Error: Could not access the Package Manager'
+++        elif 'pm list package none' in cmd:
+++            return ''
+++        elif 'pm list package' in cmd:
+++            apps = ["org.mozilla.fennec", "org.mozilla.geckoview_example"]
+++            return ('package:{}\n' * len(apps)).format(*apps)
+++
+++    monkeypatch.setattr(mozdevice.ADBDevice, 'shell_output', shell_output_wrapper)
+++
+++
+++@pytest.fixture(autouse=True)
++ def mock_adb_object():
++     """Patches the __init__ method call when instantiating ADBAndroid.
++ 
++     This is the key to test abstract methods implemented in ADBDevice.
++     ADBAndroid normally requires instantiated objects including but not
++     limited to ADBDevice in order to execute its commands.
++ 
++     With a pytest-mock patch, we are able to mock the initialization of
+diff --git a/testing/mozbase/mozdevice/tests/manifest.ini.1190701.later b/testing/mozbase/mozdevice/tests/manifest.ini.1190701.later
+new file mode 100644
+--- /dev/null
++++ b/testing/mozbase/mozdevice/tests/manifest.ini.1190701.later
+@@ -0,0 +1,8 @@
++--- manifest.ini
+++++ manifest.ini
++@@ -1,4 +1,5 @@
++ [DEFAULT]
++ subsuite = mozbase, os == "linux"
++ skip-if = python == 3
++ [test_socket_connection.py]
+++[test_is_app_installed.py]
+diff --git a/testing/mozbase/mozdevice/tests/test_is_app_installed.py b/testing/mozbase/mozdevice/tests/test_is_app_installed.py
+new file mode 100644
+--- /dev/null
++++ b/testing/mozbase/mozdevice/tests/test_is_app_installed.py
+@@ -0,0 +1,44 @@
++#!/usr/bin/env python
++
++from __future__ import absolute_import
++
++import pytest
++import mozunit
++
++from mozdevice import ADBError
++
++
++def test_is_app_installed(mock_adb_object):
++    """Tests that is_app_installed returns True if app is installed."""
++    assert mock_adb_object.is_app_installed(
++        'org.mozilla.geckoview_example')
++
++
++def test_is_app_installed_not_installed(mock_adb_object):
++    """Tests that is_app_installed returns False if provided app_name
++    does not resolve."""
++    assert not mock_adb_object.is_app_installed(
++        'some_random_name')
++
++
++def test_is_app_installed_partial_name(mock_adb_object):
++    """Tests that is_app_installed returns False if provided app_name
++    is only a partial match."""
++    assert not mock_adb_object.is_app_installed(
++        'fennec')
++
++
++def test_is_app_installed_package_manager_error(mock_adb_object):
++    """Tests that is_app_installed is able to raise an exception."""
++    with pytest.raises(ADBError):
++        mock_adb_object.is_app_installed('error')
++
++
++def test_is_app_installed_no_installed_package_found(mock_adb_object):
++    """Tests that is_app_installed is able to handle scenario
++    where no installed packages are found."""
++    assert not mock_adb_object.is_app_installed('none')
++
++
++if __name__ == '__main__':
++    mozunit.main()

+ 48 - 0
mozilla-release/patches/1428708-2-67a1.patch

@@ -0,0 +1,48 @@
+# HG changeset patch
+# User AndreiH <ahutusoru@mozilla.com>
+# Date 1549307996 0
+# Node ID baee8b94d34e3139d1cc22eae0c6da42053d0769
+# Parent  4e436ec5cf1489551140e7b5f1ecde73e3c4a364
+Bug 1428708 - [mozdevice] Bump version number and prepare for Python 3 release r=davehunt
+
+Differential Revision: https://phabricator.services.mozilla.com/D18553
+
+diff --git a/testing/mozbase/mozdevice/setup.cfg b/testing/mozbase/mozdevice/setup.cfg
+new file mode 100644
+--- /dev/null
++++ b/testing/mozbase/mozdevice/setup.cfg
+@@ -0,0 +1,2 @@
++[bdist_wheel]
++universal = 1
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,26 +3,26 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '2.0.1'
++PACKAGE_VERSION = '3.0.0'
+ 
+ deps = ['mozlog >= 3.0']
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Mozilla-authored device management",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       classifiers=['Programming Language :: Python :: 2.7',
+-                   'Programming Language :: Python :: 2 :: Only'],
++                   'Programming Language :: Python :: 3.5'],
+       # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+       keywords='',
+       author='Mozilla Automation and Testing Team',
+       author_email='tools@lists.mozilla.org',
+       url='https://wiki.mozilla.org/Auto-tools/Projects/Mozbase',
+       license='MPL',
+       packages=['mozdevice'],
+       include_package_data=True,

+ 40 - 0
mozilla-release/patches/1440714-13-61a1.patch

@@ -0,0 +1,40 @@
+# HG changeset patch
+# User Bob Clary <bclary@bclary.com>
+# Date 1523427149 25200
+# Node ID 7bdb7ce278c1ea4de5658f14ff3585b7bdedb0fb
+# Parent  de0b20d81f08817039307bfa704801a4f34ddbfd
+Bug 1440714 - make sure to use root=True when determining/creating test_root, r=gbrown
+
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -805,24 +805,25 @@ class ADBDevice(ADBCommand):
+             if attempt != max_attempts:
+                 time.sleep(20)
+ 
+         raise ADBError("Unable to set up test root using paths: [%s]"
+                        % ", ".join(paths))
+ 
+     def _try_test_root(self, test_root):
+         base_path, sub_path = posixpath.split(test_root)
+-        if not self.is_dir(base_path):
++        if not self.is_dir(base_path, root=True):
+             return False
+ 
+         try:
+             dummy_dir = posixpath.join(test_root, 'dummy')
+-            if self.is_dir(dummy_dir):
+-                self.rm(dummy_dir, recursive=True)
+-            self.mkdir(dummy_dir, parents=True)
++            if self.is_dir(dummy_dir, root=True):
++                self.rm(dummy_dir, recursive=True, root=True)
++            self.mkdir(dummy_dir, parents=True, root=True)
++            self.chmod(test_root, recursive=True, root=True)
+         except ADBError:
+             self._logger.debug("%s is not writable" % test_root)
+             return False
+ 
+         return True
+ 
+     # Host Command methods
+ 

+ 103 - 0
mozilla-release/patches/1482898-63a1.patch

@@ -0,0 +1,103 @@
+# HG changeset patch
+# User William Lachance <wlachance@mozilla.com>
+# Date 1534171872 14400
+# Node ID 6f69e808328401eba4d3984f5c755f82ebbcd631
+# Parent  983ebf8312a68c6eb2a10ac9c3e2f9a39ae1a51f
+Bug 1482898 - Support running adb commands in mozdevice as non-root;r=bc
+
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -134,34 +134,38 @@ class ADBCommand(object):
+     """
+ 
+     def __init__(self,
+                  adb='adb',
+                  adb_host=None,
+                  adb_port=None,
+                  logger_name='adb',
+                  timeout=300,
+-                 verbose=False):
++                 verbose=False,
++                 require_root=True):
+         """Initializes the ADBCommand object.
+ 
+         :param str adb: path to adb executable. Defaults to 'adb'.
+         :param adb_host: host of the adb server.
+         :type adb_host: str or None
+         :param adb_port: port of the adb server.
+         :type adb_port: integer or None
+         :param str logger_name: logging logger name. Defaults to 'adb'.
++        :param bool verbose: provide verbose output
++        :param bool require_root: check that we have root permissions on device
+ 
+         :raises: * ADBError
+                  * ADBTimeoutError
+         """
+         if self.__class__ == ADBCommand:
+             raise NotImplementedError
+ 
+         self._logger = self._get_logger(logger_name)
+         self._verbose = verbose
++        self._require_root = require_root
+         self._adb_path = adb
+         self._adb_host = adb_host
+         self._adb_port = adb_port
+         self._timeout = timeout
+         self._polling_interval = 0.1
+         self._adb_version = ''
+ 
+         self._logger.debug("%s: %s" % (self.__class__.__name__,
+@@ -805,25 +809,25 @@ class ADBDevice(ADBCommand):
+             if attempt != max_attempts:
+                 time.sleep(20)
+ 
+         raise ADBError("Unable to set up test root using paths: [%s]"
+                        % ", ".join(paths))
+ 
+     def _try_test_root(self, test_root):
+         base_path, sub_path = posixpath.split(test_root)
+-        if not self.is_dir(base_path, root=True):
++        if not self.is_dir(base_path, root=self._require_root):
+             return False
+ 
+         try:
+             dummy_dir = posixpath.join(test_root, 'dummy')
+-            if self.is_dir(dummy_dir, root=True):
+-                self.rm(dummy_dir, recursive=True, root=True)
+-            self.mkdir(dummy_dir, parents=True, root=True)
+-            self.chmod(test_root, recursive=True, root=True)
++            if self.is_dir(dummy_dir, root=self._require_root):
++                self.rm(dummy_dir, recursive=True, root=self._require_root)
++            self.mkdir(dummy_dir, parents=True, root=self._require_root)
++            self.chmod(test_root, recursive=True, root=self._require_root)
+         except ADBError:
+             self._logger.debug("%s is not writable" % test_root)
+             return False
+ 
+         return True
+ 
+     # Host Command methods
+ 
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.0.0'
++PACKAGE_VERSION = '1.0.1'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,

+ 257 - 0
mozilla-release/patches/1484238-64a1.patch

@@ -0,0 +1,257 @@
+# HG changeset patch
+# User egao <egao@mozilla.com>
+# Date 1536070542 0
+# Node ID 1ea388fd649a82bde842f39f47c99f6c4efd3848
+# Parent  5800f04e622d308d2b2829995a07f5311c1dcd5b
+Bug 1484238 - Add an 'adb_reverse' command to mozdevice.ADBAndroid r=gbrown,bc
+
+Differential Revision: https://phabricator.services.mozilla.com/D4775
+
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -509,16 +509,19 @@ class ADBHost(ADBCommand):
+ class ADBDevice(ADBCommand):
+     """ADBDevice is an abstract base class which provides methods which
+     can be used to interact with the associated Android or B2G based
+     device. It must be used via one of the concrete implementations in
+     :class:`ADBAndroid` or :class:`ADBB2G`.
+     """
+     __metaclass__ = ABCMeta
+ 
++    SOCKET_DIRECTON_REVERSE = "reverse"
++    SOCKET_DIRECTON_FORWARD = "forward"
++
+     def __init__(self,
+                  device=None,
+                  adb='adb',
+                  adb_host=None,
+                  adb_port=None,
+                  test_root='',
+                  logger_name='adb',
+                  timeout=300,
+@@ -885,105 +888,171 @@ class ADBDevice(ADBCommand):
+ 
+         :raises: * ADBTimeoutError
+                  * ADBError
+         """
+         return ADBCommand.command_output(self, cmds,
+                                          device_serial=self._device_serial,
+                                          timeout=timeout)
+ 
+-    # Port forwarding methods
++    # Networking methods
+ 
+     def _validate_port(self, port, is_local=True):
+         """Validate a port forwarding specifier. Raises ValueError on failure.
+ 
+         :param str port: The port specifier to validate
+         :param bool is_local: Flag indicating whether the port represents a local port.
+         """
+         prefixes = ["tcp", "localabstract", "localreserved", "localfilesystem", "dev"]
+ 
+         if not is_local:
+             prefixes += ["jdwp"]
+ 
+         parts = port.split(":", 1)
+         if len(parts) != 2 or parts[0] not in prefixes:
+-            raise ValueError("Invalid forward specifier %s" % port)
+-
+-    def forward(self, local, remote, allow_rebind=True, timeout=None):
+-        """Forward a local port to a specific port on the device.
+-
+-        Ports are specified in the form:
+-            tcp:<port>
+-            localabstract:<unix domain socket name>
+-            localreserved:<unix domain socket name>
+-            localfilesystem:<unix domain socket name>
+-            dev:<character device name>
+-            jdwp:<process pid> (remote only)
+-
+-        :param str local: Local port to forward
+-        :param str remote: Remote port to which to forward
+-        :param bool allow_rebind: Don't error if the local port is already forwarded
++            raise ValueError("Invalid port specifier %s" % port)
++
++    def _validate_direction(self, direction):
++        """Validate direction of the socket connection. Raises ValueError on failure.
++
++        :param str direction: The socket direction specifier to validate
++        :raises: * ValueError
++        """
++        if direction not in [self.SOCKET_DIRECTON_FORWARD, self.SOCKET_DIRECTON_REVERSE]:
++            raise ValueError('Invalid direction specifier {}'.format(direction))
++
++    def create_socket_connection(self, direction, local, remote, allow_rebind=True, timeout=None):
++        """Sets up a socket connection in the specified direction.
++
++        :param str direction: Direction of the socket connection
++        :param str local: Local port
++        :param str remote: Remote port
++        :param bool allow_rebind: Do not fail if port is already bound
+         :param timeout: The maximum time in seconds
+             for any spawned adb process to complete before throwing
+             an ADBTimeoutError. If it is not specified, the value
+             set in the ADBDevice constructor is used.
+         :type timeout: integer or None
+         :raises: * ValueError
+                  * ADBTimeoutError
+                  * ADBError
+         """
+-
++        # validate socket direction, and local and remote port formatting.
++        self._validate_direction(direction)
+         for port, is_local in [(local, True), (remote, False)]:
+             self._validate_port(port, is_local=is_local)
+ 
+-        cmd = ["forward", local, remote]
++        cmd = [direction, local, remote]
++
+         if not allow_rebind:
+             cmd.insert(1, "--no-rebind")
++
++        # execute commands to establish socket connection.
+         self.command_output(cmd, timeout=timeout)
+ 
+-    def list_forwards(self, timeout=None):
+-        """Return a list of tuples specifying active forwards
++    def list_socket_connections(self, direction, timeout=None):
++        """Return a list of tuples specifying active socket connectionss.
+ 
+         Return values are of the form (device, local, remote).
+ 
++        :param str direction: 'forward' to list forward socket connections
++                              'reverse' to list reverse socket connections
+         :param timeout: The maximum time in seconds
+             for any spawned adb process to complete before throwing
+             an ADBTimeoutError. If it is not specified, the value
+             set in the ADBDevice constructor is used.
+         :type timeout: integer or None
+-        :raises: * ADBTimeoutError
+-                 * ADBError
+-        """
+-        forwards = self.command_output(["forward", "--list"], timeout=timeout)
+-        return [tuple(line.split(" ")) for line in forwards.splitlines() if line.strip()]
+-
+-    def remove_forwards(self, local=None, timeout=None):
+-        """Remove existing port forwards.
+-
++        :raises: * ValueError
++                 * ADBTimeoutError
++                 * ADBError
++        """
++        self._validate_direction(direction)
++
++        cmd = [direction, "--list"]
++        output = self.command_output(cmd, timeout=timeout)
++        return [tuple(line.split(" ")) for line in output.splitlines() if line.strip()]
++
++    def remove_socket_connections(self, direction, local=None, timeout=None):
++        """Remove existing socket connections for a given direction.
++
++        :param str direction: 'forward' to remove forward socket connection
++                              'reverse' to remove reverse socket connection
+         :param local: local port specifier as for ADBDevice.forward. If local
+             is not specified removes all forwards.
+         :type local: str or None
+         :param timeout: The maximum time in seconds
+             for any spawned adb process to complete before throwing
+             an ADBTimeoutError. If it is not specified, the value
+             set in the ADBDevice constructor is used.
+         :type timeout: integer or None
+         :raises: * ValueError
+                  * ADBTimeoutError
+                  * ADBError
+         """
+-        cmd = ["forward"]
++        self._validate_direction(direction)
++
++        cmd = [direction]
++
+         if local is None:
+             cmd.extend(["--remove-all"])
+         else:
+             self._validate_port(local, is_local=True)
+             cmd.extend(["--remove", local])
+ 
+         self.command_output(cmd, timeout=timeout)
+ 
++    # Legacy port forward methods
++
++    def forward(self, local, remote, allow_rebind=True, timeout=None):
++        """Forward a local port to a specific port on the device.
++
++        See `ADBDevice.create_socket_connection`.
++        """
++        self.create_socket_connection(self.SOCKET_DIRECTON_FORWARD,
++                                      local, remote, allow_rebind, timeout)
++
++    def list_forwards(self, timeout=None):
++        """Return a list of tuples specifying active forwards.
++
++        See `ADBDevice.list_socket_connection`.
++        """
++        return self.list_socket_connections(self.SOCKET_DIRECTON_FORWARD, timeout)
++
++    def remove_forwards(self, local=None, timeout=None):
++        """Remove existing port forwards.
++
++        See `ADBDevice.remove_socket_connection`.
++        """
++        self.remove_socket_connections(self.SOCKET_DIRECTON_FORWARD, local, timeout)
++
++    # Legacy port reverse methods
++
++    def reverse(self, local, remote, allow_rebind=True, timeout=None):
++        """Sets up a reverse socket connection from device to host.
++
++        See `ADBDevice.create_socket_connection`.
++        """
++        self.create_socket_connection(self.SOCKET_DIRECTON_REVERSE,
++                                      local, remote, allow_rebind, timeout)
++
++    def list_reverses(self, timeout=None):
++        """Returns a list of tuples showing active reverse socket connections.
++
++        See `ADBDevice.list_socket_connection`.
++        """
++        return self.list_socket_connections(self.SOCKET_DIRECTON_REVERSE, timeout)
++
++    def remove_reverses(self, local=None, timeout=None):
++        """Remove existing reverse socket connections.
++
++        See `ADBDevice.remove_socket_connection`.
++        """
++        self.remove_socket_connections(self.SOCKET_DIRECTON_REVERSE,
++                                       local, timeout)
++
+     # Device Shell methods
+ 
+     def shell(self, cmd, env=None, cwd=None, timeout=None, root=False):
+         """Executes a shell command on the device.
+ 
+         :param str cmd: The command to be executed.
+         :param env: Contains the environment variables and
+             their values.
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.1.0'
++PACKAGE_VERSION = '1.1.1'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,

+ 29 - 0
mozilla-release/patches/1487130-63a1.patch

@@ -0,0 +1,29 @@
+# HG changeset patch
+# User Bob Clary <bclary@bclary.com>
+# Date 1535565472 25200
+# Node ID 1a993af26c1335241575bf3235934570bd23bc0c
+# Parent  a433f0c5c042e10d8d0917503186d85fb33f4b25
+Bug 1487130 - [mozdevice] Update version to 1.1.0, r=wlach
+
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.0.1'
++PACKAGE_VERSION = '1.1.0'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,

+ 23 - 0
mozilla-release/patches/1488468-1-64a1.patch

@@ -0,0 +1,23 @@
+# HG changeset patch
+# User Raphael Pierzina <rpierzina@mozilla.com>
+# Date 1538767005 0
+# Node ID 246160f26d969af6073958114941e033dcb8c638
+# Parent  efc30f31d9ef3d95b78a956eadb7c23994de8fc7
+Bug 1488468 - Bump wptserve in marionette_requirements.txt to 2.0.0; r=davehunt
+
+Differential Revision: https://phabricator.services.mozilla.com/D7902
+
+diff --git a/testing/marionette/harness/requirements.txt b/testing/marionette/harness/requirements.txt
+--- a/testing/marionette/harness/requirements.txt
++++ b/testing/marionette/harness/requirements.txt
+@@ -7,9 +7,9 @@ mozinfo >= 0.8
+ mozlog >= 3.0
+ moznetwork >= 0.21
+ mozprocess >= 0.9
+ mozprofile >= 0.7
+ mozrunner >= 7.0.1
+ moztest >= 0.8
+ mozversion >= 1.1
+ six
+-wptserve >= 1.3.0
++wptserve >= 2.0.0

+ 57 - 0
mozilla-release/patches/1499102-64a1.patch

@@ -0,0 +1,57 @@
+# HG changeset patch
+# User Bob Clary <bclary@bclary.com>
+# Date 1539662580 25200
+# Node ID 24d8d0ea578a8d683794237561a825abe8b1d32e
+# Parent  f30059f3b8028de26d36d4ac9304bae7e4d20937
+Bug 1499102 - [mozdevice] Allow HOST:PORT as device serial number, bump mozdevice to version 1.1.3, r=gbrown.
+
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -655,18 +655,23 @@ class ADBDevice(ADBCommand):
+                 raise ValueError("ADBDevice called with multiple devices "
+                                  "attached and no device specified")
+             elif len(devices) == 0:
+                 # We could error here, but this way we'll wait-for-device before we next
+                 # run a command, which seems more friendly
+                 return
+             device = devices[0]
+ 
++        # Allow : in device serial if it matches a tcpip device serial.
++        re_device_serial_tcpip = re.compile(r'[^:]+:[0-9]+$')
++
+         def is_valid_serial(serial):
+-            return ":" not in serial or serial.startswith("usb:")
++            return serial.startswith("usb:") or \
++                re_device_serial_tcpip.match(serial) is not None or \
++                ":" not in serial
+ 
+         if isinstance(device, (str, unicode)):
+             # Treat this as a device serial
+             if not is_valid_serial(device):
+                 raise ValueError("Device serials containing ':' characters are "
+                                  "invalid. Pass the output from "
+                                  "ADBHost.devices() for the device instead")
+             return device
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.1.2'
++PACKAGE_VERSION = '1.1.3'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,

+ 29 - 0
mozilla-release/patches/1502190-2-65a1.patch

@@ -0,0 +1,29 @@
+# HG changeset patch
+# User Bob Clary <bclary@bclary.com>
+# Date 1540572697 25200
+# Node ID dec76ef6d620d436cc618324dbff32196eb4d5a6
+# Parent  f741259071982f3ce8b49dc08029aa68cf2934f9
+Bug 1502190 - release mozdevice 1.1.5, r=gbrown.
+
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.1.3'
++PACKAGE_VERSION = '1.1.5'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,

+ 29 - 0
mozilla-release/patches/1504117-2-65a1.patch

@@ -0,0 +1,29 @@
+# HG changeset patch
+# User Bob Clary <bclary@bclary.com>
+# Date 1541169773 25200
+# Node ID 9a7adcaed611db0b494d77f3f235ef8d273f40a6
+# Parent  631000de70272e7052db47459fa6a5b12af1b377
+Bug 1504117 - [mozdevice] Release mozdevice 1.1.6, r=gbrown.
+
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.1.5'
++PACKAGE_VERSION = '1.1.6'
+ 
+ deps = ['mozfile >= 1.0',
+         'mozlog >= 3.0',
+         'moznetwork >= 0.24',
+         'mozprocess >= 0.19',
+         ]
+ 
+ setup(name=PACKAGE_NAME,

+ 260 - 0
mozilla-release/patches/1506385-65a1.patch

@@ -0,0 +1,260 @@
+# HG changeset patch
+# User William Lachance <wlachance@mozilla.com>
+# Date 1541881028 0
+# Node ID e93794d169f164f424c591f248a5aa657b7adfb7
+# Parent  c4075a2c6e9f854cd640af0027e43bb11860a8cd
+Summary: Bug 1506385 - Remove b2g support and unnecessary dependencies from mozdevice r=bc
+
+Differential Revision: https://phabricator.services.mozilla.com/D11564
+
+diff --git a/testing/mozbase/docs/mozdevice.rst.1506385.later b/testing/mozbase/docs/mozdevice.rst.1506385.later
+new file mode 100644
+--- /dev/null
++++ b/testing/mozbase/docs/mozdevice.rst.1506385.later
+@@ -0,0 +1,45 @@
++--- mozdevice.rst
+++++ mozdevice.rst
++@@ -1,12 +1,12 @@
++-:mod:`mozdevice` --- Interact with Android or B2G devices
++-=========================================================
+++:mod:`mozdevice` --- Interact with Android devices
+++==================================================
++ 
++-Mozdevice provides several interfaces to interact with an Android or B2G
+++Mozdevice provides several interfaces to interact with an Android
++ device such as a phone, tablet, or emulator. It allows you to push
++ files to these types of devices, launch processes, and more. There are
++ currently two available interfaces:
++ 
++ * :ref:`ADB`: Uses the Android Debugger Protocol explicitly
++ 
++ .. automodule:: mozdevice
++ 
++@@ -111,26 +111,16 @@ Application management methods
++ .. automethod:: ADBAndroid.is_app_installed
++ .. automethod:: ADBAndroid.launch_application
++ .. automethod:: ADBAndroid.launch_fennec
++ .. automethod:: ADBAndroid.launch_geckoview_example
++ .. automethod:: ADBAndroid.stop_application
++ .. automethod:: ADBAndroid.uninstall_app
++ .. automethod:: ADBAndroid.update_app
++ 
++-ADBB2G
++-``````
++-.. autoclass:: ADBB2G
++-
++-Informational methods
++-+++++++++++++++++++++
++-.. automethod:: ADBB2G.get_battery_percentage
++-.. automethod:: ADBB2G.get_info
++-.. automethod:: ADBB2G.get_memory_total
++-
++ ADBProcess
++ ``````````
++ .. autoclass:: mozdevice.ADBProcess
++ 
++ ADBError
++ ````````
++ .. autoexception:: mozdevice.ADBError
++ 
+diff --git a/testing/mozbase/mozdevice/mozdevice/__init__.py b/testing/mozbase/mozdevice/mozdevice/__init__.py
+--- a/testing/mozbase/mozdevice/mozdevice/__init__.py
++++ b/testing/mozbase/mozdevice/mozdevice/__init__.py
+@@ -2,12 +2,11 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from .adb import ADBError, ADBProcessError, ADBRootError, ADBTimeoutError
+ from .adb import ADBProcess, ADBCommand, ADBHost, ADBDevice
+ from .adb_android import ADBAndroid
+-from .adb_b2g import ADBB2G
+ 
+ __all__ = ['ADBError', 'ADBProcessError', 'ADBRootError', 'ADBTimeoutError',
+-           'ADBProcess', 'ADBCommand', 'ADBHost', 'ADBDevice', 'ADBAndroid', 'ADBB2G']
++           'ADBProcess', 'ADBCommand', 'ADBHost', 'ADBDevice', 'ADBAndroid']
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -503,19 +503,19 @@ class ADBHost(ADBCommand):
+                     "\n# adb kill-server\n# adb start-server\n"
+                     "\nor maybe configure your udev rules.",
+                     devices)
+         return devices
+ 
+ 
+ class ADBDevice(ADBCommand):
+     """ADBDevice is an abstract base class which provides methods which
+-    can be used to interact with the associated Android or B2G based
+-    device. It must be used via one of the concrete implementations in
+-    :class:`ADBAndroid` or :class:`ADBB2G`.
++    can be used to interact with the associated Android-based
++    device. It must be used via the concrete implementation in
++    :class:`ADBAndroid`.
+     """
+     __metaclass__ = ABCMeta
+ 
+     SOCKET_DIRECTON_REVERSE = "reverse"
+     SOCKET_DIRECTON_FORWARD = "forward"
+ 
+     def __init__(self,
+                  device=None,
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb_b2g.py b/testing/mozbase/mozdevice/mozdevice/adb_b2g.py
+deleted file mode 100644
+--- a/testing/mozbase/mozdevice/mozdevice/adb_b2g.py
++++ /dev/null
+@@ -1,124 +0,0 @@
+-# This Source Code Form is subject to the terms of the Mozilla Public
+-# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+-# You can obtain one at http://mozilla.org/MPL/2.0/.
+-
+-from __future__ import absolute_import
+-
+-import traceback
+-
+-import mozfile
+-
+-from .adb import ADBDevice, ADBError
+-
+-
+-class ADBB2G(ADBDevice):
+-    """ADBB2G implements :class:`ADBDevice` providing B2G-specific
+-    functionality.
+-
+-    ::
+-
+-       from mozdevice import ADBB2G
+-
+-       adbdevice = ADBB2G()
+-       print adbdevice.list_files("/mnt/sdcard")
+-       if adbdevice.process_exist("b2g"):
+-           print "B2G is running"
+-    """
+-
+-    def get_battery_percentage(self, timeout=None):
+-        """Returns the battery charge as a percentage.
+-
+-        :param timeout: optional integer specifying the maximum time in
+-            seconds for any spawned adb process to complete before
+-            throwing an ADBTimeoutError.
+-            This timeout is per adb call. The total time spent
+-            may exceed this value. If it is not specified, the value
+-            set in the ADBDevice constructor is used.
+-        :returns: battery charge as a percentage.
+-        :raises: * ADBTimeoutError
+-                 * ADBError
+-        """
+-        with mozfile.NamedTemporaryFile() as tf:
+-            self.pull('/sys/class/power_supply/battery/capacity', tf.name,
+-                      timeout=timeout)
+-            try:
+-                with open(tf.name) as tf2:
+-                    return tf2.read().splitlines()[0]
+-            except Exception as e:
+-                raise ADBError(traceback.format_exception_only(
+-                    type(e), e)[0].strip())
+-
+-    def get_memory_total(self, timeout=None):
+-        """Returns the total memory available with units.
+-
+-        :param timeout: optional integer specifying the maximum time in
+-            seconds for any spawned adb process to complete before
+-            throwing an ADBTimeoutError.
+-            This timeout is per adb call. The total time spent
+-            may exceed this value. If it is not specified, the value
+-            set in the ADBDevice constructor is used.
+-        :returns: memory total with units.
+-        :raises: * ADBTimeoutError
+-                 * ADBError
+-        """
+-        meminfo = {}
+-        with mozfile.NamedTemporaryFile() as tf:
+-            self.pull('/proc/meminfo', tf.name, timeout=timeout)
+-            try:
+-                with open(tf.name) as tf2:
+-                    for line in tf2.read().splitlines():
+-                        key, value = line.split(':')
+-                        meminfo[key] = value.strip()
+-            except Exception as e:
+-                raise ADBError(traceback.format_exception_only(
+-                    type(e), e)[0].strip())
+-        return meminfo['MemTotal']
+-
+-    def get_info(self, directive=None, timeout=None):
+-        """
+-        Returns a dictionary of information strings about the device.
+-
+-        :param directive: information you want to get. Options are:
+-             - `battery` - battery charge as a percentage
+-             - `disk` - total, free, available bytes on disk
+-             - `id` - unique id of the device
+-             - `memtotal` - total memory available on the device
+-             - `os` - name of the os
+-             - `process` - list of running processes (same as ps)
+-             - `systime` - system time of the device
+-             - `uptime` - uptime of the device
+-
+-            If `directive` is `None`, will return all available information
+-        :param timeout: optional integer specifying the maximum time in
+-            seconds for any spawned adb process to complete before
+-            throwing an ADBTimeoutError.
+-            This timeout is per adb call. The total time spent
+-            may exceed this value. If it is not specified, the value
+-            set in the ADB constructor is used.
+-        :raises: * ADBTimeoutError
+-                 * ADBError
+-        """
+-        info = super(ADBB2G, self).get_info(directive=directive,
+-                                            timeout=timeout)
+-
+-        directives = ['memtotal']
+-        if directive in directives:
+-            directives = [directive]
+-
+-        if 'memtotal' in directives:
+-            info['memtotal'] = self.get_memory_total(timeout=timeout)
+-        return info
+-
+-    def is_device_ready(self, timeout=None):
+-        """Returns True if the device is ready.
+-
+-        :param timeout: optional integer specifying the maximum time in
+-            seconds for any spawned adb process to complete before
+-            throwing an ADBTimeoutError.
+-            This timeout is per adb call. The total time spent
+-            may exceed this value. If it is not specified, the value
+-            set in the ADB constructor is used.
+-        :raises: * ADBTimeoutError
+-                 * ADBError
+-        """
+-        return self.shell_bool('ls /sbin', timeout=timeout)
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,23 +3,19 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '1.1.6'
++PACKAGE_VERSION = '2.0'
+ 
+-deps = ['mozfile >= 1.0',
+-        'mozlog >= 3.0',
+-        'moznetwork >= 0.24',
+-        'mozprocess >= 0.19',
+-        ]
++deps = ['mozlog >= 3.0']
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Mozilla-authored device management",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       classifiers=['Programming Language :: Python :: 2.7',
+                    'Programming Language :: Python :: 2 :: Only'],
+       # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers

+ 56 - 0
mozilla-release/patches/1524150-67a1.patch

@@ -0,0 +1,56 @@
+# HG changeset patch
+# User Bob Clary <bclary@bclary.com>
+# Date 1548995756 28800
+# Node ID 3feead6581fcbfdcd9e82e0c2efc978486268dc9
+# Parent  12113fa42f1930accb3f550955acb5f1c7d9a685
+Bug 1524150 - [mozdevice] remove -s <serialno> from ADBProcess-based error messages, r=gbrown.
+
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -40,18 +40,22 @@ class ADBProcess(object):
+         if not self.stdout_file or self.stdout_file.closed:
+             content = ""
+         else:
+             self.stdout_file.seek(0, os.SEEK_SET)
+             content = self.stdout_file.read().rstrip()
+         return content
+ 
+     def __str__(self):
++        # Remove -s <serialno> from the error message to allow bug suggestions
++        # to be independent of the individual failing device.
++        arg_string = ' '.join(self.args)
++        arg_string = re.sub(' -s \w+', '', arg_string)
+         return ('args: %s, exitcode: %s, stdout: %s' % (
+-            ' '.join(self.args), self.exitcode, self.stdout))
++            arg_string, self.exitcode, self.stdout))
+ 
+ # ADBError, ADBRootError, and ADBTimeoutError are treated
+ # differently in order that unhandled ADBRootErrors and
+ # ADBTimeoutErrors can be handled distinctly from ADBErrors.
+ 
+ 
+ class ADBError(Exception):
+     """ADBError is raised in situations where a command executed on a
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '2.0'
++PACKAGE_VERSION = '2.0.1'
+ 
+ deps = ['mozlog >= 3.0']
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Mozilla-authored device management",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       classifiers=['Programming Language :: Python :: 2.7',

+ 41 - 0
mozilla-release/patches/1524961-68a1.patch

@@ -0,0 +1,41 @@
+# HG changeset patch
+# User pgadige <poojagadige@gmail.com>
+# Date 1552993164 0
+# Node ID 333566a1cbc842ba8e99b798ba9eea6a2a98d3dc
+# Parent  daff668fb7423e84836e74ba0211e93f9a2de5ce
+Bug 1524961 - Update mozlog's license to MPL 2.0. r=raphael
+
+Differential Revision: https://phabricator.services.mozilla.com/D23407
+
+diff --git a/testing/mozbase/mozlog/setup.py b/testing/mozbase/mozlog/setup.py
+--- a/testing/mozbase/mozlog/setup.py
++++ b/testing/mozbase/mozlog/setup.py
+@@ -17,26 +17,26 @@ DEPS = [
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Robust log handling specialized for logging in the Mozilla universe",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       author='Mozilla Automation and Testing Team',
+       author_email='tools@lists.mozilla.org',
+       url='https://wiki.mozilla.org/Auto-tools/Projects/Mozbase',
+-      license='MPL 1.1/GPL 2.0/LGPL 2.1',
++      license='Mozilla Public License 2.0 (MPL 2.0)',
+       packages=find_packages(),
+       zip_safe=False,
+       install_requires=DEPS,
+       tests_require=['mozfile'],
+       platforms=['Any'],
+       classifiers=['Development Status :: 4 - Beta',
+                    'Environment :: Console',
+                    'Intended Audience :: Developers',
+-                   'License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)',
++                   'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
+                    'Operating System :: OS Independent',
+                    'Programming Language :: Python :: 2.7',
+                    'Programming Language :: Python :: 3.5',
+                    'Topic :: Software Development :: Libraries :: Python Modules'],
+       package_data={"mozlog": ["formatters/html/main.js",
+                                "formatters/html/style.css"]},
+       entry_points={
+           "console_scripts": [

+ 31 - 0
mozilla-release/patches/1526990-67a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User James Graham <james@hoppipolla.co.uk>
+# Date 1549922349 0
+# Node ID 3cd02dd2d56fb9324363483768b4f0503988fe20
+# Parent  daff668fb7423e84836e74ba0211e93f9a2de5ce
+Bug 1526990 - Bump mozprofile to 2.2, r=davehunt
+
+Differential Revision: https://phabricator.services.mozilla.com/D19374
+
+diff --git a/testing/mozbase/mozprofile/setup.py b/testing/mozbase/mozprofile/setup.py
+--- a/testing/mozbase/mozprofile/setup.py
++++ b/testing/mozbase/mozprofile/setup.py
+@@ -2,17 +2,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozprofile'
+-PACKAGE_VERSION = '2.1.0'
++PACKAGE_VERSION = '2.2.0'
+ 
+ deps = [
+     'mozfile>=1.2',
+     'mozlog~=4.0',
+     'six>=1.10.0,<2',
+ ]
+ 
+ setup(name=PACKAGE_NAME,

+ 119 - 0
mozilla-release/patches/1527610-69a1.patch

@@ -0,0 +1,119 @@
+# HG changeset patch
+# User Nikki S <nikkisharpley@gmail.com>
+# Date 1558451060 0
+# Node ID 2180deaa2c68afd96ad39b6a0cba9c3d45a49c62
+# Parent  a628fd0d5d52e65e644e635e5ffc5002a9b1cce0
+Bug 1527610 - [mozlog] Library fails after python 3 update; TypeError: vars() argument must have _dict_ attribute r=ahal
+
+Updated from Differential D20458.
+
+Differential Revision: https://phabricator.services.mozilla.com/D30719
+
+diff --git a/testing/mozbase/mozlog/mozlog/commandline.py b/testing/mozbase/mozlog/mozlog/commandline.py
+--- a/testing/mozbase/mozlog/mozlog/commandline.py
++++ b/testing/mozbase/mozlog/mozlog/commandline.py
+@@ -254,17 +254,17 @@ def setup_logging(logger, args, defaults
+     # Keep track of any options passed for formatters.
+     formatter_options = {}
+     # Keep track of formatters and list of streams specified.
+     formatters = defaultdict(list)
+     found = False
+     found_stdout_logger = False
+     if args is None:
+         args = {}
+-    if not hasattr(args, 'iteritems'):
++    if not isinstance(args, dict):
+         args = vars(args)
+ 
+     if defaults is None:
+         if sys.__stdout__.isatty():
+             defaults = {"mach": sys.stdout}
+         else:
+             defaults = {"raw": sys.stdout}
+ 
+diff --git a/testing/mozbase/mozlog/setup.py b/testing/mozbase/mozlog/setup.py
+--- a/testing/mozbase/mozlog/setup.py
++++ b/testing/mozbase/mozlog/setup.py
+@@ -2,17 +2,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup, find_packages
+ 
+ PACKAGE_NAME = 'mozlog'
+-PACKAGE_VERSION = '4.1'
++PACKAGE_VERSION = '4.1.1'
+ DEPS = [
+     'blessings>=1.3',
+     'mozterm',
+     'six >= 1.10.0',
+ ]
+ 
+ 
+ setup(name=PACKAGE_NAME,
+diff --git a/testing/mozbase/mozprofile/setup.py b/testing/mozbase/mozprofile/setup.py
+--- a/testing/mozbase/mozprofile/setup.py
++++ b/testing/mozbase/mozprofile/setup.py
+@@ -6,17 +6,17 @@ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozprofile'
+ PACKAGE_VERSION = '2.2.0'
+ 
+ deps = [
+     'mozfile>=1.2',
+-    'mozlog~=4.1',
++    'mozlog~=4.1.1',
+     'six>=1.10.0,<2',
+ ]
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Library to create and modify Mozilla application profiles",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       classifiers=['Environment :: Console',
+diff --git a/testing/mozbase/mozrunner/setup.py b/testing/mozbase/mozrunner/setup.py
+--- a/testing/mozbase/mozrunner/setup.py
++++ b/testing/mozbase/mozrunner/setup.py
+@@ -10,17 +10,17 @@ PACKAGE_NAME = 'mozrunner'
+ PACKAGE_VERSION = '7.4.0'
+ 
+ desc = """Reliable start/stop/configuration of Mozilla Applications (Firefox, Thunderbird, etc.)"""
+ 
+ deps = [
+     'mozdevice>=3.0.1',
+     'mozfile>=1.2',
+     'mozinfo>=0.7,<2',
+-    'mozlog~=4.1',
++    'mozlog~=4.1.1',
+     'mozprocess>=0.23,<2',
+     'mozprofile~=2.1',
+     'six>=1.10.0,<2',
+ ]
+ 
+ EXTRAS_REQUIRE = {'crash': ['mozcrash >= 1.0']}
+ 
+ setup(name=PACKAGE_NAME,
+diff --git a/testing/mozbase/mozversion/setup.py b/testing/mozbase/mozversion/setup.py
+--- a/testing/mozbase/mozversion/setup.py
++++ b/testing/mozbase/mozversion/setup.py
+@@ -18,15 +18,15 @@ setup(name='mozversion',
+       keywords='mozilla',
+       author='Mozilla Automation and Testing Team',
+       author_email='tools@lists.mozilla.org',
+       url='https://wiki.mozilla.org/Auto-tools/Projects/Mozbase',
+       license='MPL',
+       packages=['mozversion'],
+       include_package_data=True,
+       zip_safe=False,
+-      install_requires=['mozlog ~= 4.1',
++      install_requires=['mozlog ~= 4.1.1',
+                         'six >= 1.10.0'],
+       entry_points="""
+       # -*- Entry points: -*-
+       [console_scripts]
+       mozversion = mozversion:cli
+       """)

+ 50 - 0
mozilla-release/patches/1530794-1-67a1.patch

@@ -0,0 +1,50 @@
+# HG changeset patch
+# User Henrik Skupin <mail@hskupin.info>
+# Date 1551876650 0
+# Node ID 0826fd0e4d5cee9eac59a2de557bf1b0cbfdb1c2
+# Parent  984b39dbd00429f68dfb969346caab145292b66c
+Bug 1530794 - [marionette] Bump requirements for Python 3 compatibility. r=ato
+
+Nearly all dependencies except moznetwork and moztest already
+support Python3. Lets make those releases the minimum allowed
+version.
+
+Differential Revision: https://phabricator.services.mozilla.com/D22105
+
+diff --git a/testing/marionette/client/requirements.txt b/testing/marionette/client/requirements.txt
+--- a/testing/marionette/client/requirements.txt
++++ b/testing/marionette/client/requirements.txt
+@@ -1,3 +1,3 @@
+-mozrunner >= 7.0.1
+-mozversion >= 1.1
++mozrunner >= 7.4.0
++mozversion >= 2.1.0
+ six
+diff --git a/testing/marionette/harness/requirements.txt b/testing/marionette/harness/requirements.txt
+--- a/testing/marionette/harness/requirements.txt
++++ b/testing/marionette/harness/requirements.txt
+@@ -1,15 +1,15 @@
+ browsermob-proxy >= 0.6.0
+ manifestparser >= 1.1
+ marionette-driver >= 2.7.0
+-mozcrash >= 0.5
+-mozdevice >= 1.1.6
+-mozinfo >= 0.8
+-mozlog >= 3.0
+-moznetwork >= 0.21
+-mozprocess >= 0.9
+-mozprofile >= 0.7
+-mozrunner >= 7.0.1
++mozcrash >= 1.1.0
++mozdevice >= 3.0.0
++mozinfo >= 1.0.0
++mozlog >= 4.0
++moznetwork >= 0.27
++mozprocess >= 1.0.0
++mozprofile >= 2.2.0
++mozrunner >= 7.4.0
+ moztest >= 0.8
+-mozversion >= 1.1
++mozversion >= 2.1.0
+ six
+ wptserve >= 2.0.0

+ 67 - 0
mozilla-release/patches/1530794-2-67a1.patch

@@ -0,0 +1,67 @@
+# HG changeset patch
+# User Henrik Skupin <mail@hskupin.info>
+# Date 1551876652 0
+# Node ID bfa18558c4e7caf378e7e6c62534565422304414
+# Parent  094e60f560dd1accc76c6c3caa7a748c04249660
+Bug 1530794 - Release marionette_driver 2.8.0 and marionette_harness 4.6.0. r=ato
+
+Depends on D22105
+
+Differential Revision: https://phabricator.services.mozilla.com/D22106
+
+diff --git a/testing/marionette/client/marionette_driver/__init__.py b/testing/marionette/client/marionette_driver/__init__.py
+--- a/testing/marionette/client/marionette_driver/__init__.py
++++ b/testing/marionette/client/marionette_driver/__init__.py
+@@ -1,15 +1,15 @@
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+-__version__ = '2.7.0'
++__version__ = '2.8.0'
+ 
+ from marionette_driver import (
+     addons,
+     by,
+     date_time_value,
+     decorators,
+     errors,
+     expected,
+diff --git a/testing/marionette/harness/marionette_harness/__init__.py b/testing/marionette/harness/marionette_harness/__init__.py
+--- a/testing/marionette/harness/marionette_harness/__init__.py
++++ b/testing/marionette/harness/marionette_harness/__init__.py
+@@ -1,15 +1,15 @@
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+-__version__ = '4.5.0'
++__version__ = '4.6.0'
+ 
+ from .marionette_test import (
+     CommonTestCase,
+     expectedFailure,
+     MarionetteTestCase,
+     parameterized,
+     run_if_e10s,
+     run_if_manage_instance,
+diff --git a/testing/marionette/harness/requirements.txt b/testing/marionette/harness/requirements.txt
+--- a/testing/marionette/harness/requirements.txt
++++ b/testing/marionette/harness/requirements.txt
+@@ -1,11 +1,11 @@
+ browsermob-proxy >= 0.6.0
+ manifestparser >= 1.1
+-marionette-driver >= 2.7.0
++marionette-driver >= 2.8.0
+ mozcrash >= 1.1.0
+ mozdevice >= 3.0.0
+ mozinfo >= 1.0.0
+ mozlog >= 4.0
+ moznetwork >= 0.27
+ mozprocess >= 1.0.0
+ mozprofile >= 2.2.0
+ mozrunner >= 7.4.0

File diff suppressed because it is too large
+ 2193 - 0
mozilla-release/patches/1532919-67a1.patch


+ 114 - 0
mozilla-release/patches/1533517-67a1.patch

@@ -0,0 +1,114 @@
+# HG changeset patch
+# User Kartikaya Gupta <kgupta@mozilla.com>
+# Date 1552398951 0
+# Node ID 1aa0df07fbddd6007b3a8023e32509b55aabdc46
+# Parent  c8da01c4ba1c9fb4b535a51150720bf8708ec056
+Bug 1533517 - [mozdevice] Remove FirefoxOS candidate test root paths. r=bc
+
+Differential Revision: https://phabricator.services.mozilla.com/D22952
+
+diff --git a/testing/marionette/harness/requirements.txt b/testing/marionette/harness/requirements.txt
+--- a/testing/marionette/harness/requirements.txt
++++ b/testing/marionette/harness/requirements.txt
+@@ -1,13 +1,13 @@
+ browsermob-proxy >= 0.8.0
+ manifestparser >= 1.1
+ marionette-driver >= 2.8.0
+ mozcrash >= 1.1.0
+-mozdevice >= 3.0.0
++mozdevice >= 3.0.1
+ mozinfo >= 1.0.0
+ mozlog >= 4.0
+ moznetwork >= 0.27
+ mozprocess >= 1.0.0
+ mozprofile >= 2.2.0
+ mozrunner >= 7.4.0
+ moztest >= 0.8
+ mozversion >= 2.1.0
+diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py
+--- a/testing/mozbase/mozdevice/mozdevice/adb.py
++++ b/testing/mozbase/mozdevice/mozdevice/adb.py
+@@ -773,18 +773,16 @@ class ADBDevice(ADBCommand):
+         The first time test_root it is called it determines and caches a value
+         for the test root on the device. It determines the appropriate test
+         root by attempting to create a 'dummy' directory on each of a list of
+         directories and returning the first successful directory as the
+         test_root value.
+ 
+         The default list of directories checked by test_root are:
+ 
+-        - /storage/sdcard0/tests
+-        - /storage/sdcard1/tests
+         - /sdcard/tests
+         - /mnt/sdcard/tests
+         - /data/local/tests
+ 
+         You may override the default list by providing a test_root argument to
+         the :class:`ADBDevice` constructor which will then be used when
+         attempting to create the 'dummy' directory.
+ 
+@@ -793,19 +791,17 @@ class ADBDevice(ADBCommand):
+                  * ADBError
+         """
+         if self._test_root is not None:
+             return self._test_root
+ 
+         if self._initial_test_root:
+             paths = [self._initial_test_root]
+         else:
+-            paths = ['/storage/sdcard0/tests',
+-                     '/storage/sdcard1/tests',
+-                     '/sdcard/tests',
++            paths = ['/sdcard/tests',
+                      '/mnt/sdcard/tests',
+                      '/data/local/tests']
+ 
+         max_attempts = 3
+         for attempt in range(1, max_attempts + 1):
+             for test_root in paths:
+                 self._logger.debug("Setting test root to %s attempt %d of %d" %
+                                    (test_root, attempt, max_attempts))
+diff --git a/testing/mozbase/mozdevice/setup.py b/testing/mozbase/mozdevice/setup.py
+--- a/testing/mozbase/mozdevice/setup.py
++++ b/testing/mozbase/mozdevice/setup.py
+@@ -3,17 +3,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozdevice'
+-PACKAGE_VERSION = '3.0.0'
++PACKAGE_VERSION = '3.0.1'
+ 
+ deps = ['mozlog >= 3.0']
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Mozilla-authored device management",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       classifiers=['Programming Language :: Python :: 2.7',
+diff --git a/testing/mozbase/mozrunner/setup.py b/testing/mozbase/mozrunner/setup.py
+--- a/testing/mozbase/mozrunner/setup.py
++++ b/testing/mozbase/mozrunner/setup.py
+@@ -7,17 +7,17 @@ from __future__ import absolute_import
+ from setuptools import setup, find_packages
+ 
+ PACKAGE_NAME = 'mozrunner'
+ PACKAGE_VERSION = '7.4.0'
+ 
+ desc = """Reliable start/stop/configuration of Mozilla Applications (Firefox, Thunderbird, etc.)"""
+ 
+ deps = [
+-    'mozdevice>=1.1.6',
++    'mozdevice>=3.0.1',
+     'mozfile>=1.2',
+     'mozinfo>=0.7,<2',
+     'mozlog~=4.0',
+     'mozprocess>=0.23,<2',
+     'mozprofile~=2.1',
+     'six>=1.10.0,<2',
+ ]
+ 

+ 100 - 0
mozilla-release/patches/1550565-68a1.patch

@@ -0,0 +1,100 @@
+# HG changeset patch
+# User Nikki S <nikkisharpley@gmail.com>
+# Date 1557484189 0
+# Node ID 757f1c83278b03859f4f23e85e22e732c2bc313f
+# Parent  ed3b4c335e736fd7248900f9a15010d41a9e6b22
+Bug 1550565 - [mozlog] Update mozlog version number to 4.1 r=jgraham
+
+The Mozlog version number needed to be updated to 4.1 for the new
+release on PyPI. The dependencies of other libraries that require
+mozlog were updated to reflect the new version. (mozversion,
+mozrunner, mozprofile)
+
+Differential Revision: https://phabricator.services.mozilla.com/D30550
+
+diff --git a/testing/mozbase/mozlog/setup.py b/testing/mozbase/mozlog/setup.py
+--- a/testing/mozbase/mozlog/setup.py
++++ b/testing/mozbase/mozlog/setup.py
+@@ -2,17 +2,17 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ # You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import
+ 
+ from setuptools import setup, find_packages
+ 
+ PACKAGE_NAME = 'mozlog'
+-PACKAGE_VERSION = '4.0'
++PACKAGE_VERSION = '4.1'
+ DEPS = [
+     'blessings>=1.3',
+     'mozterm',
+     'six >= 1.10.0',
+ ]
+ 
+ 
+ setup(name=PACKAGE_NAME,
+diff --git a/testing/mozbase/mozprofile/setup.py b/testing/mozbase/mozprofile/setup.py
+--- a/testing/mozbase/mozprofile/setup.py
++++ b/testing/mozbase/mozprofile/setup.py
+@@ -6,17 +6,17 @@ from __future__ import absolute_import
+ 
+ from setuptools import setup
+ 
+ PACKAGE_NAME = 'mozprofile'
+ PACKAGE_VERSION = '2.2.0'
+ 
+ deps = [
+     'mozfile>=1.2',
+-    'mozlog~=4.0',
++    'mozlog~=4.1',
+     'six>=1.10.0,<2',
+ ]
+ 
+ setup(name=PACKAGE_NAME,
+       version=PACKAGE_VERSION,
+       description="Library to create and modify Mozilla application profiles",
+       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
+       classifiers=['Environment :: Console',
+diff --git a/testing/mozbase/mozrunner/setup.py b/testing/mozbase/mozrunner/setup.py
+--- a/testing/mozbase/mozrunner/setup.py
++++ b/testing/mozbase/mozrunner/setup.py
+@@ -10,17 +10,17 @@ PACKAGE_NAME = 'mozrunner'
+ PACKAGE_VERSION = '7.4.0'
+ 
+ desc = """Reliable start/stop/configuration of Mozilla Applications (Firefox, Thunderbird, etc.)"""
+ 
+ deps = [
+     'mozdevice>=3.0.1',
+     'mozfile>=1.2',
+     'mozinfo>=0.7,<2',
+-    'mozlog~=4.0',
++    'mozlog~=4.1',
+     'mozprocess>=0.23,<2',
+     'mozprofile~=2.1',
+     'six>=1.10.0,<2',
+ ]
+ 
+ EXTRAS_REQUIRE = {'crash': ['mozcrash >= 1.0']}
+ 
+ setup(name=PACKAGE_NAME,
+diff --git a/testing/mozbase/mozversion/setup.py b/testing/mozbase/mozversion/setup.py
+--- a/testing/mozbase/mozversion/setup.py
++++ b/testing/mozbase/mozversion/setup.py
+@@ -18,15 +18,15 @@ setup(name='mozversion',
+       keywords='mozilla',
+       author='Mozilla Automation and Testing Team',
+       author_email='tools@lists.mozilla.org',
+       url='https://wiki.mozilla.org/Auto-tools/Projects/Mozbase',
+       license='MPL',
+       packages=['mozversion'],
+       include_package_data=True,
+       zip_safe=False,
+-      install_requires=['mozlog ~= 4.0',
++      install_requires=['mozlog ~= 4.1',
+                         'six >= 1.10.0'],
+       entry_points="""
+       # -*- Entry points: -*-
+       [console_scripts]
+       mozversion = mozversion:cli
+       """)

+ 21 - 1
mozilla-release/patches/series

@@ -6783,10 +6783,30 @@ NOBUG-nukemozlinker-25319.patch
 1890514-11511.patch
 1893340-PARTIAL-NOTESTS-11511.patch
 1897801-about-seamonkey-mozilla-25319.patch
+1440714-13-61a1.patch
 1449035-62a1.patch
+1482898-63a1.patch
 1485454-1-63a1.patch
 1485454-2-63a1.patch
+1487130-63a1.patch
+1484238-64a1.patch
+1190701-64a1.patch
+1488468-1-64a1.patch
+1499102-64a1.patch
+1502190-2-65a1.patch
+1504117-2-65a1.patch
+1506385-65a1.patch
 1519358-66a1.patch
+1524150-67a1.patch
+1428708-2-67a1.patch
+1526990-67a1.patch
+1530794-1-67a1.patch
+1530794-2-67a1.patch
+1532919-67a1.patch
+1533517-67a1.patch
+1524961-68a1.patch
+1550565-68a1.patch
+1527610-69a1.patch
 1561102-1-69a1.patch
 1561102-2-69a1.patch
 1563326-69a1.patch
@@ -6956,10 +6976,10 @@ NOBUG-nukemozlinker-25319.patch
 1713613-2-91a1.patch
 1713613-3-91a1.patch
 1713610-91a1.patch
-1799483-108a1.patch
 1743896-96a1.patch
 1779993-PARTIAL-NOTESTS-105a1.patch
 1784990-106a1.patch
+1799483-108a1.patch
 1845018-117a1.patch
 1193389-125a1.patch
 1870579-126a1.patch

Some files were not shown because too many files changed in this diff