Skip to content

Commit 6beea65

Browse files
fix: misc fixes [macata #101] (#104)
1 parent 9ee607b commit 6beea65

File tree

5 files changed

+163
-51
lines changed

5 files changed

+163
-51
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Java build & test
1+
name: Build & Test
22

33
on: [push]
44

.github/workflows/pre_release_on_develop_merge.yml

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,45 @@
11
name: Pre-release on develop merge
22

33
on:
4-
push:
5-
branches:
6-
- develop
4+
workflow_run:
5+
workflows: ["Build & Test"]
6+
types:
7+
- completed
78

89
jobs:
9-
build-and-test:
10-
runs-on: ubuntu-latest
11-
steps:
12-
- uses: actions/checkout@v3
13-
- name: Set up JDK 18
14-
uses: actions/setup-java@v3
15-
with:
16-
java-version: '18'
17-
distribution: 'adopt'
18-
cache: maven
19-
- name: Cache local Maven repository
20-
uses: actions/cache@v3
21-
with:
22-
path: ~/.m2/repository
23-
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
24-
restore-keys: |
25-
${{ runner.os }}-maven-
26-
- name: Build and Test with Maven
27-
run: mvn verify
28-
2910
build-and-release:
30-
needs: build-and-test
11+
if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'develop' }}
3112
runs-on: ubuntu-latest
3213
steps:
33-
- uses: actions/checkout@v3
14+
- name: Checkout code
15+
uses: actions/checkout@v3
16+
3417
- name: Set up JDK 18
3518
uses: actions/setup-java@v3
3619
with:
3720
java-version: '18'
3821
distribution: 'adopt'
3922
cache: maven
23+
4024
- name: Cache local Maven repository
4125
uses: actions/cache@v3
4226
with:
4327
path: ~/.m2/repository
4428
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
4529
restore-keys: |
4630
${{ runner.os }}-maven-
31+
4732
- name: Build with Maven
4833
run: mvn package
34+
4935
- name: Extract Version from POM
5036
id: extract_version
5137
run: echo "version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_OUTPUT
38+
5239
- name: Generate Timestamp
5340
id: gen_timestamp
5441
run: echo "timestamp=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_OUTPUT
42+
5543
- name: Create Pre-release
5644
id: create_release
5745
uses: actions/create-release@v1
@@ -62,6 +50,7 @@ jobs:
6250
release_name: Pre-release ${{ steps.extract_version.outputs.version }} (${{ steps.gen_timestamp.outputs.timestamp }})
6351
draft: false
6452
prerelease: true
53+
6554
- name: Upload Release Asset
6655
uses: actions/upload-release-asset@v1
6756
env:

