3 files changed, 22 insertions, 1 deletions
diff --git a/changelog.d/12177.bugfix b/changelog.d/12177.bugfix
new file mode 100644
index 0000000000..3f2852f345
--- /dev/null
+++ b/changelog.d/12177.bugfix
@@ -0,0 +1 @@
+Fix a bug introduced in 1.54.0rc1 which meant that Synapse would refuse to start if pre-release versions of dependencies were installed.
\ No newline at end of file
diff --git a/synapse/util/check_dependencies.py b/synapse/util/check_dependencies.py
index 39b0a91db3..12cd804939 100644
--- a/synapse/util/check_dependencies.py
+++ b/synapse/util/check_dependencies.py
@@ -163,7 +163,8 @@ def check_requirements(extra: Optional[str] = None) -> None:
deps_unfulfilled.append(requirement.name)
errors.append(_not_installed(requirement, extra))
else:
- if not requirement.specifier.contains(dist.version):
+ # We specify prereleases=True to allow prereleases such as RCs.
+ if not requirement.specifier.contains(dist.version, prereleases=True):
deps_unfulfilled.append(requirement.name)
errors.append(_incorrect_version(requirement, dist.version, extra))
diff --git a/tests/util/test_check_dependencies.py b/tests/util/test_check_dependencies.py
index a91c33272f..38e9f58ac6 100644
--- a/tests/util/test_check_dependencies.py
+++ b/tests/util/test_check_dependencies.py
@@ -27,7 +27,9 @@ class DummyDistribution(metadata.Distribution):
old = DummyDistribution("0.1.2")
+old_release_candidate = DummyDistribution("0.1.2rc3")
new = DummyDistribution("1.2.3")
+new_release_candidate = DummyDistribution("1.2.3rc4")
# could probably use stdlib TestCase --- no need for twisted here
@@ -110,3 +112,20 @@ class TestDependencyChecker(TestCase):
with self.mock_installed_package(new):
# should not raise
check_requirements("cool-extra")
+
+ def test_release_candidates_satisfy_dependency(self) -> None:
+ """
+ Tests that release candidates count as far as satisfying a dependency
+ is concerned.
+ (Regression test, see #12176.)
+ """
+ with patch(
+ "synapse.util.check_dependencies.metadata.requires",
+ return_value=["dummypkg >= 1"],
+ ):
+ with self.mock_installed_package(old_release_candidate):
+ self.assertRaises(DependencyException, check_requirements)
+
+ with self.mock_installed_package(new_release_candidate):
+ # should not raise
+ check_requirements()
|