Skip to content

Commit a5d0e52

Browse files
authored
chore: deprecated Gradle internal VersionNumber not used
* Do not use deprecated gradle internal VersionNumber This fixes caused deprecation warnings and incompatibility with Gradle => 8.1 * Tweak comment * Simplify VersionNumber to usecases of this plugin * Minor test polishing
1 parent 542e72d commit a5d0e52

File tree

4 files changed

+152
-2
lines changed

4 files changed

+152
-2
lines changed

src/main/groovy/com/avast/gradle/dockercompose/ComposeExecutor.groovy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import org.gradle.api.services.BuildServiceParameters
1414
import org.gradle.internal.UncheckedException
1515
import org.gradle.process.ExecOperations
1616
import org.gradle.process.ExecSpec
17-
import org.gradle.util.VersionNumber
1817
import org.yaml.snakeyaml.Yaml
1918

2019
import javax.inject.Inject
2120
import java.lang.ref.WeakReference
2221
import java.util.concurrent.ConcurrentHashMap
2322
import java.util.concurrent.Executors
2423

24+
import com.avast.gradle.dockercompose.util.VersionNumber
25+
2526
abstract class ComposeExecutor implements BuildService<Parameters>, AutoCloseable {
2627
static interface Parameters extends BuildServiceParameters {
2728
abstract DirectoryProperty getProjectDirectory()

src/main/groovy/com/avast/gradle/dockercompose/tasks/ComposeDownForced.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package com.avast.gradle.dockercompose.tasks
33
import com.avast.gradle.dockercompose.ComposeExecutor
44
import com.avast.gradle.dockercompose.RemoveImages
55
import com.avast.gradle.dockercompose.ServiceInfoCache
6+
import com.avast.gradle.dockercompose.util.VersionNumber
67
import org.gradle.api.DefaultTask
78
import org.gradle.api.file.RegularFileProperty
89
import org.gradle.api.provider.ListProperty
910
import org.gradle.api.provider.Property
1011
import org.gradle.api.tasks.Internal
1112
import org.gradle.api.tasks.TaskAction
12-
import org.gradle.util.VersionNumber
1313

1414
import java.time.Duration
1515

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.avast.gradle.dockercompose.util;
2+
3+
import javax.annotation.Nullable;
4+
import java.util.Objects;
5+
6+
/**
7+
* This class is a simplified version of the deprecated org.gradle.util.VersionNumber class
8+
* See https://github.com/gradle/gradle/blob/7d8cacafe70e5c4cc06173550cb13511cfbf3749/subprojects/core/src/main/java/org/gradle/util/VersionNumber.java
9+
* causing compatibility issues with Gradle 8.1 onwards.
10+
*/
11+
public class VersionNumber implements Comparable<VersionNumber> {
12+
public static final VersionNumber UNKNOWN = new VersionNumber(0, 0, 0);
13+
14+
private final int major;
15+
private final int minor;
16+
private final int micro;
17+
18+
private VersionNumber(int major, int minor, int micro) {
19+
this.major = major;
20+
this.minor = minor;
21+
this.micro = micro;
22+
}
23+
24+
@Override
25+
public int compareTo(VersionNumber other) {
26+
if (major != other.major) {
27+
return major - other.major;
28+
}
29+
if (minor != other.minor) {
30+
return minor - other.minor;
31+
}
32+
if (micro != other.micro) {
33+
return micro - other.micro;
34+
}
35+
return 0;
36+
}
37+
38+
@Override
39+
public boolean equals(@Nullable Object other) {
40+
return other instanceof VersionNumber && compareTo((VersionNumber) other) == 0;
41+
}
42+
43+
@Override
44+
public int hashCode() {
45+
return Objects.hash(major, minor, micro);
46+
}
47+
48+
@Override
49+
public String toString() {
50+
return String.format("%d.%d.%d", major, minor, micro);
51+
}
52+
53+
public static VersionNumber parse(String versionString) {
54+
if (versionString == null || versionString.length() == 0) {
55+
return UNKNOWN;
56+
}
57+
Scanner scanner = new Scanner(versionString);
58+
59+
int major = 0;
60+
int minor = 0;
61+
int micro = 0;
62+
63+
if (!scanner.hasDigit()) {
64+
return UNKNOWN;
65+
}
66+
major = scanner.scanDigit();
67+
if (scanner.isSeparatorAndDigit()) {
68+
scanner.skipSeparator();
69+
minor = scanner.scanDigit();
70+
if (scanner.isSeparatorAndDigit()) {
71+
scanner.skipSeparator();
72+
micro = scanner.scanDigit();
73+
}
74+
}
75+
76+
if (scanner.isEnd()) {
77+
return new VersionNumber(major, minor, micro);
78+
}
79+
80+
return UNKNOWN;
81+
}
82+
83+
private static class Scanner {
84+
int pos;
85+
final String str;
86+
87+
private Scanner(String string) {
88+
this.str = string;
89+
}
90+
91+
boolean hasDigit() {
92+
return pos < str.length() && Character.isDigit(str.charAt(pos));
93+
}
94+
95+
boolean isSeparatorAndDigit() {
96+
return pos < str.length() - 1 && isSeparator() && Character.isDigit(str.charAt(pos + 1));
97+
}
98+
99+
private boolean isSeparator() {
100+
return str.charAt(pos) == '.';
101+
}
102+
103+
int scanDigit() {
104+
int start = pos;
105+
while (hasDigit()) {
106+
pos++;
107+
}
108+
return Integer.parseInt(str.substring(start, pos));
109+
}
110+
111+
public boolean isEnd() {
112+
return pos == str.length();
113+
}
114+
115+
public void skipSeparator() {
116+
pos++;
117+
}
118+
}
119+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.avast.gradle.dockercompose.util
2+
3+
import spock.lang.Specification
4+
import spock.lang.Unroll
5+
6+
import static com.avast.gradle.dockercompose.util.VersionNumber.parse
7+
8+
class VersionNumberTest extends Specification {
9+
10+
@Unroll
11+
def "can compare version #a and #b"() {
12+
expect:
13+
parse(a) <=> parse(b) == expected
14+
where:
15+
a | b | expected
16+
"0.0.1" | "0.0.1" | 0
17+
"0.0.1" | "0.0.2" | -1
18+
"0.0.2" | "0.0.1" | 1
19+
"0.1.0" | "0.1.0" | 0
20+
"0.1.0" | "0.1.0" | 0
21+
"1.1.1" | "1.1.1" | 0
22+
"1.1.0" | "1.2.0" | -1
23+
"1.28.0" | "1.16.0" | 1
24+
}
25+
26+
def "handles non parseable versions as UNKNOWN"() {
27+
expect:
28+
parse("SomeInvalid") == VersionNumber.UNKNOWN
29+
}
30+
}

0 commit comments

Comments
 (0)