src/main/java/com/dazednconfused/catalauncher/update/UpdateManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ public static void openLatestReleaseInDefaultBrowser() {
5555
* Opens the webpage for the given binary release in the official remote repository.
5656
* */
5757
public static void openReleaseInDefaultBrowser(Version tag) {
58-
LOGGER.info("Opening v[{}]'s release's homepage using default browser...", tag);
58+
LOGGER.info("Opening [{}]'s release's homepage using default browser...", tag);
5959

60-
Try.run(() -> openGithubReleaseInDefaultBrowser(GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME, tag.get()))
60+
Try.run(() -> openGithubReleaseInDefaultBrowser(GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME, tag.toString()))
6161
.onFailure(t -> LOGGER.error("There was an error opening the latest release tagged [{}] in remote repository [{}/{}]", tag, GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME, t));
6262
}
6363

@@ -136,7 +136,7 @@ private static String getLatestReleaseTagFromGithub(String owner, String repo, b
136136
* combination.
137137
* */
138138
private static void openGithubReleaseInDefaultBrowser(String owner, String repo, String tag) throws IOException {
139-
String latestReleaseUrl = String.format("https://github.com/%s/%s/releases/tag/v%s", owner, repo, tag);
139+
String latestReleaseUrl = String.format("https://github.com/%s/%s/releases/tag/%s", owner, repo, tag);
140140

141141
Desktop desktop = Desktop.getDesktop();
142142
if (desktop.isSupported(Desktop.Action.BROWSE)) {

src/main/java/com/dazednconfused/catalauncher/update/Version.java

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,30 @@
55
import java.util.regex.Pattern;
66

77
/**
8+
* Represents a version with optional pre-release information. This class supports semantic versioning and pre-release tags.
9+
* <br/><br/>
10+
* Examples of valid version strings:
11+
* <ul>
12+
* <li>{@code v1.2.3}</li>
13+
* <li>{@code prerelease-1.2.3-YYYYmmDD_HHmmSS}</li>
14+
* </ul>
15+
*
816
* @see <a href="https://stackoverflow.com/a/11024200">https://stackoverflow.com/a/11024200</a>
9-
* */
17+
*
18+
*/
1019
public class Version implements Comparable<Version> {
1120

1221
private static final Pattern VERSION_PATTERN = Pattern.compile("^(?:prerelease-)?v?([0-9]+(\\.[0-9]+)*)(?:-(.+))?$");
22+
private static final String PRERELEASE_PREFIX = "prerelease-";
1323

1424
private final String semver;
1525
private final String preReleaseTag;
1626
private final boolean isPreRelease;
1727

18-
public String get() {
19-
return this.semver;
20-
}
21-
22-
public String getPreReleaseTag() {
23-
return this.preReleaseTag;
24-
}
25-
26-
public boolean isPreRelease() {
27-
return this.isPreRelease;
28-
}
29-
3028
/**
31-
* Constructs a Version object from a version string.
32-
*
33-
* @param versionString the version string, e.g., "v1.2.3", "prerelease-v1.2.3-alpha", etc.
29+
* Constructs a {@link Version} object from a version string.
3430
*
31+
* @param versionString the version string, e.g., "v1.2.3", "prerelease-v1.2.3-alpha", etc
3532
* @throws IllegalArgumentException if the version string is null or does not match the expected format
3633
*/
3734
public Version(String versionString) {
@@ -42,11 +39,38 @@ public Version(String versionString) {
4239
if (!matcher.matches()) {
4340
throw new IllegalArgumentException("Invalid version format");
4441
}
45-
this.isPreRelease = versionString.startsWith("prerelease-");
42+
this.isPreRelease = versionString.startsWith(PRERELEASE_PREFIX);
4643
this.semver = matcher.group(1);
4744
this.preReleaseTag = matcher.group(3);
4845
}
4946

47+
/**
48+
* Returns the semantic version of the {@link Version}.
49+
*
50+
* @return The semantic version (ie: {@code 1.2.3})
51+
*/
52+
public String getSemver() {
53+
return this.semver;
54+
}
55+
56+
/**
57+
* Returns the pre-release tag of the {@link Version}.
58+
*
59+
* @return The pre-release tag, or {@code null} if not a pre-release
60+
*/
61+
public String getPreReleaseTag() {
62+
return this.preReleaseTag;
63+
}
64+
65+
/**
66+
* Checks if the {@link Version} is a pre-release.
67+
*
68+
* @return {@code true} if the version is a pre-release, {@code false} otherwise
69+
*/
70+
public boolean isPreRelease() {
71+
return this.isPreRelease;
72+
}
73+
5074
@Override
5175
public int compareTo(Version that) {
5276
if (that == null) {
@@ -107,11 +131,20 @@ public int hashCode() {
107131
return Objects.hash(semver, preReleaseTag, isPreRelease);
108132
}
109133

134+
/**
135+
* Returns the full version string.
136+
*
137+
* @return "v" followed by the semantic version if not a pre-release (ie: {@code v1.2.3}); or "prerelease-" followed
138+
* by the semantic version and pre-release tag if it is a pre-release (ie: {@code prerelease-1.2.3-YYYYmmDD_HHmmSS}).
139+
*/
110140
@Override
111141
public String toString() {
112-
if (isPreRelease && preReleaseTag != null) {
113-
return "prerelease-" + semver + "-" + preReleaseTag;
142+
if (isPreRelease) {
143+
if (preReleaseTag != null) {
144+
return PRERELEASE_PREFIX + semver + "-" + preReleaseTag;
145+
}
146+
return PRERELEASE_PREFIX + semver;
114147
}
115-
return semver;
148+
return "v" + this.semver;
116149
}
117150
}

src/test/java/update/VersionTest.java

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package update;
22

33
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
45

56
import com.dazednconfused.catalauncher.update.Version;
67

@@ -56,8 +57,8 @@ void versions_comparable_in_collections_success() {
5657
versions.add(new Version("1.01.0"));
5758
versions.add(new Version("1.00.1"));
5859

59-
assertThat(Collections.min(versions).get()).isEqualTo("1.00.1");
60-
assertThat(Collections.max(versions).get()).isEqualTo("2");
60+
assertThat(Collections.min(versions).getSemver()).isEqualTo("1.00.1");
61+
assertThat(Collections.max(versions).getSemver()).isEqualTo("2");
6162
}
6263

6364
@Test
@@ -75,4 +76,93 @@ void versions_is_compatible_with_v_prefix() {
7576

7677
assertThat(a.equals(b)).isTrue();
7778
}
79+
80+
@Test
81+
void version_with_prerelease_is_lower_than_release() {
82+
Version prerelease = new Version("prerelease-1.0.0-alpha");
83+
Version release = new Version("1.0.0");
84+
85+
assertThat(prerelease.compareTo(release)).isEqualTo(-1); // (prerelease < release)
86+
assertThat(prerelease).isNotEqualTo(release);
87+
}
88+
89+
@Test
90+
void version_with_prerelease_tags_are_compared_lexicographically() {
91+
Version alpha = new Version("prerelease-1.0.0-alpha");
92+
Version beta = new Version("prerelease-1.0.0-beta");
93+
94+
assertThat(alpha.compareTo(beta)).isEqualTo(-1); // (alpha < beta)
95+
assertThat(alpha).isNotEqualTo(beta);
96+
}
97+
98+
@Test
99+
void version_with_prerelease_and_no_tag_is_lower_than_with_tag() {
100+
Version noTag = new Version("prerelease-1.0.0");
101+
Version withTag = new Version("prerelease-1.0.0-alpha");
102+
103+
assertThat(noTag.compareTo(withTag)).isEqualTo(-1); // (noTag < withTag)
104+
assertThat(noTag).isNotEqualTo(withTag);
105+
}
106+
107+
@Test
108+
void version_with_invalid_format_throws_exception() {
109+
assertThatThrownBy(() -> new Version("invalid-version"))
110+
.isInstanceOf(IllegalArgumentException.class)
111+
.hasMessage("Invalid version format");
112+
}
113+
114+
@Test
115+
void version_with_null_string_throws_exception() {
116+
assertThatThrownBy(() -> new Version(null))
117+
.isInstanceOf(IllegalArgumentException.class)
118+
.hasMessage("Version cannot be null");
119+
}
120+
121+
@Test
122+
void version_with_extra_zeroes_in_prerelease_tag_is_not_equal() {
123+
Version a = new Version("prerelease-1.0.0-alpha");
124+
Version b = new Version("prerelease-1.0.0-alpha.0");
125+
126+
assertThat(a).isNotEqualTo(b);
127+
}
128+
129+
@Test
130+
void version_with_prerelease_and_same_base_version_is_equal() {
131+
Version a = new Version("prerelease-1.0.0");
132+
Version b = new Version("prerelease-1.0.0");
133+
134+
assertThat(a.compareTo(b)).isEqualTo(0); // (a == b)
135+
assertThat(a.equals(b)).isTrue();
136+
}
137+
138+
@Test
139+
void version_toString_returns_expected_for_release() {
140+
Version v = new Version("1.2.3");
141+
assertThat(v.toString()).hasToString("v1.2.3");
142+
}
143+
144+
@Test
145+
void version_toString_returns_expected_for_release_with_v_prefix() {
146+
Version v = new Version("v2.0.1");
147+
assertThat(v.toString()).hasToString("v2.0.1");
148+
}
149+
150+
@Test
151+
void version_toString_returns_expected_for_prerelease_with_tag() {
152+
Version v = new Version("prerelease-1.2.3-alpha");
153+
assertThat(v.toString()).hasToString("prerelease-1.2.3-alpha");
154+
}
155+
156+
@Test
157+
void version_toString_returns_expected_for_prerelease_with_complex_tag() {
158+
Version v = new Version("prerelease-1.2.3-20240601_123456");
159+
assertThat(v.toString()).hasToString("prerelease-1.2.3-20240601_123456");
160+
}
161+
162+
@Test
163+
void version_toString_returns_expected_for_prerelease_without_tag() {
164+
Version v = new Version("prerelease-1.2.3");
165+
assertThat(v.toString()).hasToString("prerelease-1.2.3");
166+
}
167+
78168
}

0 commit comments

Comments
 (0)