comparison tests/run-tests.py @ 48856:078e1e1cc7da

tests: require Python 3.5+ in run-tests.py We change the version check logic to hard fail if running on <= 3.5.0. The branch for <3.5 has been deleted. And the >=3.5 branch block has been dedented. Differential Revision: https://phab.mercurial-scm.org/D12234
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 20 Feb 2022 11:57:59 -0700
parents 29eb80d190b2
children 41c552a20716
comparison
equal deleted inserted replaced
48855:6ea9ead59cf8 48856:078e1e1cc7da
43 # completes fairly quickly, includes both shell and Python scripts, and 43 # completes fairly quickly, includes both shell and Python scripts, and
44 # includes some scripts that run daemon processes.) 44 # includes some scripts that run daemon processes.)
45 45
46 from __future__ import absolute_import, print_function 46 from __future__ import absolute_import, print_function
47 47
48
48 import argparse 49 import argparse
49 import collections 50 import collections
50 import contextlib 51 import contextlib
51 import difflib 52 import difflib
52 import distutils.version as version 53 import distutils.version as version
152 runnerformatter = formatters.Terminal256Formatter(style=TestRunnerStyle) 153 runnerformatter = formatters.Terminal256Formatter(style=TestRunnerStyle)
153 runnerlexer = TestRunnerLexer() 154 runnerlexer = TestRunnerLexer()
154 155
155 origenviron = os.environ.copy() 156 origenviron = os.environ.copy()
156 157
157 158 if sys.version_info < (3, 5, 0):
158 if sys.version_info > (3, 5, 0):
159 PYTHON3 = True
160 xrange = range # we use xrange in one place, and we'd rather not use range
161
162 def _sys2bytes(p):
163 if p is None:
164 return p
165 return p.encode('utf-8')
166
167 def _bytes2sys(p):
168 if p is None:
169 return p
170 return p.decode('utf-8')
171
172 osenvironb = getattr(os, 'environb', None)
173 if osenvironb is None:
174 # Windows lacks os.environb, for instance. A proxy over the real thing
175 # instead of a copy allows the environment to be updated via bytes on
176 # all platforms.
177 class environbytes(object):
178 def __init__(self, strenv):
179 self.__len__ = strenv.__len__
180 self.clear = strenv.clear
181 self._strenv = strenv
182
183 def __getitem__(self, k):
184 v = self._strenv.__getitem__(_bytes2sys(k))
185 return _sys2bytes(v)
186
187 def __setitem__(self, k, v):
188 self._strenv.__setitem__(_bytes2sys(k), _bytes2sys(v))
189
190 def __delitem__(self, k):
191 self._strenv.__delitem__(_bytes2sys(k))
192
193 def __contains__(self, k):
194 return self._strenv.__contains__(_bytes2sys(k))
195
196 def __iter__(self):
197 return iter([_sys2bytes(k) for k in iter(self._strenv)])
198
199 def get(self, k, default=None):
200 v = self._strenv.get(_bytes2sys(k), _bytes2sys(default))
201 return _sys2bytes(v)
202
203 def pop(self, k, default=None):
204 v = self._strenv.pop(_bytes2sys(k), _bytes2sys(default))
205 return _sys2bytes(v)
206
207 osenvironb = environbytes(os.environ)
208
209 getcwdb = getattr(os, 'getcwdb')
210 if not getcwdb or WINDOWS:
211 getcwdb = lambda: _sys2bytes(os.getcwd())
212
213 elif sys.version_info >= (3, 0, 0):
214 print( 159 print(
215 '%s is only supported on Python 3.5+ and 2.7, not %s' 160 '%s is only supported on Python 3.5+, not %s'
216 % (sys.argv[0], '.'.join(str(v) for v in sys.version_info[:3])) 161 % (sys.argv[0], '.'.join(str(v) for v in sys.version_info[:3]))
217 ) 162 )
218 sys.exit(70) # EX_SOFTWARE from `man 3 sysexit` 163 sys.exit(70) # EX_SOFTWARE from `man 3 sysexit`
219 else: 164
220 PYTHON3 = False 165 PYTHON3 = True
221 166 xrange = range # we use xrange in one place, and we'd rather not use range
222 # In python 2.x, path operations are generally done using 167
223 # bytestrings by default, so we don't have to do any extra 168
224 # fiddling there. We define the wrapper functions anyway just to 169 def _sys2bytes(p):
225 # help keep code consistent between platforms. 170 if p is None:
226 def _sys2bytes(p):
227 return p 171 return p
228 172 return p.encode('utf-8')
229 _bytes2sys = _sys2bytes 173
230 osenvironb = os.environ 174
231 getcwdb = os.getcwd 175 def _bytes2sys(p):
176 if p is None:
177 return p
178 return p.decode('utf-8')
179
180
181 osenvironb = getattr(os, 'environb', None)
182 if osenvironb is None:
183 # Windows lacks os.environb, for instance. A proxy over the real thing
184 # instead of a copy allows the environment to be updated via bytes on
185 # all platforms.
186 class environbytes(object):
187 def __init__(self, strenv):
188 self.__len__ = strenv.__len__
189 self.clear = strenv.clear
190 self._strenv = strenv
191
192 def __getitem__(self, k):
193 v = self._strenv.__getitem__(_bytes2sys(k))
194 return _sys2bytes(v)
195
196 def __setitem__(self, k, v):
197 self._strenv.__setitem__(_bytes2sys(k), _bytes2sys(v))
198
199 def __delitem__(self, k):
200 self._strenv.__delitem__(_bytes2sys(k))
201
202 def __contains__(self, k):
203 return self._strenv.__contains__(_bytes2sys(k))
204
205 def __iter__(self):
206 return iter([_sys2bytes(k) for k in iter(self._strenv)])
207
208 def get(self, k, default=None):
209 v = self._strenv.get(_bytes2sys(k), _bytes2sys(default))
210 return _sys2bytes(v)
211
212 def pop(self, k, default=None):
213 v = self._strenv.pop(_bytes2sys(k), _bytes2sys(default))
214 return _sys2bytes(v)
215
216 osenvironb = environbytes(os.environ)
217
218 getcwdb = getattr(os, 'getcwdb')
219 if not getcwdb or WINDOWS:
220 getcwdb = lambda: _sys2bytes(os.getcwd())
221
232 222
233 if WINDOWS: 223 if WINDOWS:
234 _getcwdb = getcwdb 224 _getcwdb = getcwdb
235 225
236 def getcwdb(): 226 def getcwdb():