[Lldb-commits] [lldb] [lldb] Migrate distutils.version.LooseVersion to packaging.LooseVersion (PR #82066)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Fri Feb 16 15:36:19 PST 2024


https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/82066

>From dad7c2a49f118d11b213b9691c8b01733040a510 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Fri, 16 Feb 2024 14:59:15 -0800
Subject: [PATCH] [lldb] Migrate distutils.version.LooseVersion to packaging

The distutils package has been deprecated and was removed from Python
3.12. The migration page [1] advises to use the packaging module
instead. Since Python 3.6 that's vendored into pkg_resources.

[1] https://peps.python.org/pep-0632/#migration-advice
---
 .../Python/lldbsuite/test/decorators.py       | 12 ++++---
 .../Python/lldbsuite/test/lldbplatformutil.py | 18 ++++++++---
 lldb/test/API/sanity/TestSettingSkipping.py   | 32 +++++++++----------
 .../lldb-server/TestAppleSimulatorOSType.py   |  4 +--
 lldb/test/Shell/helper/build.py               |  4 +--
 5 files changed, 40 insertions(+), 30 deletions(-)

diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py
index a5d7a7a25879df..b691f82b90652c 100644
--- a/lldb/packages/Python/lldbsuite/test/decorators.py
+++ b/lldb/packages/Python/lldbsuite/test/decorators.py
@@ -1,6 +1,6 @@
 # System modules
-from distutils.version import LooseVersion
 from functools import wraps
+from pkg_resources import packaging
 import ctypes
 import locale
 import os
@@ -65,10 +65,10 @@ def fn_neq(x, y):
         ">=": fn_geq,
         "<=": fn_leq,
     }
-    expected_str = ".".join([str(x) for x in expected])
-    actual_str = ".".join([str(x) for x in actual])
 
-    return op_lookup[comparison](LooseVersion(actual_str), LooseVersion(expected_str))
+    return op_lookup[comparison](
+        packaging.version.parse(actual), packaging.version.parse(expected)
+    )
 
 
 def _match_decorator_property(expected, actual):
