qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PULL 35/51] mkvenv: assume presence of importlib.metadata
Date: Thu,  7 Sep 2023 14:59:44 +0200	[thread overview]
Message-ID: <20230907130004.500601-36-pbonzini@redhat.com> (raw)
In-Reply-To: <20230907130004.500601-1-pbonzini@redhat.com>

importlib.metadata is included in Python 3.8, so there is no
need to fallback to either importlib-metadata or pkgresources
when generating console script shims.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 python/scripts/mkvenv.py | 197 ++++++---------------------------------
 python/setup.cfg         |   9 --
 2 files changed, 28 insertions(+), 178 deletions(-)

diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py
index 57a24948031..6797e12e349 100644
--- a/python/scripts/mkvenv.py
+++ b/python/scripts/mkvenv.py
@@ -61,7 +61,6 @@
 
 """
 
-# The duplication between importlib and pkg_resources does not help
 # pylint: disable=too-many-lines
 
 # Copyright (C) 2022-2023 Red Hat, Inc.
@@ -74,6 +73,13 @@
 # later. See the COPYING file in the top-level directory.
 
 import argparse
+from importlib.metadata import (
+    Distribution,
+    EntryPoint,
+    PackageNotFoundError,
+    distribution,
+    version,
+)
 from importlib.util import find_spec
 import logging
 import os
@@ -428,25 +434,7 @@ def _stringify(data: Union[str, bytes]) -> str:
     print(builder.get_value("env_exe"))
 
 
-def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
-    # pylint: disable=import-outside-toplevel
-    # pylint: disable=no-name-in-module
-    # pylint: disable=import-error
-    try:
-        # First preference: Python 3.8+ stdlib
-        from importlib.metadata import (  # type: ignore
-            EntryPoint,
-            PackageNotFoundError,
-            distribution,
-        )
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-        # Second preference: Commonly available PyPI backport
-        from importlib_metadata import (  # type: ignore
-            EntryPoint,
-            PackageNotFoundError,
-            distribution,
-        )
+def _get_entry_points(packages: Sequence[str]) -> Iterator[str]:
 
     def _generator() -> Iterator[str]:
         for package in packages:
@@ -468,24 +456,6 @@ def _generator() -> Iterator[str]:
     return _generator()
 
 
-def _gen_pkg_resources(packages: Sequence[str]) -> Iterator[str]:
-    # pylint: disable=import-outside-toplevel
-    # Bundled with setuptools; has a good chance of being available.
-    import pkg_resources
-
-    def _generator() -> Iterator[str]:
-        for package in packages:
-            try:
-                eps = pkg_resources.get_entry_map(package, "console_scripts")
-            except pkg_resources.DistributionNotFound:
-                continue
-
-            for entry_point in eps.values():
-                yield str(entry_point)
-
-    return _generator()
-
-
 def generate_console_scripts(
     packages: Sequence[str],
     python_path: Optional[str] = None,
@@ -510,30 +480,11 @@ def generate_console_scripts(
     if not packages:
         return
 
-    def _get_entry_points() -> Iterator[str]:
-        """Python 3.7 compatibility shim for iterating entry points."""
-        # Python 3.8+, or Python 3.7 with importlib_metadata installed.
-        try:
-            return _gen_importlib(packages)
-        except ImportError as exc:
-            logger.debug("%s", str(exc))
-
-        # Python 3.7 with setuptools installed.
-        try:
-            return _gen_pkg_resources(packages)
-        except ImportError as exc:
-            logger.debug("%s", str(exc))
-            raise Ouch(
-                "Neither importlib.metadata nor pkg_resources found, "
-                "can't generate console script shims.\n"
-                "Use Python 3.8+, or install importlib-metadata or setuptools."
-            ) from exc
-
     maker = distlib.scripts.ScriptMaker(None, bin_path)
     maker.variants = {""}
     maker.clobber = False
 
-    for entry_point in _get_entry_points():
+    for entry_point in _get_entry_points(packages):
         for filename in maker.make(entry_point):
             logger.debug("wrote console_script '%s'", filename)
 
@@ -587,57 +538,6 @@ def pkgname_from_depspec(dep_spec: str) -> str:
     return match.group(0)
 
 
-def _get_path_importlib(package: str) -> Optional[str]:
-    # pylint: disable=import-outside-toplevel
-    # pylint: disable=no-name-in-module
-    # pylint: disable=import-error
-    try:
-        # First preference: Python 3.8+ stdlib
-        from importlib.metadata import (  # type: ignore
-            PackageNotFoundError,
-            distribution,
-        )
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-        # Second preference: Commonly available PyPI backport
-        from importlib_metadata import (  # type: ignore
-            PackageNotFoundError,
-            distribution,
-        )
-
-    try:
-        return str(distribution(package).locate_file("."))
-    except PackageNotFoundError:
-        return None
-
-
-def _get_path_pkg_resources(package: str) -> Optional[str]:
-    # pylint: disable=import-outside-toplevel
-    # Bundled with setuptools; has a good chance of being available.
-    import pkg_resources
-
-    try:
-        return str(pkg_resources.get_distribution(package).location)
-    except pkg_resources.DistributionNotFound:
-        return None
-
-
-def _get_path(package: str) -> Optional[str]:
-    try:
-        return _get_path_importlib(package)
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-
-    try:
-        return _get_path_pkg_resources(package)
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-        raise Ouch(
-            "Neither importlib.metadata nor pkg_resources found. "
-            "Use Python 3.8+, or install importlib-metadata or setuptools."
-        ) from exc
-
-
 def _path_is_prefix(prefix: Optional[str], path: str) -> bool:
     try:
         return (
@@ -647,65 +547,14 @@ def _path_is_prefix(prefix: Optional[str], path: str) -> bool:
         return False
 
 
-def _is_system_package(package: str) -> bool:
-    path = _get_path(package)
-    return path is not None and not (
+def _is_system_package(dist: Distribution) -> bool:
+    path = str(dist.locate_file("."))
+    return not (
         _path_is_prefix(sysconfig.get_path("purelib"), path)
         or _path_is_prefix(sysconfig.get_path("platlib"), path)
     )
 
 
-def _get_version_importlib(package: str) -> Optional[str]:
-    # pylint: disable=import-outside-toplevel
-    # pylint: disable=no-name-in-module
-    # pylint: disable=import-error
-    try:
-        # First preference: Python 3.8+ stdlib
-        from importlib.metadata import (  # type: ignore
-            PackageNotFoundError,
-            distribution,
-        )
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-        # Second preference: Commonly available PyPI backport
-        from importlib_metadata import (  # type: ignore
-            PackageNotFoundError,
-            distribution,
-        )
-
-    try:
-        return str(distribution(package).version)
-    except PackageNotFoundError:
-        return None
-
-
-def _get_version_pkg_resources(package: str) -> Optional[str]:
-    # pylint: disable=import-outside-toplevel
-    # Bundled with setuptools; has a good chance of being available.
-    import pkg_resources
-
-    try:
-        return str(pkg_resources.get_distribution(package).version)
-    except pkg_resources.DistributionNotFound:
-        return None
-
-
-def _get_version(package: str) -> Optional[str]:
-    try:
-        return _get_version_importlib(package)
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-
-    try:
-        return _get_version_pkg_resources(package)
-    except ImportError as exc:
-        logger.debug("%s", str(exc))
-        raise Ouch(
-            "Neither importlib.metadata nor pkg_resources found. "
-            "Use Python 3.8+, or install importlib-metadata or setuptools."
-        ) from exc
-
-
 def diagnose(
     dep_spec: str,
     online: bool,
@@ -731,7 +580,11 @@ def diagnose(
     bad = False
 
     pkg_name = pkgname_from_depspec(dep_spec)
-    pkg_version = _get_version(pkg_name)
+    pkg_version: Optional[str] = None
+    try:
+        pkg_version = version(pkg_name)
+    except PackageNotFoundError:
+        pass
 
     lines = []
 
@@ -868,19 +721,25 @@ def _do_ensure(
         constraint = _make_version_constraint(info, False)
         matcher = distlib.version.LegacyMatcher(name + constraint)
         print(f"mkvenv: checking for {matcher}", file=sys.stderr)
-        ver = _get_version(name)
+
+        dist: Optional[Distribution] = None
+        try:
+            dist = distribution(matcher.name)
+        except PackageNotFoundError:
+            pass
+
         if (
-            ver is None
+            dist is None
             # Always pass installed package to pip, so that they can be
             # updated if the requested version changes
-            or not _is_system_package(name)
-            or not matcher.match(distlib.version.LegacyVersion(ver))
+            or not _is_system_package(dist)
+            or not matcher.match(distlib.version.LegacyVersion(dist.version))
         ):
             absent.append(name + _make_version_constraint(info, True))
             if len(absent) == 1:
                 canary = info.get("canary", None)
         else:
-            logger.info("found %s %s", name, ver)
+            logger.info("found %s %s", name, dist.version)
             present.append(name)
 
     if present:
diff --git a/python/setup.cfg b/python/setup.cfg
index f6d2d8a1362..8c67dce4579 100644
--- a/python/setup.cfg
+++ b/python/setup.cfg
@@ -108,15 +108,6 @@ ignore_missing_imports = True
 [mypy-pygments]
 ignore_missing_imports = True
 
-[mypy-importlib.metadata]
-ignore_missing_imports = True
-
-[mypy-importlib_metadata]
-ignore_missing_imports = True
-
-[mypy-pkg_resources]
-ignore_missing_imports = True
-
 [mypy-distlib]
 ignore_missing_imports = True
 
-- 
2.41.0



  parent reply	other threads:[~2023-09-07 13:07 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-07 12:59 [PULL 00/51] Build system, i386 changes for 2023-09-07 Paolo Bonzini
2023-09-07 12:59 ` [PULL 01/51] linux-user, bsd-user: disable on unsupported host architectures Paolo Bonzini
2023-09-07 12:59 ` [PULL 02/51] target/i386: raise FERR interrupt with iothread locked Paolo Bonzini
2023-09-07 12:59 ` [PULL 03/51] target/i386: generalize operand size "ph" for use in CVTPS2PD Paolo Bonzini
2023-09-07 12:59 ` [PULL 04/51] target/i386: fix memory operand size for CVTPS2PD Paolo Bonzini
2023-09-07 12:59 ` [PULL 05/51] target/i386: Add support for AMX-COMPLEX in CPUID enumeration Paolo Bonzini
2023-09-07 12:59 ` [PULL 06/51] include/sysemu/os-posix.h: move *daemonize* declarations together Paolo Bonzini
2023-09-07 12:59 ` [PULL 07/51] os-posix.c: create and export os_set_runas() Paolo Bonzini
2023-09-07 12:59 ` [PULL 08/51] os-posix.c: create and export os_set_chroot() Paolo Bonzini
2023-09-07 12:59 ` [PULL 09/51] os-posix.c, softmmu/vl.c: move os_parse_cmd_args() into qemu_init() Paolo Bonzini
2023-09-07 12:59 ` [PULL 10/51] os-posix.c: move code around Paolo Bonzini
2023-09-07 12:59 ` [PULL 11/51] os-posix.c: remove unneeded #includes Paolo Bonzini
2023-09-07 12:59 ` [PULL 12/51] softmmu/vl.c: inline include/qemu/qemu-options.h into vl.c Paolo Bonzini
2023-09-07 12:59 ` [PULL 13/51] util/async-teardown.c: move to softmmu/, only build it when system build is requested Paolo Bonzini
2023-09-07 12:59 ` [PULL 14/51] contrib/plugins: remove -soname argument Paolo Bonzini
2023-09-07 12:59 ` [PULL 15/51] contrib/plugins/cache: Fix string format Paolo Bonzini
2023-09-07 12:59 ` [PULL 16/51] contrib/plugins/drcov: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 17/51] contrib/plugins/howvec: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 18/51] contrib/plugins/lockstep: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 19/51] contrib/plugins: add Darwin support Paolo Bonzini
2023-09-07 12:59 ` [PULL 20/51] meson: do not unnecessarily use cmake for dependencies Paolo Bonzini
2023-09-07 12:59 ` [PULL 21/51] meson: update unsupported host/CPU messages Paolo Bonzini
2023-09-07 12:59 ` [PULL 22/51] configure: remove HOST_CC Paolo Bonzini
2023-09-07 12:59 ` [PULL 23/51] configure: create native file with contents of $host_cc Paolo Bonzini
2023-09-07 12:59 ` [PULL 24/51] meson: compile bundled device trees Paolo Bonzini
2023-09-08 16:27   ` Philippe Mathieu-Daudé
2023-09-08 17:20     ` Michael Tokarev
2023-09-08 19:21       ` BALATON Zoltan
2023-09-08 19:40         ` Michael Tokarev
2023-09-08 20:07           ` BALATON Zoltan
2023-09-11 14:48             ` Philippe Mathieu-Daudé
2023-09-11 15:16             ` Peter Maydell
2023-09-07 12:59 ` [PULL 25/51] configure: remove boolean variables for targets Paolo Bonzini
2023-09-07 12:59 ` [PULL 26/51] configure: move --enable-debug-tcg to meson Paolo Bonzini
2023-09-07 12:59 ` [PULL 27/51] contrib/plugins: use an independent makefile Paolo Bonzini
2023-09-07 12:59 ` [PULL 28/51] configure: unify recursion into sub-Makefiles Paolo Bonzini
2023-09-07 12:59 ` [PULL 29/51] configure, meson: move --enable-plugins to meson Paolo Bonzini
2023-09-07 12:59 ` [PULL 30/51] configure, meson: remove CONFIG_SOLARIS from config-host.mak Paolo Bonzini
2023-09-07 12:59 ` [PULL 31/51] configure, meson: remove target OS symbols " Paolo Bonzini
2023-09-07 12:59 ` [PULL 32/51] meson: list leftover CONFIG_* symbols Paolo Bonzini
2023-09-07 12:59 ` [PULL 33/51] configure: remove dead code Paolo Bonzini
2023-09-07 12:59 ` [PULL 34/51] Python: Drop support for Python 3.7 Paolo Bonzini
2023-09-07 12:59 ` Paolo Bonzini [this message]
2023-09-07 12:59 ` [PULL 36/51] Revert "mkvenv: work around broken pip installations on Debian 10" Paolo Bonzini
2023-09-07 12:59 ` [PULL 37/51] hw/i386/pc: Include missing 'sysemu/tcg.h' header Paolo Bonzini
2023-09-07 12:59 ` [PULL 38/51] hw/i386/pc: Include missing 'cpu.h' header Paolo Bonzini
2023-09-07 12:59 ` [PULL 39/51] hw/i386/fw_cfg: " Paolo Bonzini
2023-09-07 12:59 ` [PULL 40/51] target/i386/helper: Restrict KVM declarations to system emulation Paolo Bonzini
2023-09-07 12:59 ` [PULL 41/51] target/i386/cpu-sysemu: Inline kvm_apic_in_kernel() Paolo Bonzini
2023-09-07 12:59 ` [PULL 42/51] target/i386: Remove unused KVM stubs Paolo Bonzini
2023-09-07 12:59 ` [PULL 43/51] target/i386: Allow elision of kvm_enable_x2apic() Paolo Bonzini
2023-09-07 12:59 ` [PULL 44/51] target/i386: Allow elision of kvm_hv_vpindex_settable() Paolo Bonzini
2023-09-07 12:59 ` [PULL 45/51] target/i386: Restrict declarations specific to CONFIG_KVM Paolo Bonzini
2023-09-07 12:59 ` [PULL 46/51] sysemu/kvm: Restrict kvm_arch_get_supported_cpuid/msr() to x86 targets Paolo Bonzini
2023-09-07 12:59 ` [PULL 47/51] sysemu/kvm: Restrict kvm_get_apic_state() " Paolo Bonzini
2023-09-07 12:59 ` [PULL 48/51] sysemu/kvm: Restrict kvm_has_pit_state2() " Paolo Bonzini
2023-09-07 12:59 ` [PULL 49/51] sysemu/kvm: Restrict kvm_pc_setup_irq_routing() " Paolo Bonzini
2023-09-07 12:59 ` [PULL 50/51] subprojects: add wrap file for libblkio Paolo Bonzini
2023-10-11  5:35   ` Philippe Mathieu-Daudé
2023-10-11  8:47     ` Daniel P. Berrangé
2023-10-11 20:58       ` Stefan Hajnoczi
2023-10-12  7:14         ` Daniel P. Berrangé
2023-09-07 13:00 ` [PULL 51/51] docs/system/replay: do not show removed command line option Paolo Bonzini
2023-09-07 15:44 ` [PULL 00/51] Build system, i386 changes for 2023-09-07 Stefan Hajnoczi
2023-09-08 15:01   ` Kevin Wolf
2023-09-08 15:47     ` Stefan Hajnoczi
2023-09-11 10:10       ` Philippe Mathieu-Daudé
2023-09-11 10:22         ` Philippe Mathieu-Daudé
2023-09-11 12:12           ` Kevin Wolf
2023-09-11 11:06         ` Stefan Hajnoczi
2023-09-11 12:40           ` Thomas Huth
2023-09-08 16:11     ` Philippe Mathieu-Daudé
2023-09-08 17:16       ` Kevin Wolf
2023-09-08 17:22         ` Daniel P. Berrangé
2023-09-08 17:28         ` Michael Tokarev
2023-09-08 17:28         ` Kevin Wolf
2023-09-08 19:21           ` Paolo Bonzini
2023-09-11 10:11             ` Philippe Mathieu-Daudé
2023-09-11 14:18               ` Philippe Mathieu-Daudé
2023-09-11 10:41             ` Michael Tokarev
2023-09-11 10:44               ` Michael Tokarev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230907130004.500601-36-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).