1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
Bug 1866829 - Replace obsolete distutils reference by portable alternatives r=ahochheiden
distutils.dir_util.copy_tree -> shutil.copytree
distutils.spawn.find_executable -> shutil.which
Also fix a warning about escape sequence in the process.
Differential Revision: https://phabricator.services.mozilla.com/D194781
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
@@ -10,17 +10,17 @@ import re
import shlex
import shutil
import signal
import subprocess
import sys
import tempfile
import time
import traceback
-from distutils import dir_util
+from shutil import copytree
from threading import Thread
import six
from six.moves import range
from . import version_codes
_TEST_ROOT = None
@@ -2978,17 +2978,17 @@ class ADBDevice(ADBCommand):
if os.path.isfile(local) and self.is_dir(remote):
# force push to use the correct filename in the remote directory
remote = posixpath.join(remote, os.path.basename(local))
elif os.path.isdir(local):
copy_required = True
temp_parent = tempfile.mkdtemp()
remote_name = os.path.basename(remote)
new_local = os.path.join(temp_parent, remote_name)
- dir_util.copy_tree(local, new_local)
+ copytree(local, new_local)
local = new_local
# See do_sync_push in
# https://android.googlesource.com/platform/system/core/+/master/adb/file_sync_client.cpp
# Work around change in behavior in adb 1.0.36 where if
# the remote destination directory exists, adb push will
# copy the source directory *into* the destination
# directory otherwise it will copy the source directory
# *onto* the destination directory.
@@ -3131,17 +3131,17 @@ class ADBDevice(ADBCommand):
self.cp(remote, intermediate, recursive=True, timeout=timeout)
self.command_output(["pull", intermediate, local], timeout=timeout)
except ADBError as e:
self._logger.error("pull %s %s: %s" % (intermediate, local, str(e)))
finally:
self.rm(intermediate, recursive=True, force=True, timeout=timeout)
finally:
if copy_required:
- dir_util.copy_tree(local, original_local)
+ copytree(local, original_local, dirs_exist_ok=True)
shutil.rmtree(temp_parent)
def get_file(self, remote, offset=None, length=None, timeout=None):
"""Pull file from device and return the file's content
:param str remote: The path of the remote file.
:param offset: If specified, return only content beyond this offset.
:param length: If specified, limit content length accordingly.
diff --git a/testing/mozbase/mozdevice/mozdevice/remote_process_monitor.py b/testing/mozbase/mozdevice/mozdevice/remote_process_monitor.py
--- a/testing/mozbase/mozdevice/mozdevice/remote_process_monitor.py
+++ b/testing/mozbase/mozdevice/mozdevice/remote_process_monitor.py
@@ -130,17 +130,17 @@ class RemoteProcessMonitor:
if message.get("action") == "test_start":
self.last_test_seen = message["test"]
elif message.get("action") == "test_end":
self.last_test_seen = "{} (finished)".format(message["test"])
elif message.get("action") == "suite_end":
self.last_test_seen = "Last test finished"
elif message.get("action") == "log":
line = message["message"].strip()
- m = re.match(".*:\s*(\d*)", line)
+ m = re.match(r".*:\s*(\d*)", line)
if m:
try:
val = int(m.group(1))
if "Passed:" in line:
self.counts["pass"] += val
self.last_test_seen = "Last test finished"
elif "Failed:" in line:
self.counts["fail"] += val
diff --git a/testing/mozbase/mozrunner/mozrunner/application.py b/testing/mozbase/mozrunner/mozrunner/application.py
--- a/testing/mozbase/mozrunner/mozrunner/application.py
+++ b/testing/mozbase/mozrunner/mozrunner/application.py
@@ -1,16 +1,16 @@
# 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/.
import os
import posixpath
from abc import ABCMeta, abstractmethod
-from distutils.spawn import find_executable
+from shutil import which
import six
from mozdevice import ADBDeviceFactory
from mozprofile import (
ChromeProfile,
ChromiumProfile,
FirefoxProfile,
Profile,
@@ -46,17 +46,17 @@ class RemoteContext(object):
profile_class = Profile
_bindir = None
remote_test_root = ""
remote_process = None
@property
def bindir(self):
if self._bindir is None:
- paths = [find_executable("emulator")]
+ paths = [which("emulator")]
paths = [p for p in paths if p is not None if os.path.isfile(p)]
if not paths:
self._bindir = ""
else:
self._bindir = os.path.dirname(paths[0])
return self._bindir
@property
@@ -83,17 +83,17 @@ class RemoteContext(object):
return self._remote_profile
def which(self, binary):
paths = os.environ.get("PATH", {}).split(os.pathsep)
if self.bindir is not None and os.path.abspath(self.bindir) not in paths:
paths.insert(0, os.path.abspath(self.bindir))
os.environ["PATH"] = os.pathsep.join(paths)
- return find_executable(binary)
+ return which(binary)
@abstractmethod
def stop_application(self):
"""Run (device manager) command to stop application."""
pass
devices = {}
|