@@ -238,7 +238,9 @@ def fn(actual_debug_info=None):
             )
         )
         skip_for_py_version = (py_version is None) or _check_expected_version(
-            py_version[0], py_version[1], sys.version_info
+            py_version[0],
+            py_version[1],
+            "{}.{}".format(sys.version_info.major, sys.version_info.minor),
         )
         skip_for_macos_version = (macos_version is None) or (
             (platform.mac_ver()[0] != "")
diff --git a/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py b/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py
index bd92d03e0e2212..f159e53a98429e 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbplatformutil.py
@@ -7,8 +7,8 @@
 import subprocess
 import sys
 import os
-from distutils.version import LooseVersion
 from urllib.parse import urlparse
+from pkg_resources import packaging
 
 # LLDB modules
 import lldb
@@ -308,13 +308,21 @@ def expectedCompilerVersion(compiler_version):
         return operator in [">", ">=", "!", "!=", "not"]
 
     if operator == ">":
-        return LooseVersion(test_compiler_version) > LooseVersion(version)
+        return packaging.version.parse(test_compiler_version) > packaging.version.parse(
+            version
+        )
     if operator == ">=" or operator == "=>":
-        return LooseVersion(test_compiler_version) >= LooseVersion(version)
+        return packaging.version.parse(
+            test_compiler_version
+        ) >= packaging.version.parse(version)
     if operator == "<":
-        return LooseVersion(test_compiler_version) < LooseVersion(version)
+        return packaging.version.parse(test_compiler_version) < packaging.version.parse(
+            version
+        )
     if operator == "<=" or operator == "=<":
-        return LooseVersion(test_compiler_version) <= LooseVersion(version)
+        return packaging.version.parse(
+            test_compiler_version
+        ) <= packaging.version.parse(version)
     if operator == "!=" or operator == "!" or operator == "not":
         return str(version) not in str(test_compiler_version)
     return str(version) in str(test_compiler_version)
diff --git a/lldb/test/API/sanity/TestSettingSkipping.py b/lldb/test/API/sanity/TestSettingSkipping.py
index 5f58ec2638456d..369948b2b49463 100644
--- a/lldb/test/API/sanity/TestSettingSkipping.py
+++ b/lldb/test/API/sanity/TestSettingSkipping.py
@@ -1,8 +1,7 @@
 """
-This is a sanity check that verifies that test can be sklipped based on settings.
+This is a sanity check that verifies that test can be skipped based on settings.
 """
 
-
 import lldb
 from lldbsuite.test.lldbtest import *
 from lldbsuite.test.decorators import *
@@ -10,24 +9,25 @@
 
 class SettingSkipSanityTestCase(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
+    REAL_PYTHON_VERSION = "3.0"
+    FUTURE_PYTHON_VERSION = "4.0"
 
-    @skipIf(py_version=(">=", (3, 0)))
+    @skipIf(py_version=(">=", REAL_PYTHON_VERSION))
     def testSkip(self):
-        """This setting is on by default"""
-        self.assertTrue(False, "This test should not run!")
-
-    @skipIf(py_version=("<", (3, 0)))
-    def testNoMatch(self):
-        self.assertTrue(True, "This test should run!")
+        self.assertTrue(False, "This test should not run and fail (SKIPPED)")
 
-    @skipIf(setting=("target.i-made-this-one-up", "true"))
-    def testNotExisting(self):
-        self.assertTrue(True, "This test should run!")
+    @skipIf(py_version=("<", FUTURE_PYTHON_VERSION))
+    def testNoSKip(self):
+        self.assertTrue(True, "This test should run and pass(PASS)")
 
-    @expectedFailureAll(py_version=(">=", (3, 0)))
+    @expectedFailureAll(py_version=("<", FUTURE_PYTHON_VERSION))
     def testXFAIL(self):
-        self.assertTrue(False, "This test should run and fail!")
+        self.assertTrue(False, "This test should expectedly fail (XFAIL)")
 
-    @expectedFailureAll(py_version=("<", (3, 0)))
+    @expectedFailureAll(py_version=(">=", FUTURE_PYTHON_VERSION))
     def testNotXFAIL(self):
-        self.assertTrue(True, "This test should run and succeed!")
+        self.assertTrue(True, "This test should pass (PASS)")
+
+    @skipIf(setting=("target.i-made-this-one-up", "true"))
+    def testNotExisting(self):
+        self.assertTrue(True, "This test should run!")
diff --git a/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py b/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py
index a8c2f93aed0ae3..1ec70b085f8c3d 100644
--- a/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py
+++ b/lldb/test/API/tools/lldb-server/TestAppleSimulatorOSType.py
@@ -61,9 +61,9 @@ def check_simulator_ostype(self, sdk, platform_name, arch=platform.machine()):
 
         # Older versions of watchOS (<7.0) only support i386
         if platform_name == "watchos":
-            from distutils.version import LooseVersion
+            from pkg_resources import packaging
 
-            if LooseVersion(vers) < LooseVersion("7.0"):
+            if packaging.version.parse(vers) < packaging.version.parse("7.0"):
                 arch = "i386"
 
         triple = "-".join([arch, "apple", platform_name + vers, "simulator"])
diff --git a/lldb/test/Shell/helper/build.py b/lldb/test/Shell/helper/build.py
index 073198a6df2df3..d3c25bd944e983 100755
--- a/lldb/test/Shell/helper/build.py
+++ b/lldb/test/Shell/helper/build.py
@@ -519,9 +519,9 @@ def _find_windows_sdk_in_registry_view(self, view):
 
             # Windows SDK version numbers consist of 4 dotted components, so we
             # have to use LooseVersion, as StrictVersion supports 3 or fewer.
-            from distutils.version import LooseVersion
+            from pkg_resources import packaging
 
-            sdk_versions.sort(key=lambda x: LooseVersion(x), reverse=True)
+            sdk_versions.sort(key=lambda x: packaging.version.parse(x), reverse=True)
             option_value_name = "OptionId.DesktopCPP" + self.msvc_arch_str
             for v in sdk_versions:
                 try:



More information about the lldb-commits mailing list