@@ -7,7 +7,6 @@ use std::{
77use anyhow:: { Context , Error } ;
88use cargo_semver_checks:: { Check , GlobalConfig , ReleaseType , Rustdoc } ;
99use esp_metadata:: { Chip , Config } ;
10- use toml_edit:: { Item , Value } ;
1110
1211use crate :: { Package , cargo:: CargoArgsBuilder , commands:: checker:: download_baselines} ;
1312
@@ -47,40 +46,15 @@ pub fn minimum_update(
4746 let mut cfg = GlobalConfig :: new ( ) ;
4847 cfg. set_log_level ( Some ( log:: Level :: Info ) ) ;
4948 let result = semver_check. check_release ( & mut cfg) ?;
49+ log:: info!( "Result {:?}" , result) ;
5050
51- let mut min_required_update = ReleaseType :: Patch ;
52- for ( _, report) in result. crate_reports ( ) {
53- if let Some ( required_bump) = report. required_bump ( ) {
54- let required_is_stricter = ( min_required_update == ReleaseType :: Patch )
55- || ( required_bump == ReleaseType :: Major ) ;
56- if required_is_stricter {
57- min_required_update = required_bump;
58- }
59- }
60- }
61-
62- let forever_unstable = package
63- . toml ( )
64- . espressif_metadata ( )
65- . and_then ( |metadata| metadata. get ( "forever-unstable" ) )
66- . map ( |item| match item {
67- Item :: Value ( Value :: Boolean ( b) ) => * b. value ( ) ,
68- Item :: Value ( _) => {
69- log:: warn!( "Invalid value for 'forever-unstable' in metadata - must be a boolean" ) ;
70- true
71- }
72- _ => false ,
73- } )
74- . unwrap_or ( false ) ;
75-
76- if forever_unstable && min_required_update == ReleaseType :: Major {
77- log:: warn!(
78- "Downgrading required bump from Minor to Patch for unstable package: {}" ,
79- package
80- ) ;
81- min_required_update = ReleaseType :: Minor ;
82- }
51+ let required_bumps: Vec < ReleaseType > = result
52+ . crate_reports ( )
53+ . into_iter ( )
54+ . filter_map ( |( _, report) | report. required_bump ( ) )
55+ . collect ( ) ;
8356
57+ let min_required_update = required_bump ( & required_bumps, package. is_forever_unstable ( ) ) ;
8458 Ok ( min_required_update)
8559}
8660
@@ -142,3 +116,80 @@ pub(crate) fn build_doc_json(
142116 . with_context ( || format ! ( "Failed to run `cargo rustdoc` with {cargo_args:?}" , ) ) ?;
143117 Ok ( current_path)
144118}
119+
120+ fn required_bump ( required_bumps : & [ ReleaseType ] , forever_unstable : bool ) -> ReleaseType {
121+ let mut min_required_update = ReleaseType :: Patch ;
122+
123+ for & required_bump in required_bumps {
124+ let required_is_stricter =
125+ ( min_required_update == ReleaseType :: Patch ) || ( required_bump == ReleaseType :: Major ) ;
126+
127+ if required_is_stricter {
128+ min_required_update = required_bump;
129+ }
130+ }
131+
132+ if forever_unstable && min_required_update == ReleaseType :: Major {
133+ log:: warn!( "Downgrading required bump from Minor to Patch for unstable package" , ) ;
134+ min_required_update = ReleaseType :: Minor ;
135+ }
136+
137+ min_required_update
138+ }
139+
140+ #[ cfg( test) ]
141+ mod tests {
142+
143+ use super :: * ;
144+
145+ #[ test]
146+ // Semver-check requiring a major bump for a 0.x crate
147+ fn major_bump_from_0x_to_0x_plus_1 ( ) {
148+ let bumps = [ ReleaseType :: Major ] ;
149+
150+ let result = required_bump ( & bumps, false ) ;
151+
152+ assert_eq ! ( result, ReleaseType :: Major ) ;
153+ }
154+
155+ #[ test]
156+ // For crates >= 1.0.0, Major is still Major
157+ fn major_bump_from_1x_to_2x ( ) {
158+ let bumps = [ ReleaseType :: Major ] ;
159+
160+ let result = required_bump ( & bumps, false ) ;
161+
162+ assert_eq ! ( result, ReleaseType :: Major ) ;
163+ }
164+
165+ #[ test]
166+ fn forever_unstable_downgrades_major_to_minor ( ) {
167+ let bumps = [ ReleaseType :: Major ] ;
168+
169+ let result = required_bump ( & bumps, true ) ;
170+
171+ assert_eq ! (
172+ result,
173+ ReleaseType :: Minor ,
174+ "forever-unstable packages must never require a major bump"
175+ ) ;
176+ }
177+
178+ #[ test]
179+ fn minor_stays_minor ( ) {
180+ let bumps = [ ReleaseType :: Minor ] ;
181+
182+ let result = required_bump ( & bumps, false ) ;
183+
184+ assert_eq ! ( result, ReleaseType :: Minor ) ;
185+ }
186+
187+ #[ test]
188+ fn multiple_bumps_select_major ( ) {
189+ let bumps = [ ReleaseType :: Patch , ReleaseType :: Minor , ReleaseType :: Major ] ;
190+
191+ let result = required_bump ( & bumps, false ) ;
192+
193+ assert_eq ! ( result, ReleaseType :: Major ) ;
194+ }
195+ }
0 commit comments