@@ -18,9 +18,14 @@ pub(crate) fn upgrade_requirement(
18
18
let comparators: CargoResult < Vec < _ > > = raw_req
19
19
. comparators
20
20
. into_iter ( )
21
+ // Don't downgrade if pre-release was used, see rust-lang/cargo#14178 and rust-lang/cargo#13290.
22
+ . filter ( |p| p. pre . is_empty ( ) || matches_greater ( p, version) )
21
23
. map ( |p| set_comparator ( p, version) )
22
24
. collect ( ) ;
23
- let comparators = comparators?;
25
+ let comparators: Vec < _ > = comparators?;
26
+ if comparators. is_empty ( ) {
27
+ return Ok ( None ) ;
28
+ }
24
29
let new_req = semver:: VersionReq { comparators } ;
25
30
let mut new_req_text = new_req. to_string ( ) ;
26
31
if new_req_text. starts_with ( '^' ) && !req. starts_with ( '^' ) {
@@ -74,6 +79,33 @@ fn set_comparator(
74
79
}
75
80
}
76
81
82
+ // See https://github.com/dtolnay/semver/blob/master/src/eval.rs#L64
83
+ fn matches_greater ( cmp : & semver:: Comparator , ver : & semver:: Version ) -> bool {
84
+ if ver. major != cmp. major {
85
+ return ver. major > cmp. major ;
86
+ }
87
+
88
+ match cmp. minor {
89
+ None => return false ,
90
+ Some ( minor) => {
91
+ if ver. minor != minor {
92
+ return ver. minor > minor;
93
+ }
94
+ }
95
+ }
96
+
97
+ match cmp. patch {
98
+ None => return false ,
99
+ Some ( patch) => {
100
+ if ver. patch != patch {
101
+ return ver. patch > patch;
102
+ }
103
+ }
104
+ }
105
+
106
+ ver. pre > cmp. pre
107
+ }
108
+
77
109
fn assign_partial_req (
78
110
version : & semver:: Version ,
79
111
mut pred : semver:: Comparator ,
@@ -219,8 +251,15 @@ mod test {
219
251
}
220
252
221
253
#[ test]
222
- fn caret_prerelease ( ) {
223
- assert_req_bump ( "1.7.0" , "2.0.0-beta.21" , "1.7.0" ) ;
254
+ fn greater_prerelease ( ) {
255
+ assert_req_bump ( "1.7.0" , "2.0.0-beta.21" , None ) ;
256
+ assert_req_bump ( "1.7.0" , "=2.0.0-beta.21" , None ) ;
257
+ assert_req_bump ( "1.7.0" , "~2.0.0-beta.21" , None ) ;
258
+ assert_req_bump ( "2.0.0-beta.20" , "2.0.0-beta.21" , None ) ;
259
+ assert_req_bump ( "2.0.0-beta.21" , "2.0.0-beta.21" , None ) ;
260
+ assert_req_bump ( "2.0.0-beta.22" , "2.0.0-beta.21" , "2.0.0-beta.22" ) ;
261
+ assert_req_bump ( "2.0.0" , "2.0.0-beta.21" , "2.0.0" ) ;
262
+ assert_req_bump ( "3.0.0" , "2.0.0-beta.21" , "3.0.0" ) ;
224
263
}
225
264
}
226
265
}
0 commit comments