@@ -41,12 +41,12 @@ public static TheVersion Parse(string version)
41
41
return default ( TheVersion ) . Initialize ( version ) ;
42
42
}
43
43
44
- private TheVersion Initialize ( string version )
44
+ private TheVersion Initialize ( string theVersion )
45
45
{
46
46
if ( initialized )
47
47
return this ;
48
48
49
- this . Version = version ? . Trim ( ) ?? String . Empty ;
49
+ this . Version = theVersion ? . Trim ( ) ?? String . Empty ;
50
50
51
51
isAlpha = false ;
52
52
isBeta = false ;
@@ -57,7 +57,7 @@ private TheVersion Initialize(string version)
57
57
special = null ;
58
58
parts = 0 ;
59
59
60
- if ( String . IsNullOrEmpty ( version ) )
60
+ if ( String . IsNullOrEmpty ( theVersion ) )
61
61
return this ;
62
62
63
63
intParts = new int [ PART_COUNT ] ;
@@ -66,15 +66,16 @@ private TheVersion Initialize(string version)
66
66
for ( var i = 0 ; i < PART_COUNT ; i ++ )
67
67
stringParts [ i ] = intParts [ i ] . ToString ( ) ;
68
68
69
- var match = regex . Match ( version ) ;
69
+ var match = regex . Match ( theVersion ) ;
70
70
if ( ! match . Success )
71
71
{
72
- LogHelper . Error ( new ArgumentException ( "Invalid version: " + version , "version " ) ) ;
72
+ LogHelper . Error ( new ArgumentException ( "Invalid version: " + theVersion , "theVersion " ) ) ;
73
73
return this ;
74
74
}
75
75
76
76
major = int . Parse ( match . Groups [ "major" ] . Value ) ;
77
- intParts [ 0 ] = major ;
77
+ intParts [ parts ] = major ;
78
+ stringParts [ parts ] = major . ToString ( ) ;
78
79
parts = 1 ;
79
80
80
81
var minorMatch = match . Groups [ "minor" ] ;
@@ -83,39 +84,42 @@ private TheVersion Initialize(string version)
83
84
84
85
if ( minorMatch . Success )
85
86
{
86
- parts ++ ;
87
87
if ( ! int . TryParse ( minorMatch . Value , out minor ) )
88
88
{
89
89
special = minorMatch . Value . TrimEnd ( ) ;
90
- stringParts [ parts - 1 ] = special ;
90
+ stringParts [ parts ] = special ?? "0" ;
91
91
}
92
92
else
93
93
{
94
- intParts [ parts - 1 ] = minor ;
94
+ intParts [ parts ] = minor ;
95
+ stringParts [ parts ] = minor . ToString ( ) ;
96
+ parts ++ ;
95
97
96
98
if ( patchMatch . Success )
97
99
{
98
- parts ++ ;
99
100
if ( ! int . TryParse ( patchMatch . Value , out patch ) )
100
101
{
101
102
special = patchMatch . Value . TrimEnd ( ) ;
102
- stringParts [ parts - 1 ] = special ;
103
+ stringParts [ parts ] = special ?? "0" ;
103
104
}
104
105
else
105
106
{
106
- intParts [ parts - 1 ] = patch ;
107
+ intParts [ parts ] = patch ;
108
+ stringParts [ parts ] = patch . ToString ( ) ;
109
+ parts ++ ;
107
110
108
111
if ( buildMatch . Success )
109
112
{
110
- parts ++ ;
111
113
if ( ! int . TryParse ( buildMatch . Value , out build ) )
112
114
{
113
115
special = buildMatch . Value . TrimEnd ( ) ;
114
- stringParts [ parts - 1 ] = special ;
116
+ stringParts [ parts ] = special ?? "0" ;
115
117
}
116
118
else
117
119
{
118
- intParts [ parts - 1 ] = build ;
120
+ intParts [ parts ] = build ;
121
+ stringParts [ parts ] = build . ToString ( ) ;
122
+ parts ++ ;
119
123
}
120
124
}
121
125
}
@@ -196,19 +200,19 @@ public bool Equals(TheVersion other)
196
200
if ( String . IsNullOrEmpty ( rhs . Version ) )
197
201
return true ;
198
202
199
- for ( var i = 0 ; i < PART_COUNT ; i ++ )
203
+ for ( var i = 0 ; i < lhs . parts && i < rhs . parts ; i ++ )
200
204
{
201
205
if ( lhs . intParts [ i ] != rhs . intParts [ i ] )
202
206
return lhs . intParts [ i ] > rhs . intParts [ i ] ;
203
207
}
204
208
205
209
for ( var i = 1 ; i < PART_COUNT ; i ++ )
206
210
{
207
- if ( lhs . stringParts [ i ] != rhs . stringParts [ i ] )
208
- {
209
- return GreaterThan ( lhs . stringParts [ i ] , rhs . stringParts [ i ] ) ;
210
- }
211
+ var ret = CompareVersionStrings ( lhs . stringParts [ i ] , rhs . stringParts [ i ] ) ;
212
+ if ( ret != 0 )
213
+ return ret > 0 ;
211
214
}
215
+
212
216
return false ;
213
217
}
214
218
@@ -227,35 +231,42 @@ public bool Equals(TheVersion other)
227
231
return lhs < rhs || lhs == rhs ;
228
232
}
229
233
230
- private static bool GreaterThan ( string lhs , string rhs )
234
+ private static int CompareVersionStrings ( string lhs , string rhs )
231
235
{
232
- var lhsNonDigitPos = IndexOfFirstNonDigit ( lhs ) ;
233
- var rhsNonDigitPos = IndexOfFirstNonDigit ( rhs ) ;
236
+ int lhsNonDigitPos ;
237
+ var lhsNumber = GetNumberFromVersionString ( lhs , out lhsNonDigitPos ) ;
234
238
235
- var lhsNumber = - 1 ;
236
- if ( lhsNonDigitPos > - 1 )
237
- {
238
- int . TryParse ( lhs . Substring ( 0 , lhsNonDigitPos ) , out lhsNumber ) ;
239
- }
240
- else
241
- {
242
- int . TryParse ( lhs , out lhsNumber ) ;
243
- }
239
+ int rhsNonDigitPos ;
240
+ var rhsNumber = GetNumberFromVersionString ( rhs , out rhsNonDigitPos ) ;
241
+
242
+ if ( lhsNumber != rhsNumber )
243
+ return lhsNumber . CompareTo ( rhsNumber ) ;
244
+
245
+ if ( lhsNonDigitPos < 0 && rhsNonDigitPos < 0 )
246
+ return 0 ;
247
+
248
+ // versions with alphanumeric characters are always lower than ones without
249
+ // i.e. 1.1alpha is lower than 1.1
250
+ if ( lhsNonDigitPos < 0 )
251
+ return 1 ;
252
+ if ( rhsNonDigitPos < 0 )
253
+ return - 1 ;
254
+ return lhs . Substring ( lhsNonDigitPos ) . CompareTo ( rhs . Substring ( rhsNonDigitPos ) ) ;
255
+ }
244
256
245
- var rhsNumber = - 1 ;
246
- if ( rhsNonDigitPos > - 1 )
257
+ private static int GetNumberFromVersionString ( string lhs , out int nonDigitPos )
258
+ {
259
+ nonDigitPos = IndexOfFirstNonDigit ( lhs ) ;
260
+ var number = - 1 ;
261
+ if ( nonDigitPos > - 1 )
247
262
{
248
- int . TryParse ( rhs . Substring ( 0 , rhsNonDigitPos ) , out rhsNumber ) ;
263
+ int . TryParse ( lhs . Substring ( 0 , nonDigitPos ) , out number ) ;
249
264
}
250
265
else
251
266
{
252
- int . TryParse ( rhs , out rhsNumber ) ;
267
+ int . TryParse ( lhs , out number ) ;
253
268
}
254
-
255
- if ( lhsNumber != rhsNumber )
256
- return lhsNumber > rhsNumber ;
257
-
258
- return lhs . Substring ( lhsNonDigitPos > - 1 ? lhsNonDigitPos : 0 ) . CompareTo ( rhs . Substring ( rhsNonDigitPos > - 1 ? rhsNonDigitPos : 0 ) ) > 0 ;
269
+ return number ;
259
270
}
260
271
261
272
private static int IndexOfFirstNonDigit ( string str )
0 commit comments