@@ -13,7 +13,7 @@ use std::str::FromStr;
13
13
14
14
lazy_static ! {
15
15
static ref VERSION_TAG : Regex = Regex :: new( r"^v(\d+)\.(\d+)\.(\d+)$" ) . unwrap( ) ;
16
- static ref DATE_TAG : Regex = Regex :: new( r"^release-(\d{4}-\d{2}-\d{2})$" ) . unwrap( ) ;
16
+ static ref DATE_TAG : Regex = Regex :: new( r"^release-(\d{4}-\d{2}-\d{2})(.(\d+))? $" ) . unwrap( ) ;
17
17
}
18
18
19
19
#[ derive( Clone , Debug , Eq , PartialEq ) ]
@@ -25,6 +25,7 @@ pub struct VersionReleaseTag {
25
25
#[ derive( Clone , Debug , Eq , PartialEq ) ]
26
26
pub struct DateReleaseTag {
27
27
date : String ,
28
+ suffix : Option < usize > ,
28
29
original : String ,
29
30
}
30
31
@@ -66,6 +67,7 @@ impl FromStr for ReleaseTag {
66
67
} else if let Some ( caps) = DATE_TAG . captures ( value) {
67
68
Ok ( ReleaseTag :: Date ( DateReleaseTag {
68
69
date : caps. get ( 1 ) . expect ( "validated by regex" ) . as_str ( ) . into ( ) ,
70
+ suffix : caps. get ( 3 ) . map ( |s| usize:: from_str ( s. as_str ( ) ) . unwrap ( ) ) ,
69
71
original : value. into ( ) ,
70
72
} ) )
71
73
} else {
@@ -95,7 +97,9 @@ impl PartialOrd for ReleaseTag {
95
97
match ( self , other) {
96
98
( ReleaseTag :: Date ( _) , ReleaseTag :: Version ( _) ) => Some ( Ordering :: Greater ) ,
97
99
( ReleaseTag :: Version ( _) , ReleaseTag :: Date ( _) ) => Some ( Ordering :: Less ) ,
98
- ( ReleaseTag :: Date ( lhs) , ReleaseTag :: Date ( rhs) ) => Some ( lhs. date . cmp ( & rhs. date ) ) ,
100
+ ( ReleaseTag :: Date ( lhs) , ReleaseTag :: Date ( rhs) ) => {
101
+ Some ( lhs. date . cmp ( & rhs. date ) . then ( lhs. suffix . cmp ( & rhs. suffix ) ) )
102
+ }
99
103
( ReleaseTag :: Version ( lhs) , ReleaseTag :: Version ( rhs) ) => {
100
104
Some ( lhs. version . cmp ( & rhs. version ) )
101
105
}
@@ -125,10 +129,20 @@ mod tests {
125
129
ReleaseTag :: Date ( DateReleaseTag {
126
130
date: "2022-07-26" . into( ) ,
127
131
original: "release-2022-07-26" . into( ) ,
132
+ suffix: None
128
133
} ) ,
129
134
tag( "release-2022-07-26" )
130
135
) ;
131
136
137
+ assert_eq ! (
138
+ ReleaseTag :: Date ( DateReleaseTag {
139
+ date: "2022-07-26" . into( ) ,
140
+ original: "release-2022-07-26.2" . into( ) ,
141
+ suffix: Some ( 2 )
142
+ } ) ,
143
+ tag( "release-2022-07-26.2" )
144
+ ) ;
145
+
132
146
assert ! ( ReleaseTag :: from_str( "foo" ) . is_err( ) ) ;
133
147
}
134
148
@@ -140,6 +154,10 @@ mod tests {
140
154
assert ! ( tag( "release-2022-07-20" ) < tag( "release-2022-07-26" ) ) ;
141
155
assert ! ( tag( "release-2022-06-20" ) < tag( "release-2022-07-01" ) ) ;
142
156
assert ! ( tag( "release-2021-06-20" ) < tag( "release-2022-06-20" ) ) ;
157
+ assert ! ( tag( "release-2022-06-20" ) < tag( "release-2022-06-20.2" ) ) ;
158
+ assert ! ( tag( "release-2022-06-20.2" ) < tag( "release-2022-06-20.3" ) ) ;
159
+ assert ! ( tag( "release-2022-06-20.1" ) < tag( "release-2022-06-20.10" ) ) ;
160
+ assert ! ( tag( "release-2022-06-20.10" ) < tag( "release-2022-06-20.11" ) ) ;
143
161
}
144
162
145
163
#[ test]
@@ -149,5 +167,9 @@ mod tests {
149
167
"release-2022-07-26" ,
150
168
format!( "{}" , tag( "release-2022-07-26" ) )
151
169
) ;
170
+ assert_eq ! (
171
+ "release-2022-07-26.2" ,
172
+ format!( "{}" , tag( "release-2022-07-26.2" ) )
173
+ ) ;
152
174
}
153
175
}
0 commit comments