1
- use std :: cmp :: Ordering ;
1
+ use gix :: bstr :: { BStr , BString , ByteSlice } ;
2
2
3
- use gix:: bstr:: { BStr , ByteSlice } ;
4
-
5
- #[ derive( Eq , PartialEq ) ]
3
+ #[ derive( Eq , PartialEq , PartialOrd , Ord ) ]
6
4
enum VersionPart {
7
- String ( String ) ,
5
+ String ( BString ) ,
8
6
Number ( usize ) ,
9
7
}
10
8
11
- impl Ord for VersionPart {
12
- fn cmp ( & self , other : & Self ) -> std:: cmp:: Ordering {
13
- match ( self , other) {
14
- ( VersionPart :: String ( a) , VersionPart :: String ( b) ) => a. cmp ( b) ,
15
- ( VersionPart :: String ( _) , VersionPart :: Number ( _) ) => Ordering :: Less ,
16
- ( VersionPart :: Number ( _) , VersionPart :: String ( _) ) => Ordering :: Greater ,
17
- ( VersionPart :: Number ( a) , VersionPart :: Number ( b) ) => a. cmp ( b) ,
18
- }
19
- }
20
- }
21
-
22
- impl PartialOrd for VersionPart {
23
- fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
24
- Some ( Ord :: cmp ( self , other) )
25
- }
26
- }
27
-
28
9
/// `Version` is used to store multi-part version numbers. It does so in a rather naive way,
29
10
/// only distinguishing between parts that can be parsed as an integer and those that cannot.
30
11
///
@@ -37,9 +18,7 @@ impl PartialOrd for VersionPart {
37
18
///
38
19
/// When comparing versions of different lengths, shorter versions sort before longer ones (e.g.,
39
20
/// `v1.0` < `v1.0.1`). String parts always sort before numeric parts when compared directly.
40
- ///
41
- /// The sorting does not respect `versionsort.suffix` yet.
42
- #[ derive( Eq , PartialEq ) ]
21
+ #[ derive( Eq , PartialEq , Ord , PartialOrd ) ]
43
22
struct Version {
44
23
parts : Vec < VersionPart > ,
45
24
}
@@ -50,12 +29,10 @@ impl Version {
50
29
. chunk_by ( |a, b| a. is_ascii_digit ( ) == b. is_ascii_digit ( ) )
51
30
. map ( |part| {
52
31
if let Ok ( part) = part. to_str ( ) {
53
- match part. parse :: < usize > ( ) {
54
- Ok ( number) => VersionPart :: Number ( number) ,
55
- Err ( _) => VersionPart :: String ( part. to_string ( ) ) ,
56
- }
32
+ part. parse :: < usize > ( )
33
+ . map_or_else ( |_| VersionPart :: String ( part. into ( ) ) , VersionPart :: Number )
57
34
} else {
58
- VersionPart :: String ( String :: from_utf8_lossy ( part) . to_string ( ) )
35
+ VersionPart :: String ( part. into ( ) )
59
36
}
60
37
} )
61
38
. collect ( ) ;
@@ -64,31 +41,6 @@ impl Version {
64
41
}
65
42
}
66
43
67
- impl Ord for Version {
68
- fn cmp ( & self , other : & Self ) -> std:: cmp:: Ordering {
69
- let mut a_iter = self . parts . iter ( ) ;
70
- let mut b_iter = other. parts . iter ( ) ;
71
-
72
- loop {
73
- match ( a_iter. next ( ) , b_iter. next ( ) ) {
74
- ( Some ( a) , Some ( b) ) => match a. cmp ( b) {
75
- Ordering :: Equal => continue ,
76
- other => return other,
77
- } ,
78
- ( Some ( _) , None ) => return Ordering :: Greater ,
79
- ( None , Some ( _) ) => return Ordering :: Less ,
80
- ( None , None ) => return Ordering :: Equal ,
81
- }
82
- }
83
- }
84
- }
85
-
86
- impl PartialOrd for Version {
87
- fn partial_cmp ( & self , other : & Self ) -> Option < std:: cmp:: Ordering > {
88
- Some ( Ord :: cmp ( self , other) )
89
- }
90
- }
91
-
92
44
pub fn list ( repo : gix:: Repository , out : & mut dyn std:: io:: Write ) -> anyhow:: Result < ( ) > {
93
45
let platform = repo. references ( ) ?;
94
46
@@ -135,7 +87,7 @@ pub fn list(repo: gix::Repository, out: &mut dyn std::io::Write) -> anyhow::Resu
135
87
#[ cfg( test) ]
136
88
mod tests {
137
89
use super :: * ;
138
- use gix :: bstr :: BStr ;
90
+ use std :: cmp :: Ordering ;
139
91
140
92
#[ test]
141
93
fn sorts_versions_correctly ( ) {
@@ -156,13 +108,8 @@ mod tests {
156
108
"v1.0.0" ,
157
109
] ;
158
110
159
- actual. sort_by ( |a, b| {
160
- let version_a = Version :: parse ( BStr :: new ( a. as_bytes ( ) ) ) ;
161
- let version_b = Version :: parse ( BStr :: new ( b. as_bytes ( ) ) ) ;
162
- version_a. cmp ( & version_b)
163
- } ) ;
164
-
165
- let expected = vec ! [
111
+ actual. sort_by ( |& a, & b| Version :: parse ( a. into ( ) ) . cmp ( & Version :: parse ( b. into ( ) ) ) ) ;
112
+ let expected = [
166
113
"v0.1.0" ,
167
114
"v0.1.a" ,
168
115
"v0.9.0" ,
@@ -184,8 +131,8 @@ mod tests {
184
131
185
132
#[ test]
186
133
fn sorts_versions_with_different_lengths_correctly ( ) {
187
- let v1 = Version :: parse ( BStr :: new ( b "v1.0") ) ;
188
- let v2 = Version :: parse ( BStr :: new ( b "v1.0.1") ) ;
134
+ let v1 = Version :: parse ( "v1.0" . into ( ) ) ;
135
+ let v2 = Version :: parse ( "v1.0.1" . into ( ) ) ;
189
136
190
137
assert_eq ! ( v1. cmp( & v2) , Ordering :: Less ) ;
191
138
assert_eq ! ( v2. cmp( & v1) , Ordering :: Greater ) ;
0 commit comments