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
|
From: Andrej Shadura <andrewsh@debian.org>
Date: Wed, 31 Aug 2022 16:59:23 +0200
Subject: Warn users about packages installed from pip
Forwarded: not-needed
---
synapse/util/check_dependencies.py | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/synapse/util/check_dependencies.py b/synapse/util/check_dependencies.py
index 1c79c0b..12b8efa 100644
--- a/synapse/util/check_dependencies.py
+++ b/synapse/util/check_dependencies.py
@@ -34,6 +34,9 @@ from packaging.requirements import Requirement
DISTRIBUTION_NAME = "matrix-synapse"
+pip_reported = False
+
+from importlib import import_module
__all__ = ["check_requirements"]
@@ -178,6 +181,8 @@ def check_requirements(extra: Optional[str] = None) -> None:
:raises ValueError: if this extra does not exist.
"""
# First work out which dependencies are required, and which are optional.
+ global pip_reported
+
if extra is None:
dependencies = _generic_dependencies()
elif extra in RUNTIME_EXTRAS:
@@ -186,11 +191,27 @@ def check_requirements(extra: Optional[str] = None) -> None:
raise ValueError(f"Synapse {VERSION} does not provide the feature '{extra}'")
deps_unfulfilled = []
+ deps_pip = set()
errors = []
+ dist_to_pkg = {}
+
+ for dist in metadata.distributions():
+ for pkg in (dist.read_text('top_level.txt') or '').split():
+ dist_to_pkg[dist.metadata['Name']] = pkg
+
for requirement, must_be_installed in dependencies:
try:
dist: metadata.Distribution = metadata.distribution(requirement.name)
+ n = dist_to_pkg.get(requirement.name) or requirement.name.replace('-', '_')
+ n = n.split('/')[0]
+ try:
+ m = import_module(n)
+ if not (m.__file__.startswith("/usr/lib") or
+ m.__file__.startswith("/usr/share")):
+ deps_pip.add(requirement.name)
+ except ModuleNotFoundError:
+ pass
except metadata.PackageNotFoundError:
if must_be_installed:
deps_unfulfilled.append(requirement.name)
@@ -211,6 +232,18 @@ def check_requirements(extra: Optional[str] = None) -> None:
deps_unfulfilled.append(requirement.name)
errors.append(_incorrect_version(requirement, dist.version, extra))
+ if deps_pip and not pip_reported:
+ logger.warning("\n".join(
+ [
+ "The following packages were not installed from the distribution packages:",
+ "",
+ " %s" % (" ".join(deps_pip),),
+ "",
+ "If synapse fails to start, remove these packages using pip.",
+ ]
+ ))
+ pip_reported = True
+
if deps_unfulfilled:
for err in errors:
logger.error(err)
|