2
2
3
3
# # semantic version numbers (http://semver.org)
4
4
5
+ const VInt = UInt32
6
+
5
7
struct VersionNumber
6
- major:: Int
7
- minor:: Int
8
- patch:: Int
9
- prerelease:: Tuple{Vararg{Union{Int ,String}}}
10
- build:: Tuple{Vararg{Union{Int ,String}}}
11
-
12
- function VersionNumber (major:: Int , minor:: Int , patch:: Int ,
13
- pre:: Tuple{Vararg{Union{Int ,String}}} ,
14
- bld:: Tuple{Vararg{Union{Int ,String}}} )
8
+ major:: VInt
9
+ minor:: VInt
10
+ patch:: VInt
11
+ prerelease:: Tuple{Vararg{Union{UInt64 ,String}}}
12
+ build:: Tuple{Vararg{Union{UInt64 ,String}}}
13
+
14
+ function VersionNumber (major:: VInt , minor:: VInt , patch:: VInt ,
15
+ pre:: Tuple{Vararg{Union{UInt64 ,String}}} ,
16
+ bld:: Tuple{Vararg{Union{UInt64 ,String}}} )
15
17
major >= 0 || throw (ArgumentError (" invalid negative major version: $major " ))
16
18
minor >= 0 || throw (ArgumentError (" invalid negative minor version: $minor " ))
17
19
patch >= 0 || throw (ArgumentError (" invalid negative patch version: $patch " ))
18
20
for ident in pre
19
- if isa ( ident,Int)
21
+ if ident isa Integer
20
22
ident >= 0 || throw (ArgumentError (" invalid negative pre-release identifier: $ident " ))
21
23
else
22
24
if ! ismatch (r" ^(?:|[0-9a-z-]*[a-z-][0-9a-z-]*)$" i , ident) ||
@@ -26,7 +28,7 @@ struct VersionNumber
26
28
end
27
29
end
28
30
for ident in bld
29
- if isa ( ident,Int)
31
+ if ident isa Integer
30
32
ident >= 0 || throw (ArgumentError (" invalid negative build identifier: $ident " ))
31
33
else
32
34
if ! ismatch (r" ^(?:|[0-9a-z-]*[a-z-][0-9a-z-]*)$" i , ident) ||
41
43
VersionNumber (major:: Integer , minor:: Integer = 0 , patch:: Integer = 0 ,
42
44
pre:: Tuple{Vararg{Union{Integer,AbstractString}}} = (),
43
45
bld:: Tuple{Vararg{Union{Integer,AbstractString}}} = ()) =
44
- VersionNumber (Int (major), Int (minor), Int (patch),
45
- map (x-> isa (x, Integer) ? Int (x) : String (x), pre),
46
- map (x-> isa (x, Integer) ? Int (x) : String (x), bld))
46
+ VersionNumber (VInt (major), VInt (minor), VInt (patch),
47
+ map (x-> x isa Integer ? UInt64 (x) : String (x), pre),
48
+ map (x-> x isa Integer ? UInt64 (x) : String (x), bld))
47
49
48
50
function print (io:: IO , v:: VersionNumber )
49
51
v == typemax (VersionNumber) && return print (io, " ∞" )
@@ -82,7 +84,7 @@ function split_idents(s::AbstractString)
82
84
idents = split (s, ' .' )
83
85
ntuple (length (idents)) do i
84
86
ident = idents[i]
85
- ismatch (r" ^\d +$" , ident) ? parse (Int , ident) : String (ident)
87
+ ismatch (r" ^\d +$" , ident) ? parse (UInt64 , ident) : String (ident)
86
88
end
87
89
end
88
90
@@ -91,9 +93,9 @@ function VersionNumber(v::AbstractString)
91
93
m = match (VERSION_REGEX, v)
92
94
m === nothing && throw (ArgumentError (" invalid version string: $v " ))
93
95
major, minor, patch, minus, prerl, plus, build = m. captures
94
- major = parse (Int , major)
95
- minor = minor != = nothing ? parse (Int , minor) : 0
96
- patch = patch != = nothing ? parse (Int , patch) : 0
96
+ major = parse (VInt , major)
97
+ minor = minor != = nothing ? parse (VInt , minor) : VInt ( 0 )
98
+ patch = patch != = nothing ? parse (VInt , patch) : VInt ( 0 )
97
99
if prerl != = nothing && ! isempty (prerl) && prerl[1 ] == ' -'
98
100
prerl = prerl[2 : end ] # strip leading '-'
99
101
end
@@ -107,15 +109,21 @@ convert(::Type{VersionNumber}, v::AbstractString) = VersionNumber(v)
107
109
macro v_str (v); VersionNumber (v); end
108
110
109
111
typemin (:: Type{VersionNumber} ) = v " 0-"
110
- typemax (:: Type{VersionNumber} ) = VersionNumber (typemax (Int),typemax (Int),typemax (Int),(),(" " ,))
111
112
112
- ident_cmp (a:: Int , b:: Int ) = cmp (a,b)
113
- ident_cmp (a:: Int , b:: String ) = isempty (b) ? + 1 : - 1
114
- ident_cmp (a:: String , b:: Int ) = isempty (a) ? - 1 : + 1
115
- ident_cmp (a:: String , b:: String ) = cmp (a,b)
113
+ function typemax (:: Type{VersionNumber} )
114
+ ∞ = typemax (VInt)
115
+ VersionNumber (∞, ∞, ∞, (), (" " ,))
116
+ end
117
+
118
+ ident_cmp (a:: Integer , b:: Integer ) = cmp (a, b)
119
+ ident_cmp (a:: Integer , b:: String ) = isempty (b) ? + 1 : - 1
120
+ ident_cmp (a:: String , b:: Integer ) = isempty (a) ? - 1 : + 1
121
+ ident_cmp (a:: String , b:: String ) = cmp (a, b)
116
122
117
- function ident_cmp (A:: Tuple{Vararg{Union{Int,String}}} ,
118
- B:: Tuple{Vararg{Union{Int,String}}} )
123
+ function ident_cmp (
124
+ A:: Tuple{Vararg{Union{Integer,String}}} ,
125
+ B:: Tuple{Vararg{Union{Integer,String}}} ,
126
+ )
119
127
i = start (A)
120
128
j = start (B)
121
129
while ! done (A,i) && ! done (B,i)
@@ -132,8 +140,8 @@ function ==(a::VersionNumber, b::VersionNumber)
132
140
(a. major != b. major) && return false
133
141
(a. minor != b. minor) && return false
134
142
(a. patch != b. patch) && return false
135
- (ident_cmp (a. prerelease,b. prerelease) != 0 ) && return false
136
- (ident_cmp (a. build,b. build) != 0 ) && return false
143
+ (ident_cmp (a. prerelease, b. prerelease) != 0 ) && return false
144
+ (ident_cmp (a. build, b. build) != 0 ) && return false
137
145
return true
138
146
end
139
147
@@ -186,7 +194,7 @@ function check_new_version(existing::Vector{VersionNumber}, ver::VersionNumber)
186
194
end
187
195
error (" $ver is not a valid initial version (try 0.0.0, 0.0.1, 0.1 or 1.0)" )
188
196
end
189
- idx = searchsortedlast (existing,ver)
197
+ idx = searchsortedlast (existing, ver)
190
198
prv = existing[idx]
191
199
ver == prv && error (" version $ver already exists" )
192
200
nxt = thismajor (ver) != thismajor (prv) ? nextmajor (prv) :
0 commit comments