@@ -16,10 +16,17 @@ use crate::{
16
16
CrateReport , GlobalConfig , ReleaseType , WitnessGeneration ,
17
17
} ;
18
18
19
+ #[ derive( Debug , PartialEq , Eq ) ]
20
+ struct VersionChange {
21
+ update : ActualSemverUpdate ,
22
+ /// Whether the version change is actual or minimum.
23
+ is_actual : bool ,
24
+ }
25
+
19
26
fn classify_minimum_semver_version_change (
20
27
current_version : Option < & str > ,
21
28
baseline_version : Option < & str > ,
22
- ) -> Option < ActualSemverUpdate > {
29
+ ) -> Option < VersionChange > {
23
30
if let ( Some ( baseline) , Some ( current) ) = ( baseline_version, current_version) {
24
31
let baseline_version =
25
32
semver:: Version :: parse ( baseline) . expect ( "baseline not a valid version" ) ;
@@ -28,19 +35,16 @@ fn classify_minimum_semver_version_change(
28
35
// Check if versions are identical (ignoring build metadata)
29
36
if baseline_version. cmp_precedence ( & current_version) == Ordering :: Equal {
30
37
// Determine minimum possible change based on SemVer rules
31
- return Some ( match ( current_version . major , current_version . minor ) {
32
- ( 0 , 0 ) => {
38
+ return Some ( VersionChange {
39
+ update : match ( current_version . major , current_version . minor ) {
33
40
// For 0.0.z: Minimum next change must be major
34
- ActualSemverUpdate :: Major
35
- }
36
- ( 0 , _) => {
37
- // For 0.y.z (y > 0): Minimum next change is minor
38
- ActualSemverUpdate :: Minor
39
- }
40
- ( _, _) => {
41
- // For stable versions x.y.z (x ≥ 1): Minimum next change is patch
42
- ActualSemverUpdate :: Patch
43
- }
41
+ ( 0 , 0 ) => ActualSemverUpdate :: Major ,
42
+ // For 0.y.z: Minimum next change must be minor
43
+ ( 0 , _) => ActualSemverUpdate :: Minor ,
44
+ // For x.y.z: Minimum next change must be patch
45
+ ( _, _) => ActualSemverUpdate :: Patch ,
46
+ } ,
47
+ is_actual : false ,
44
48
} ) ;
45
49
}
46
50
@@ -78,7 +82,10 @@ fn classify_minimum_semver_version_change(
78
82
unreachable ! ( "Versions are identical." ) ;
79
83
} ;
80
84
81
- Some ( update_kind)
85
+ Some ( VersionChange {
86
+ update : update_kind,
87
+ is_actual : true ,
88
+ } )
82
89
} else {
83
90
None
84
91
}
@@ -209,17 +216,23 @@ pub(super) fn run_check_release(
209
216
let baseline_version = data_storage. baseline_crate ( ) . crate_version ( ) ;
210
217
211
218
let version_change = release_type
212
- . map ( Into :: into)
219
+ . map ( |rt| VersionChange {
220
+ update : rt. into ( ) ,
221
+ is_actual : true ,
222
+ } )
213
223
. or_else ( || classify_minimum_semver_version_change ( current_version, baseline_version) )
214
224
. unwrap_or_else ( || {
215
225
config
216
226
. shell_warn (
217
227
"Could not determine whether crate version changed. Assuming no change." ,
218
228
)
219
229
. expect ( "print failed" ) ;
220
- ActualSemverUpdate :: NotChanged
230
+ VersionChange {
231
+ update : ActualSemverUpdate :: NotChanged ,
232
+ is_actual : true ,
233
+ }
221
234
} ) ;
222
- let change = match version_change {
235
+ let change = match version_change. update {
223
236
ActualSemverUpdate :: Major => "major" ,
224
237
ActualSemverUpdate :: Minor => "minor" ,
225
238
ActualSemverUpdate :: Patch => "patch" ,
@@ -230,23 +243,32 @@ pub(super) fn run_check_release(
230
243
None => "" ,
231
244
} ;
232
245
246
+ let change_type = if version_change. is_actual {
247
+ ""
248
+ } else {
249
+ "minimum "
250
+ } ;
251
+
233
252
let index_storage = data_storage. create_indexes ( ) ;
234
253
let adapter = index_storage. create_adapter ( ) ;
235
254
236
255
let ( queries_to_run, queries_to_skip) : ( Vec < _ > , _ ) =
237
256
SemverQuery :: all_queries ( ) . into_values ( ) . partition ( |query| {
238
- !version_change. supports_requirement ( overrides. effective_required_update ( query) )
257
+ !version_change
258
+ . update
259
+ . supports_requirement ( overrides. effective_required_update ( query) )
239
260
&& overrides. effective_lint_level ( query) > LintLevel :: Allow
240
261
} ) ;
241
262
let skipped_queries = queries_to_skip. len ( ) ;
242
263
243
264
config. shell_status (
244
265
"Checking" ,
245
266
format_args ! (
246
- "{crate_name} v{} -> v{} ({}{} change)" ,
267
+ "{crate_name} v{} -> v{} ({}{}{} change)" ,
247
268
baseline_version. unwrap_or( "unknown" ) ,
248
269
current_version. unwrap_or( "unknown" ) ,
249
270
assume,
271
+ change_type,
250
272
change
251
273
) ,
252
274
) ?;
@@ -461,7 +483,7 @@ pub(super) fn run_check_release(
461
483
462
484
Ok ( CrateReport {
463
485
required_bump : required_bump. map ( ReleaseType :: from) ,
464
- detected_bump : version_change,
486
+ detected_bump : version_change. update ,
465
487
} )
466
488
} else {
467
489
config
@@ -487,7 +509,7 @@ pub(super) fn run_check_release(
487
509
) ?;
488
510
489
511
Ok ( CrateReport {
490
- detected_bump : version_change,
512
+ detected_bump : version_change. update ,
491
513
required_bump : None ,
492
514
} )
493
515
}
@@ -510,7 +532,10 @@ mod test {
510
532
fn classify_same_version ( ) {
511
533
let baseline = Some ( "1.0.0" ) ;
512
534
let current = Some ( "1.0.0" ) ;
513
- let expected = Some ( ActualSemverUpdate :: Patch ) ;
535
+ let expected = Some ( VersionChange {
536
+ update : ActualSemverUpdate :: Patch ,
537
+ is_actual : false ,
538
+ } ) ;
514
539
let actual = classify_minimum_semver_version_change ( baseline, current) ;
515
540
assert_eq ! ( actual, expected) ;
516
541
}
@@ -519,7 +544,10 @@ mod test {
519
544
fn classify_patch_changed ( ) {
520
545
let baseline = Some ( "1.0.0" ) ;
521
546
let current = Some ( "1.0.1" ) ;
522
- let expected = Some ( ActualSemverUpdate :: Patch ) ;
547
+ let expected = Some ( VersionChange {
548
+ update : ActualSemverUpdate :: Patch ,
549
+ is_actual : true ,
550
+ } ) ;
523
551
let actual = classify_minimum_semver_version_change ( baseline, current) ;
524
552
assert_eq ! ( actual, expected) ;
525
553
}
@@ -528,7 +556,10 @@ mod test {
528
556
fn classify_minor_changed ( ) {
529
557
let baseline = Some ( "1.0.0" ) ;
530
558
let current = Some ( "1.1.0" ) ;
531
- let expected = Some ( ActualSemverUpdate :: Minor ) ;
559
+ let expected = Some ( VersionChange {
560
+ update : ActualSemverUpdate :: Minor ,
561
+ is_actual : true ,
562
+ } ) ;
532
563
let actual = classify_minimum_semver_version_change ( baseline, current) ;
533
564
assert_eq ! ( actual, expected) ;
534
565
}
@@ -537,7 +568,10 @@ mod test {
537
568
fn classify_major_changed ( ) {
538
569
let baseline = Some ( "0.9.0" ) ;
539
570
let current = Some ( "1.0.0" ) ;
540
- let expected = Some ( ActualSemverUpdate :: Major ) ;
571
+ let expected = Some ( VersionChange {
572
+ update : ActualSemverUpdate :: Major ,
573
+ is_actual : true ,
574
+ } ) ;
541
575
let actual = classify_minimum_semver_version_change ( baseline, current) ;
542
576
assert_eq ! ( actual, expected) ;
543
577
}
@@ -546,7 +580,10 @@ mod test {
546
580
fn classify_zerover_minor_changed ( ) {
547
581
let baseline = Some ( "0.1.0" ) ;
548
582
let current = Some ( "0.1.1" ) ;
549
- let expected = Some ( ActualSemverUpdate :: Minor ) ;
583
+ let expected = Some ( VersionChange {
584
+ update : ActualSemverUpdate :: Minor ,
585
+ is_actual : true ,
586
+ } ) ;
550
587
let actual = classify_minimum_semver_version_change ( baseline, current) ;
551
588
assert_eq ! ( actual, expected) ;
552
589
}
@@ -555,7 +592,10 @@ mod test {
555
592
fn classify_zerover_major_changed ( ) {
556
593
let baseline = Some ( "0.1.0" ) ;
557
594
let current = Some ( "0.2.0" ) ;
558
- let expected = Some ( ActualSemverUpdate :: Major ) ;
595
+ let expected = Some ( VersionChange {
596
+ update : ActualSemverUpdate :: Major ,
597
+ is_actual : true ,
598
+ } ) ;
559
599
let actual = classify_minimum_semver_version_change ( baseline, current) ;
560
600
assert_eq ! ( actual, expected) ;
561
601
}
@@ -564,7 +604,10 @@ mod test {
564
604
fn classify_double_zerover_major_changed ( ) {
565
605
let baseline = Some ( "0.0.1" ) ;
566
606
let current = Some ( "0.0.2" ) ;
567
- let expected = Some ( ActualSemverUpdate :: Major ) ;
607
+ let expected = Some ( VersionChange {
608
+ update : ActualSemverUpdate :: Major ,
609
+ is_actual : true ,
610
+ } ) ;
568
611
let actual = classify_minimum_semver_version_change ( baseline, current) ;
569
612
assert_eq ! ( actual, expected) ;
570
613
}
@@ -573,7 +616,10 @@ mod test {
573
616
fn classify_pre_same ( ) {
574
617
let baseline = Some ( "1.0.0-alpha.0" ) ;
575
618
let current = Some ( "1.0.0-alpha.0" ) ;
576
- let expected = Some ( ActualSemverUpdate :: Patch ) ;
619
+ let expected = Some ( VersionChange {
620
+ update : ActualSemverUpdate :: Patch ,
621
+ is_actual : false ,
622
+ } ) ;
577
623
let actual = classify_minimum_semver_version_change ( baseline, current) ;
578
624
assert_eq ! ( actual, expected) ;
579
625
}
@@ -582,7 +628,10 @@ mod test {
582
628
fn classify_pre ( ) {
583
629
let baseline = Some ( "1.0.0-alpha.0" ) ;
584
630
let current = Some ( "1.0.0-alpha.1" ) ;
585
- let expected = Some ( ActualSemverUpdate :: Major ) ;
631
+ let expected = Some ( VersionChange {
632
+ update : ActualSemverUpdate :: Major ,
633
+ is_actual : true ,
634
+ } ) ;
586
635
let actual = classify_minimum_semver_version_change ( baseline, current) ;
587
636
assert_eq ! ( actual, expected) ;
588
637
}
@@ -591,7 +640,10 @@ mod test {
591
640
fn classify_same_version_with_pre ( ) {
592
641
let baseline = Some ( "1.0.0-alpha.1" ) ;
593
642
let current = Some ( "1.0.0" ) ;
594
- let expected = Some ( ActualSemverUpdate :: Major ) ;
643
+ let expected = Some ( VersionChange {
644
+ update : ActualSemverUpdate :: Major ,
645
+ is_actual : true ,
646
+ } ) ;
595
647
let actual = classify_minimum_semver_version_change ( baseline, current) ;
596
648
assert_eq ! ( actual, expected) ;
597
649
}
@@ -600,7 +652,10 @@ mod test {
600
652
fn classify_minor_changed_with_pre ( ) {
601
653
let baseline = Some ( "1.0.0" ) ;
602
654
let current = Some ( "1.1.0-alpha.1" ) ;
603
- let expected = Some ( ActualSemverUpdate :: Minor ) ;
655
+ let expected = Some ( VersionChange {
656
+ update : ActualSemverUpdate :: Minor ,
657
+ is_actual : true ,
658
+ } ) ;
604
659
let actual = classify_minimum_semver_version_change ( baseline, current) ;
605
660
assert_eq ! ( actual, expected) ;
606
661
}
@@ -609,7 +664,10 @@ mod test {
609
664
fn classify_zerover_same_version ( ) {
610
665
let baseline = Some ( "0.1.0" ) ;
611
666
let current = Some ( "0.1.0" ) ;
612
- let expected = Some ( ActualSemverUpdate :: Minor ) ;
667
+ let expected = Some ( VersionChange {
668
+ update : ActualSemverUpdate :: Minor ,
669
+ is_actual : false ,
670
+ } ) ;
613
671
let actual = classify_minimum_semver_version_change ( baseline, current) ;
614
672
assert_eq ! ( actual, expected) ;
615
673
}
@@ -618,7 +676,10 @@ mod test {
618
676
fn classify_zerover_zero_same_version ( ) {
619
677
let baseline = Some ( "0.0.1" ) ;
620
678
let current = Some ( "0.0.1" ) ;
621
- let expected = Some ( ActualSemverUpdate :: Major ) ;
679
+ let expected = Some ( VersionChange {
680
+ update : ActualSemverUpdate :: Major ,
681
+ is_actual : false ,
682
+ } ) ;
622
683
let actual = classify_minimum_semver_version_change ( baseline, current) ;
623
684
assert_eq ! ( actual, expected) ;
624
685
}
@@ -627,7 +688,10 @@ mod test {
627
688
fn classify_pre_zero_same ( ) {
628
689
let baseline = Some ( "0.1.0-alpha.0" ) ;
629
690
let current = Some ( "0.1.0-alpha.0" ) ;
630
- let expected = Some ( ActualSemverUpdate :: Minor ) ;
691
+ let expected = Some ( VersionChange {
692
+ update : ActualSemverUpdate :: Minor ,
693
+ is_actual : false ,
694
+ } ) ;
631
695
let actual = classify_minimum_semver_version_change ( baseline, current) ;
632
696
assert_eq ! ( actual, expected) ;
633
697
}
@@ -636,7 +700,10 @@ mod test {
636
700
fn classify_build_with_pre_same ( ) {
637
701
let baseline = Some ( "1.0.0-alpha.1+build.1" ) ;
638
702
let current = Some ( "1.0.0-alpha.1+build.2" ) ;
639
- let expected = Some ( ActualSemverUpdate :: Patch ) ;
703
+ let expected = Some ( VersionChange {
704
+ update : ActualSemverUpdate :: Patch ,
705
+ is_actual : false ,
706
+ } ) ;
640
707
let actual = classify_minimum_semver_version_change ( baseline, current) ;
641
708
assert_eq ! ( actual, expected) ;
642
709
}
@@ -645,7 +712,10 @@ mod test {
645
712
fn classify_build_zero_version ( ) {
646
713
let baseline = Some ( "0.1.0+build.1" ) ;
647
714
let current = Some ( "0.1.0+build.2" ) ;
648
- let expected = Some ( ActualSemverUpdate :: Minor ) ;
715
+ let expected = Some ( VersionChange {
716
+ update : ActualSemverUpdate :: Minor ,
717
+ is_actual : false ,
718
+ } ) ;
649
719
let actual = classify_minimum_semver_version_change ( baseline, current) ;
650
720
assert_eq ! ( actual, expected) ;
651
721
}
@@ -654,7 +724,10 @@ mod test {
654
724
fn classify_ignores_build ( ) {
655
725
let baseline = Some ( "1.0.0+hello" ) ;
656
726
let current = Some ( "1.0.0+world" ) ;
657
- let expected = Some ( ActualSemverUpdate :: Patch ) ;
727
+ let expected = Some ( VersionChange {
728
+ update : ActualSemverUpdate :: Patch ,
729
+ is_actual : false ,
730
+ } ) ;
658
731
let actual = classify_minimum_semver_version_change ( baseline, current) ;
659
732
assert_eq ! ( actual, expected) ;
660
733
}
0 commit comments