File size: 2,818 Bytes
9438a57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.util.Objects;

/**
 * Anlamsal sürüm (MAJOR.MINOR.PATCH[-önsürüm]) ayrıştırma ve karşılaştırma.
 * Önsürümlü bir sürüm, aynı çekirdek sürümden önce gelir (1.0.0-rc.1 < 1.0.0).
 */
public final class SemVer implements Comparable<SemVer> {
    private final int major;
    private final int minor;
    private final int patch;
    private final String pre;

    public SemVer(int major, int minor, int patch, String pre) {
        if (major < 0 || minor < 0 || patch < 0) {
            throw new IllegalArgumentException("Sürüm numaraları negatif olamaz");
        }
        this.major = major;
        this.minor = minor;
        this.patch = patch;
        this.pre = pre == null ? "" : pre;
    }

    public static SemVer parse(String text) {
        if (text == null || text.isBlank()) {
            throw new IllegalArgumentException("Boş sürüm");
        }
        String core = text.trim();
        String pre = "";
        int dash = core.indexOf('-');
        if (dash >= 0) {
            pre = core.substring(dash + 1);
            core = core.substring(0, dash);
        }
        String[] parts = core.split("\\.");
        if (parts.length != 3) {
            throw new IllegalArgumentException("MAJOR.MINOR.PATCH bekleniyor: " + text);
        }
        try {
            return new SemVer(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]),
                    Integer.parseInt(parts[2]), pre);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Sayısal olmayan bileşen: " + text);
        }
    }

    public SemVer bumpMajor() {
        return new SemVer(major + 1, 0, 0, "");
    }

    public SemVer bumpMinor() {
        return new SemVer(major, minor + 1, 0, "");
    }

    public SemVer bumpPatch() {
        return new SemVer(major, minor, patch + 1, "");
    }

    public boolean isPreRelease() {
        return !pre.isEmpty();
    }

    @Override
    public int compareTo(SemVer o) {
        if (major != o.major) {
            return Integer.compare(major, o.major);
        }
        if (minor != o.minor) {
            return Integer.compare(minor, o.minor);
        }
        if (patch != o.patch) {
            return Integer.compare(patch, o.patch);
        }
        if (pre.isEmpty() || o.pre.isEmpty()) {
            return Boolean.compare(pre.isEmpty(), o.pre.isEmpty());
        }
        return pre.compareTo(o.pre);
    }

    @Override
    public boolean equals(Object x) {
        return x instanceof SemVer && compareTo((SemVer) x) == 0;
    }

    @Override
    public int hashCode() {
        return Objects.hash(major, minor, patch, pre);
    }

    @Override
    public String toString() {
        return major + "." + minor + "." + patch + (pre.isEmpty() ? "" : "-" + pre);
    }
}