Skip to content

Commit 637ac8f

Browse files
authored
Fix version comparison logic for pre-release/snapshot/rc variants (#6483)
Pre-release, snapshot, and RC variants should be considered lower than the base release version. Updated test assertions and comparison logic to reflect that release versions are higher than their dev variants (snapshot < pre < rc < release).
1 parent 218e004 commit 637ac8f

2 files changed

Lines changed: 44 additions & 33 deletions

File tree

Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,9 @@ public boolean isSnapshot() {
374374

375375
/**
376376
* Checks if this version has the same base version (major, minor, and patch)
377-
* as the given version, ignoring development specifiers (snapshot release, pre-release,
378-
* release candidate, paper build numbers) and Bukkit metadata (revision).
379-
* Revision is ignored because Paper versions do not include the Bukkit revision
380-
* suffix (e.g. {@code -R0.1-SNAPSHOT}).
381-
* This is used to match development builds against their target release version.
377+
* as the given version, ignoring development specifiers and Bukkit metadata.
378+
* Revision is ignored because Paper versions do not include the Bukkit
379+
* revision suffix (e.g. {@code -R0.1-SNAPSHOT}).
382380
*/
383381
public boolean equalsBaseVersion(final BukkitVersion other) {
384382
if (this.snapshot || other.snapshot) {
@@ -449,6 +447,13 @@ public String toString() {
449447
return sb.append("-R").append(revision).toString();
450448
}
451449

450+
private static int compareDevSpecifier(final int a, final int b) {
451+
if (a == b) return 0;
452+
if (a == -1) return 1;
453+
if (b == -1) return -1;
454+
return Integer.compare(a, b);
455+
}
456+
452457
@Override
453458
public int compareTo(final BukkitVersion o) {
454459
// Snapshots are always considered the most recent
@@ -484,30 +489,20 @@ public int compareTo(final BukkitVersion o) {
484489
} else if (patch > o.patch) {
485490
return 1;
486491
} else { // equal patch
487-
if (snapshotRelease < o.snapshotRelease) {
492+
// For dev specifiers, -1 means absent (final release) and
493+
// sorts HIGHER than any present value: snapshot < pre < rc < release
494+
int cmp = compareDevSpecifier(snapshotRelease, o.snapshotRelease);
495+
if (cmp != 0) return cmp;
496+
cmp = compareDevSpecifier(preRelease, o.preRelease);
497+
if (cmp != 0) return cmp;
498+
cmp = compareDevSpecifier(releaseCandidate, o.releaseCandidate);
499+
if (cmp != 0) return cmp;
500+
if (paperBuild < o.paperBuild) {
488501
return -1;
489-
} else if (snapshotRelease > o.snapshotRelease) {
502+
} else if (paperBuild > o.paperBuild) {
490503
return 1;
491-
} else { // equal snapshot release
492-
if (preRelease < o.preRelease) {
493-
return -1;
494-
} else if (preRelease > o.preRelease) {
495-
return 1;
496-
} else { // equal prerelease
497-
if (releaseCandidate < o.releaseCandidate) {
498-
return -1;
499-
} else if (releaseCandidate > o.releaseCandidate) {
500-
return 1;
501-
} else { // equal release candidate
502-
if (paperBuild < o.paperBuild) {
503-
return -1;
504-
} else if (paperBuild > o.paperBuild) {
505-
return 1;
506-
} else { // equal paper build
507-
return Double.compare(revision, o.revision);
508-
}
509-
}
510-
}
504+
} else {
505+
return Double.compare(revision, o.revision);
511506
}
512507
}
513508
}

Essentials/src/test/java/com/earth2me/essentials/UtilTest.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,17 @@ public void testVer() {
303303
.isLowerThan(VersionUtil.BukkitVersion.fromString("26.1-pre-1-R0.1-SNAPSHOT")));
304304
assertTrue(VersionUtil.BukkitVersion.fromString("1.21.11-R0.1-SNAPSHOT")
305305
.isLowerThan(VersionUtil.BukkitVersion.fromString("26.1-rc-1-R0.1-SNAPSHOT")));
306-
// Dev variants are considered higher than their base version (for feature checks)
307-
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-snapshot-1-R0.1-SNAPSHOT")
308-
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")));
309-
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-pre-1-R0.1-SNAPSHOT")
310-
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")));
306+
// Base release is higher than dev variants: snapshot < pre < rc < release
307+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")
308+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-snapshot-1-R0.1-SNAPSHOT")));
309+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")
310+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-pre-1-R0.1-SNAPSHOT")));
311+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")
312+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-rc-1-R0.1-SNAPSHOT")));
311313
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-rc-1-R0.1-SNAPSHOT")
312-
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")));
314+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-pre-1-R0.1-SNAPSHOT")));
315+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-pre-1-R0.1-SNAPSHOT")
316+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-snapshot-1-R0.1-SNAPSHOT")));
313317
// Dev variants of 26.1 are lower than 26.2
314318
assertTrue(VersionUtil.BukkitVersion.fromString("26.1-snapshot-99-R0.1-SNAPSHOT")
315319
.isLowerThan(VersionUtil.BukkitVersion.fromString("26.2-R0.1-SNAPSHOT")));
@@ -441,5 +445,17 @@ public void testVer() {
441445
VersionUtil.BukkitVersion.fromString("26.1.build.99-recommended"));
442446
assertEquals(VersionUtil.BukkitVersion.fromString("26.1-rc-3.build.8-alpha"),
443447
VersionUtil.BukkitVersion.fromString("26.1-rc-3-R0.0"));
448+
// Patch release with Paper build does not match different patch via equalsBaseVersion
449+
assertFalse(VersionUtil.BukkitVersion.fromString("26.1.1.build.14-alpha")
450+
.equalsBaseVersion(VersionUtil.BukkitVersion.fromString("26.1-R0.1-SNAPSHOT")));
451+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1.1.build.14-alpha")
452+
.equalsBaseVersion(VersionUtil.BukkitVersion.fromString("26.1.1-R0.1-SNAPSHOT")));
453+
// Base release paper build is higher than rc/pre/snapshot paper builds
454+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1.build.5-alpha")
455+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-rc-3.build.8-alpha")));
456+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1.build.1-alpha")
457+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-pre-1.build.99-alpha")));
458+
assertTrue(VersionUtil.BukkitVersion.fromString("26.1.build.1-alpha")
459+
.isHigherThan(VersionUtil.BukkitVersion.fromString("26.1-snapshot-99.build.99-alpha")));
444460
}
445461
}

0 commit comments

Comments
 (0)