This is an automated email from the ASF dual-hosted git repository.
hepin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko.git
The following commit(s) were added to refs/heads/main by this push:
new f86d79ba3c Compare required RC and M versions if present (#2441)
f86d79ba3c is described below
commit f86d79ba3cc363bae7b2e0ca57237eca1ecc64d0
Author: Philippus Baalman <[email protected]>
AuthorDate: Sat Nov 8 00:49:44 2025 +0100
Compare required RC and M versions if present (#2441)
---
.../scala/org/apache/pekko/PekkoVersionSpec.scala | 15 +++++++++
.../main/scala/org/apache/pekko/PekkoVersion.scala | 38 ++++++++++++++++------
2 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/actor-tests/src/test/scala/org/apache/pekko/PekkoVersionSpec.scala
b/actor-tests/src/test/scala/org/apache/pekko/PekkoVersionSpec.scala
index 31be1f45a9..3e2fb926b9 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/PekkoVersionSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/PekkoVersionSpec.scala
@@ -29,22 +29,37 @@ class PekkoVersionSpec extends AnyWordSpec with Matchers {
"succeed if version is RC and ok" in {
PekkoVersion.require("PekkoVersionSpec", "2.5.6", "2.5.7-RC10")
PekkoVersion.require("PekkoVersionSpec", "2.6.0-RC1", "2.6.0-RC1")
+ PekkoVersion.require("PekkoVersionSpec", "2.6.0-RC1", "2.6.0-RC2")
+ PekkoVersion.require("PekkoVersionSpec", "2.6.0-RC1", "2.7.0")
}
"fail if version is RC and not ok" in {
intercept[UnsupportedPekkoVersion] {
PekkoVersion.require("PekkoVersionSpec", "2.5.6", "2.5.6-RC1")
}
+ intercept[UnsupportedPekkoVersion] {
+ PekkoVersion.require("PekkoVersionSpec", "2.5.6-RC2", "2.5.6-RC1")
+ }
}
"succeed if version is milestone and ok" in {
PekkoVersion.require("PekkoVersionSpec", "2.5.6", "2.5.7-M10")
+ PekkoVersion.require("PekkoVersionSpec", "2.5.7-M9", "2.5.7-M9")
+ PekkoVersion.require("PekkoVersionSpec", "2.5.7-M9", "2.5.7-M10")
+ PekkoVersion.require("PekkoVersionSpec", "2.5.7-M9", "2.5.8")
+ PekkoVersion.require("PekkoVersionSpec", "2.5.7-M9", "2.5.7-RC1")
}
"fail if version is milestone and not ok" in {
intercept[UnsupportedPekkoVersion] {
PekkoVersion.require("PekkoVersionSpec", "2.5.6", "2.5.6-M1")
}
+ intercept[UnsupportedPekkoVersion] {
+ PekkoVersion.require("PekkoVersionSpec", "2.5.7-M10", "2.5.7-M9")
+ }
+ intercept[UnsupportedPekkoVersion] {
+ PekkoVersion.require("PekkoVersionSpec", "2.5.7-RC1", "2.5.7-M9")
+ }
}
"fail if major version is different" in {
diff --git a/actor/src/main/scala/org/apache/pekko/PekkoVersion.scala
b/actor/src/main/scala/org/apache/pekko/PekkoVersion.scala
index c7fab1dcb2..d44c5a6d9a 100644
--- a/actor/src/main/scala/org/apache/pekko/PekkoVersion.scala
+++ b/actor/src/main/scala/org/apache/pekko/PekkoVersion.scala
@@ -39,20 +39,38 @@ object PekkoVersion {
@InternalApi
private[pekko] def require(libraryName: String, requiredVersion: String,
currentVersion: String): Unit = {
if (requiredVersion != currentVersion) {
- val VersionPattern = """(\d+)\.(\d+)\.(\d+)(-(?:M|RC)\d+)?""".r
+ val VersionPattern = """(\d+)\.(\d+)\.(\d+)(?:-(M|RC)(\d+))?""".r
currentVersion match {
- case VersionPattern(currentMajorStr, currentMinorStr, currentPatchStr,
mOrRc) =>
+ case VersionPattern(currentMajorStr, currentMinorStr, currentPatchStr,
mOrRc, mOrRcNrStr) =>
requiredVersion match {
- case requiredVersion @ VersionPattern(requiredMajorStr,
requiredMinorStr, requiredPatchStr, _) =>
- // a M or RC is basically in-between versions, so offset
- val currentPatch =
- if (mOrRc ne null) currentPatchStr.toInt - 1
- else currentPatchStr.toInt
- if (requiredMajorStr.toInt != currentMajorStr.toInt ||
- requiredMinorStr.toInt > currentMinorStr.toInt ||
- (requiredMinorStr == currentMinorStr && requiredPatchStr.toInt
> currentPatch))
+ case requiredVersion @ VersionPattern(
+ requiredMajorStr,
+ requiredMinorStr,
+ requiredPatchStr,
+ requiredMorRc,
+ requiredMOrRcNrStr) =>
+ def throwUnsupported() =
throw new UnsupportedPekkoVersion(
s"Current version of Pekko is [$currentVersion], but
$libraryName requires version [$requiredVersion]")
+ if (requiredMajorStr == currentMajorStr) {
+ if (requiredMinorStr == currentMinorStr) {
+ if (requiredPatchStr == currentPatchStr) {
+ if (requiredMorRc == null && mOrRc != null)
+ throwUnsupported() // require final but actual is M or RC
+ else if (requiredMorRc != null) {
+ (requiredMorRc, requiredMOrRcNrStr, mOrRc, mOrRcNrStr)
match {
+ case ("M", reqN, "M", n) => if (reqN.toInt >
n.toInt) throwUnsupported()
+ case ("M", _, "RC", _) => // RC > M, ok!
+ case ("RC", _, "M", _) => throwUnsupported()
+ case ("RC", reqN, "RC", n) => if (reqN.toInt >
n.toInt) throwUnsupported()
+ case (_, _, null, _) => // requirement on RC or
M but actual is final, ok!
+ case unexpected =>
+ throw new IllegalArgumentException(s"Should never
happen, comparing M/RC: $unexpected")
+ }
+ } // same versions, ok!
+ } else if (requiredPatchStr.toInt > currentPatchStr.toInt)
throwUnsupported()
+ } else if (requiredMinorStr.toInt > currentMinorStr.toInt)
throwUnsupported()
+ } else throwUnsupported() // major diff
case _ => // SNAPSHOT or unknown - you're on your own
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]