summaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/mach/mach/main.py8
-rw-r--r--python/mach/mach/test/test_entry_point.py4
-rw-r--r--python/mozboot/mozboot/base.py7
-rw-r--r--python/mozboot/mozboot/bootstrap.py16
-rw-r--r--python/mozboot/mozboot/debian.py7
-rw-r--r--python/mozboot/setup.py5
-rw-r--r--python/mozbuild/mozbuild/mach_commands.py6
-rw-r--r--python/mozbuild/mozbuild/nodeutil.py12
-rw-r--r--python/mozrelease/mozrelease/versions.py56
-rw-r--r--python/mozrelease/test/test_versions.py21
-rw-r--r--python/sites/mach.txt2
11 files changed, 94 insertions, 50 deletions
diff --git a/python/mach/mach/main.py b/python/mach/mach/main.py
index 9ab880341d..6c32ce2058 100644
--- a/python/mach/mach/main.py
+++ b/python/mach/mach/main.py
@@ -8,16 +8,18 @@
import argparse
import codecs
import errno
-import imp
import logging
import os
import sys
import traceback
+import types
import uuid
from collections.abc import Iterable
from pathlib import Path
from typing import Dict, List, Union
+from mozfile import load_source
+
from .base import (
CommandContext,
FailedCommandError,
@@ -267,13 +269,13 @@ To see more help for a specific command, run:
# Ensure parent module is present otherwise we'll (likely) get
# an error due to unknown parent.
if "mach.commands" not in sys.modules:
- mod = imp.new_module("mach.commands")
+ mod = types.ModuleType("mach.commands")
sys.modules["mach.commands"] = mod
module_name = f"mach.commands.{uuid.uuid4().hex}"
try:
- imp.load_source(module_name, str(path))
+ load_source(module_name, str(path))
except IOError as e:
if e.errno != errno.ENOENT:
raise
diff --git a/python/mach/mach/test/test_entry_point.py b/python/mach/mach/test/test_entry_point.py
index 1129eba476..11aa083cda 100644
--- a/python/mach/mach/test/test_entry_point.py
+++ b/python/mach/mach/test/test_entry_point.py
@@ -1,8 +1,8 @@
# 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 imp
import sys
+import types
from pathlib import Path
from unittest.mock import patch
@@ -38,7 +38,7 @@ class TestEntryPoints(TestBase):
# Ensure parent module is present otherwise we'll (likely) get
# an error due to unknown parent.
if "mach.commands" not in sys.modules:
- mod = imp.new_module("mach.commands")
+ mod = types.ModuleType("mach.commands")
sys.modules["mach.commands"] = mod
mock.return_value = [Entry([self.provider_dir])]
diff --git a/python/mozboot/mozboot/base.py b/python/mozboot/mozboot/base.py
index c32946c4eb..9f4a81ca01 100644
--- a/python/mozboot/mozboot/base.py
+++ b/python/mozboot/mozboot/base.py
@@ -170,13 +170,6 @@ class BaseBootstrapper(object):
to the user, if necessary.
"""
- def suggest_install_distutils(self):
- """Called if distutils.{sysconfig,spawn} can't be imported."""
- print(
- "Does your distro require installing another package for distutils?",
- file=sys.stderr,
- )
-
def suggest_install_pip3(self):
"""Called if pip3 can't be found."""
print(
diff --git a/python/mozboot/mozboot/bootstrap.py b/python/mozboot/mozboot/bootstrap.py
index e57f496f29..c2b7480b8e 100644
--- a/python/mozboot/mozboot/bootstrap.py
+++ b/python/mozboot/mozboot/bootstrap.py
@@ -491,22 +491,6 @@ class Bootstrapper(object):
def _validate_python_environment(self, topsrcdir):
valid = True
- try:
- # distutils is singled out here because some distros (namely Ubuntu)
- # include it in a separate package outside of the main Python
- # installation.
- import distutils.spawn
- import distutils.sysconfig
-
- assert distutils.sysconfig is not None and distutils.spawn is not None
- except ImportError as e:
- print("ERROR: Could not import package %s" % e.name, file=sys.stderr)
- self.instance.suggest_install_distutils()
- valid = False
- except AssertionError:
- print("ERROR: distutils is not behaving as expected.", file=sys.stderr)
- self.instance.suggest_install_distutils()
- valid = False
pip3 = to_optional_path(which("pip3"))
if not pip3:
print("ERROR: Could not find pip3.", file=sys.stderr)
diff --git a/python/mozboot/mozboot/debian.py b/python/mozboot/mozboot/debian.py
index 34e328586e..63b47a2f03 100644
--- a/python/mozboot/mozboot/debian.py
+++ b/python/mozboot/mozboot/debian.py
@@ -17,13 +17,6 @@ class DebianBootstrapper(LinuxBootstrapper, BaseBootstrapper):
self.dist_id = dist_id
self.codename = codename
- def suggest_install_distutils(self):
- print(
- "HINT: Try installing distutils with "
- "`apt-get install python3-distutils`.",
- file=sys.stderr,
- )
-
def suggest_install_pip3(self):
print(
"HINT: Try installing pip3 with `apt-get install python3-pip`.",
diff --git a/python/mozboot/setup.py b/python/mozboot/setup.py
index 234650dc8a..7b12c1c0c5 100644
--- a/python/mozboot/setup.py
+++ b/python/mozboot/setup.py
@@ -2,7 +2,10 @@
# 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 distutils.core import setup
+try:
+ from setuptools import setup
+except ImportError:
+ from distutils.core import setup
VERSION = "0.1"
diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py
index 2297d586b8..c00afd1c01 100644
--- a/python/mozbuild/mozbuild/mach_commands.py
+++ b/python/mozbuild/mozbuild/mach_commands.py
@@ -29,6 +29,7 @@ from mach.decorators import (
SettingsProvider,
SubCommand,
)
+from mozfile import load_source
from voluptuous import All, Boolean, Required, Schema
import mozbuild.settings # noqa need @SettingsProvider hook to execute
@@ -1099,11 +1100,10 @@ def android_gtest(
# run gtest via remotegtests.py
exit_code = 0
- import imp
path = os.path.join("testing", "gtest", "remotegtests.py")
- with open(path, "r") as fh:
- imp.load_module("remotegtests", fh, path, (".py", "r", imp.PY_SOURCE))
+ load_source("remotegtests", path)
+
import remotegtests
tester = remotegtests.RemoteGTests()
diff --git a/python/mozbuild/mozbuild/nodeutil.py b/python/mozbuild/mozbuild/nodeutil.py
index 8ec724ab89..42f2627cd9 100644
--- a/python/mozbuild/mozbuild/nodeutil.py
+++ b/python/mozbuild/mozbuild/nodeutil.py
@@ -5,14 +5,14 @@
import os
import platform
import subprocess
-from distutils.version import StrictVersion
from mozboot.util import get_tools_dir
from mozfile import which
+from packaging.version import Version
from six import PY3
-NODE_MIN_VERSION = StrictVersion("12.22.12")
-NPM_MIN_VERSION = StrictVersion("6.14.16")
+NODE_MIN_VERSION = Version("12.22.12")
+NPM_MIN_VERSION = Version("6.14.16")
def find_node_paths():
@@ -68,7 +68,7 @@ def check_executable_version(exe, wrap_call_with_node=False):
.lstrip("v")
.rstrip()
)
- return StrictVersion(out)
+ return Version(out)
def find_node_executable(
@@ -87,7 +87,7 @@ def find_node_executable(
return None, None
if version >= min_version:
- return nodejs_exe, version.version
+ return nodejs_exe, version.release
return None, None
@@ -123,4 +123,4 @@ def find_executable(name, min_version, use_node_for_version_check=False):
if version < min_version:
return None, None
- return exe, version.version
+ return exe, version.release
diff --git a/python/mozrelease/mozrelease/versions.py b/python/mozrelease/mozrelease/versions.py
index e3e47d4e4a..348b77bd75 100644
--- a/python/mozrelease/mozrelease/versions.py
+++ b/python/mozrelease/mozrelease/versions.py
@@ -3,9 +3,59 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import re
-from distutils.version import StrictVersion
from looseversion import LooseVersion
+from packaging.version import InvalidVersion
+
+
+class StrictVersion:
+ def __init__(self, vstring):
+ self.parse(vstring)
+
+ def __repr__(self):
+ return "%s ('%s')" % (self.__class__.__name__, str(self))
+
+ def __eq__(self, other):
+ return self._cmp(other) == 0
+
+ def __lt__(self, other):
+ return self._cmp(other) < 0
+
+ def parse(self, vstring):
+ match = self.version_re.match(vstring)
+ if not match:
+ raise InvalidVersion("invalid version number '%s'" % vstring)
+
+ major, minor, patch, pre, pre_num = match.group(1, 2, 4, 5, 6)
+ self.version = int(major), int(minor), int(patch or 0)
+ self.pre = (pre[0], int(pre_num)) if pre else ()
+
+ def __str__(self):
+ return ".".join(map(str, self.version)) + (
+ "".join(map(str, self.pre)) if self.pre else ""
+ )
+
+ def _cmp(self, other):
+ if isinstance(other, str):
+ other = StrictVersion(other)
+ elif not isinstance(other, StrictVersion):
+ raise NotImplementedError
+
+ if self.version < other.version:
+ return -1
+ elif self.version == other.version:
+ if self.pre == other.pre:
+ return 0
+ elif not self.pre:
+ return 1
+ elif not other.pre:
+ return -1
+ elif self.pre < other.pre:
+ return -1
+ else:
+ return 1
+ else:
+ return 1
class MozillaVersionCompareMixin:
@@ -93,12 +143,12 @@ class LooseModernMozillaVersion(MozillaVersionCompareMixin, LooseVersion):
def MozillaVersion(version):
try:
return ModernMozillaVersion(version)
- except ValueError:
+ except InvalidVersion:
pass
try:
if version.count(".") == 3:
return AncientMozillaVersion(version)
- except ValueError:
+ except InvalidVersion:
pass
try:
return LooseModernMozillaVersion(version)
diff --git a/python/mozrelease/test/test_versions.py b/python/mozrelease/test/test_versions.py
index f3bca91f1f..eaf7d653db 100644
--- a/python/mozrelease/test/test_versions.py
+++ b/python/mozrelease/test/test_versions.py
@@ -1,7 +1,11 @@
import mozunit
import pytest
-from mozrelease.versions import MozillaVersion
+from mozrelease.versions import (
+ AncientMozillaVersion,
+ ModernMozillaVersion,
+ MozillaVersion,
+)
ALL_VERSIONS = [ # Keep this sorted
"3.0",
@@ -91,6 +95,21 @@ def test_versions_compare_greater(comparable_versions):
assert MozillaVersion(larger_version) > MozillaVersion(smaller_version)
+def test_ModernMozillaVersion():
+ """Test properties specific to ModernMozillaVersion"""
+ assert isinstance(MozillaVersion("1.2.4"), ModernMozillaVersion)
+ assert isinstance(MozillaVersion("1.2.4rc3"), ModernMozillaVersion)
+ assert MozillaVersion("1.2rc3") == MozillaVersion("1.2.0rc3")
+
+
+def test_AncientMozillaVersion():
+ """Test properties specific to AncientMozillaVersion"""
+ assert isinstance(MozillaVersion("1.2.0.4"), AncientMozillaVersion)
+ assert isinstance(MozillaVersion("1.2.0.4pre1"), AncientMozillaVersion)
+ assert MozillaVersion("1.2pre1") == MozillaVersion("1.2.0pre1")
+ assert MozillaVersion("1.2.0.4pre1") == MozillaVersion("1.2.4pre1")
+
+
@pytest.mark.parametrize("version", ALL_VERSIONS)
def test_versions_compare_equal(version):
"""Test that versions properly compare as equal through multiple passes."""
diff --git a/python/sites/mach.txt b/python/sites/mach.txt
index 55cc6fb2ed..a597630083 100644
--- a/python/sites/mach.txt
+++ b/python/sites/mach.txt
@@ -106,7 +106,7 @@ vendored:third_party/python/pylru
vendored:third_party/python/pyparsing
vendored:third_party/python/pyrsistent
vendored:third_party/python/python-hglib
-vendored:third_party/python/PyYAML/lib3/
+vendored:third_party/python/PyYAML/lib
vendored:third_party/python/redo
vendored:third_party/python/requests
vendored:third_party/python/requests_unixsocket