Skip to content

Commit

Permalink
Prerelease check improvements (#244)
Browse files Browse the repository at this point in the history
* Split out check of alphanumeric prerelease into its own function and improved check of trailing characters

* Fixing code linter issue
  • Loading branch information
severn-everett committed Apr 17, 2024
1 parent edbbf5c commit 671d9c6
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 15 deletions.
43 changes: 28 additions & 15 deletions src/main/java/org/semver4j/internal/Comparator.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.semver4j.internal;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.semver4j.Semver;

import java.util.List;
Expand Down Expand Up @@ -90,21 +91,9 @@ private int compareIdentifiers(@NotNull final String a, @NotNull final String b)
}

if (a.matches(CONTAINS_DIGITS) && b.matches(CONTAINS_DIGITS)) {
String[] tokenArr1 = a.split(TRAILING_DIGITS_EXTRACT);
String[] tokenArr2 = b.split(TRAILING_DIGITS_EXTRACT);
if (tokenArr1[0].equals(tokenArr2[0])) {
String[] leadingDigitsArrA = tokenArr1[1].split(LEADING_DIGITS_EXTRACT);
String[] leadingDigitsArrB = tokenArr2[1].split(LEADING_DIGITS_EXTRACT);
long digitA = Long.parseLong(leadingDigitsArrA[0]);
long digitB = Long.parseLong(leadingDigitsArrB[0]);
int digitComparison = Long.compare(digitA, digitB);
if (digitComparison != 0) {
return digitComparison;
} else if (leadingDigitsArrA.length != leadingDigitsArrB.length) {
return leadingDigitsArrA.length - leadingDigitsArrB.length;
} else {
return compareIdentifiers(leadingDigitsArrA[1], leadingDigitsArrB[1]);
}
Integer alphaNumericComparison = checkAlphanumericPrerelease(a, b);
if (alphaNumericComparison != null) {
return alphaNumericComparison;
}
}

Expand All @@ -117,6 +106,30 @@ private int compareIdentifiers(@NotNull final String a, @NotNull final String b)
return 0;
}

@Nullable
private Integer checkAlphanumericPrerelease(@NotNull final String a, @NotNull final String b) {
String[] tokenArrA = a.split(TRAILING_DIGITS_EXTRACT);
String[] tokenArrB = b.split(TRAILING_DIGITS_EXTRACT);
if (tokenArrA[0].equals(tokenArrB[0])) {
String[] leadingDigitsArrA = tokenArrA[1].split(LEADING_DIGITS_EXTRACT);
String[] leadingDigitsArrB = tokenArrB[1].split(LEADING_DIGITS_EXTRACT);
long digitA = Long.parseLong(leadingDigitsArrA[0]);
long digitB = Long.parseLong(leadingDigitsArrB[0]);
int digitComparison = Long.compare(digitA, digitB);
if (digitComparison != 0) {
return digitComparison;
} else if (leadingDigitsArrA.length != leadingDigitsArrB.length) {
return leadingDigitsArrA.length - leadingDigitsArrB.length;
} else {
return compareIdentifiers(
a.substring(a.indexOf(leadingDigitsArrA[0]) + 1),
b.substring(b.indexOf(leadingDigitsArrB[0]) + 1)
);
}
}
return null;
}

@NotNull
private String getString(final int i, @NotNull final List<@NotNull String> list) {
if (list.size() > i) {
Expand Down
1 change: 1 addition & 0 deletions src/test/java/org/semver4j/SemverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@ static Stream<Arguments> greaterThan() {
arguments("1.0.0-beta1a", "1.0.0-beta1", true),
arguments("1.0.0-beta1b", "1.0.0-beta1a", true),
arguments("1.0.16-lp-zc1-bate+fix-zc1", "1.0.16-lp-zc1", true),
arguments("1.0.0-a1a1b", "1.0.0-a1a1a", true),

arguments("1.0.0-alpha", "1.0.0-alpha.1", false),
arguments("1.0.0-alpha.1", "1.0.0-alpha.beta", false),
Expand Down

0 comments on commit 671d9c6

Please sign in to comment.