Skip to content

Commit 8f005ef

Browse files
committed
refactor & fix tests
1 parent b7521d8 commit 8f005ef

11 files changed

+119
-57
lines changed

src/check_release.rs

+111-38
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@ use crate::{
1616
CrateReport, GlobalConfig, ReleaseType, WitnessGeneration,
1717
};
1818

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+
1926
fn classify_minimum_semver_version_change(
2027
current_version: Option<&str>,
2128
baseline_version: Option<&str>,
22-
) -> Option<ActualSemverUpdate> {
29+
) -> Option<VersionChange> {
2330
if let (Some(baseline), Some(current)) = (baseline_version, current_version) {
2431
let baseline_version =
2532
semver::Version::parse(baseline).expect("baseline not a valid version");
@@ -28,19 +35,16 @@ fn classify_minimum_semver_version_change(
2835
// Check if versions are identical (ignoring build metadata)
2936
if baseline_version.cmp_precedence(&current_version) == Ordering::Equal {
3037
// 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) {
3340
// 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,
4448
});
4549
}
4650

@@ -78,7 +82,10 @@ fn classify_minimum_semver_version_change(
7882
unreachable!("Versions are identical.");
7983
};
8084

81-
Some(update_kind)
85+
Some(VersionChange {
86+
update: update_kind,
87+
is_actual: true,
88+
})
8289
} else {
8390
None
8491
}
@@ -209,17 +216,23 @@ pub(super) fn run_check_release(
209216
let baseline_version = data_storage.baseline_crate().crate_version();
210217

211218
let version_change = release_type
212-
.map(Into::into)
219+
.map(|rt| VersionChange {
220+
update: rt.into(),
221+
is_actual: true,
222+
})
213223
.or_else(|| classify_minimum_semver_version_change(current_version, baseline_version))
214224
.unwrap_or_else(|| {
215225
config
216226
.shell_warn(
217227
"Could not determine whether crate version changed. Assuming no change.",
218228
)
219229
.expect("print failed");
220-
ActualSemverUpdate::NotChanged
230+
VersionChange {
231+
update: ActualSemverUpdate::NotChanged,
232+
is_actual: true,
233+
}
221234
});
222-
let change = match version_change {
235+
let change = match version_change.update {
223236
ActualSemverUpdate::Major => "major",
224237
ActualSemverUpdate::Minor => "minor",
225238
ActualSemverUpdate::Patch => "patch",
@@ -230,23 +243,32 @@ pub(super) fn run_check_release(
230243
None => "",
231244
};
232245

246+
let change_type = if version_change.is_actual {
247+
""
248+
} else {
249+
"minimum "
250+
};
251+
233252
let index_storage = data_storage.create_indexes();
234253
let adapter = index_storage.create_adapter();
235254

236255
let (queries_to_run, queries_to_skip): (Vec<_>, _) =
237256
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))
239260
&& overrides.effective_lint_level(query) > LintLevel::Allow
240261
});
241262
let skipped_queries = queries_to_skip.len();
242263

243264
config.shell_status(
244265
"Checking",
245266
format_args!(
246-
"{crate_name} v{} -> v{} ({}{} change)",
267+
"{crate_name} v{} -> v{} ({}{}{} change)",
247268
baseline_version.unwrap_or("unknown"),
248269
current_version.unwrap_or("unknown"),
249270
assume,
271+
change_type,
250272
change
251273
),
252274
)?;
@@ -461,7 +483,7 @@ pub(super) fn run_check_release(
461483

462484
Ok(CrateReport {
463485
required_bump: required_bump.map(ReleaseType::from),
464-
detected_bump: version_change,
486+
detected_bump: version_change.update,
465487
})
466488
} else {
467489
config
@@ -487,7 +509,7 @@ pub(super) fn run_check_release(
487509
)?;
488510

489511
Ok(CrateReport {
490-
detected_bump: version_change,
512+
detected_bump: version_change.update,
491513
required_bump: None,
492514
})
493515
}
@@ -510,7 +532,10 @@ mod test {
510532
fn classify_same_version() {
511533
let baseline = Some("1.0.0");
512534
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+
});
514539
let actual = classify_minimum_semver_version_change(baseline, current);
515540
assert_eq!(actual, expected);
516541
}
@@ -519,7 +544,10 @@ mod test {
519544
fn classify_patch_changed() {
520545
let baseline = Some("1.0.0");
521546
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+
});
523551
let actual = classify_minimum_semver_version_change(baseline, current);
524552
assert_eq!(actual, expected);
525553
}
@@ -528,7 +556,10 @@ mod test {
528556
fn classify_minor_changed() {
529557
let baseline = Some("1.0.0");
530558
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+
});
532563
let actual = classify_minimum_semver_version_change(baseline, current);
533564
assert_eq!(actual, expected);
534565
}
@@ -537,7 +568,10 @@ mod test {
537568
fn classify_major_changed() {
538569
let baseline = Some("0.9.0");
539570
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+
});
541575
let actual = classify_minimum_semver_version_change(baseline, current);
542576
assert_eq!(actual, expected);
543577
}
@@ -546,7 +580,10 @@ mod test {
546580
fn classify_zerover_minor_changed() {
547581
let baseline = Some("0.1.0");
548582
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+
});
550587
let actual = classify_minimum_semver_version_change(baseline, current);
551588
assert_eq!(actual, expected);
552589
}
@@ -555,7 +592,10 @@ mod test {
555592
fn classify_zerover_major_changed() {
556593
let baseline = Some("0.1.0");
557594
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+
});
559599
let actual = classify_minimum_semver_version_change(baseline, current);
560600
assert_eq!(actual, expected);
561601
}
@@ -564,7 +604,10 @@ mod test {
564604
fn classify_double_zerover_major_changed() {
565605
let baseline = Some("0.0.1");
566606
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+
});
568611
let actual = classify_minimum_semver_version_change(baseline, current);
569612
assert_eq!(actual, expected);
570613
}
@@ -573,7 +616,10 @@ mod test {
573616
fn classify_pre_same() {
574617
let baseline = Some("1.0.0-alpha.0");
575618
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+
});
577623
let actual = classify_minimum_semver_version_change(baseline, current);
578624
assert_eq!(actual, expected);
579625
}
@@ -582,7 +628,10 @@ mod test {
582628
fn classify_pre() {
583629
let baseline = Some("1.0.0-alpha.0");
584630
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+
});
586635
let actual = classify_minimum_semver_version_change(baseline, current);
587636
assert_eq!(actual, expected);
588637
}
@@ -591,7 +640,10 @@ mod test {
591640
fn classify_same_version_with_pre() {
592641
let baseline = Some("1.0.0-alpha.1");
593642
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+
});
595647
let actual = classify_minimum_semver_version_change(baseline, current);
596648
assert_eq!(actual, expected);
597649
}
@@ -600,7 +652,10 @@ mod test {
600652
fn classify_minor_changed_with_pre() {
601653
let baseline = Some("1.0.0");
602654
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+
});
604659
let actual = classify_minimum_semver_version_change(baseline, current);
605660
assert_eq!(actual, expected);
606661
}
@@ -609,7 +664,10 @@ mod test {
609664
fn classify_zerover_same_version() {
610665
let baseline = Some("0.1.0");
611666
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+
});
613671
let actual = classify_minimum_semver_version_change(baseline, current);
614672
assert_eq!(actual, expected);
615673
}
@@ -618,7 +676,10 @@ mod test {
618676
fn classify_zerover_zero_same_version() {
619677
let baseline = Some("0.0.1");
620678
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+
});
622683
let actual = classify_minimum_semver_version_change(baseline, current);
623684
assert_eq!(actual, expected);
624685
}
@@ -627,7 +688,10 @@ mod test {
627688
fn classify_pre_zero_same() {
628689
let baseline = Some("0.1.0-alpha.0");
629690
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+
});
631695
let actual = classify_minimum_semver_version_change(baseline, current);
632696
assert_eq!(actual, expected);
633697
}
@@ -636,7 +700,10 @@ mod test {
636700
fn classify_build_with_pre_same() {
637701
let baseline = Some("1.0.0-alpha.1+build.1");
638702
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+
});
640707
let actual = classify_minimum_semver_version_change(baseline, current);
641708
assert_eq!(actual, expected);
642709
}
@@ -645,7 +712,10 @@ mod test {
645712
fn classify_build_zero_version() {
646713
let baseline = Some("0.1.0+build.1");
647714
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+
});
649719
let actual = classify_minimum_semver_version_change(baseline, current);
650720
assert_eq!(actual, expected);
651721
}
@@ -654,7 +724,10 @@ mod test {
654724
fn classify_ignores_build() {
655725
let baseline = Some("1.0.0+hello");
656726
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+
});
658731
let actual = classify_minimum_semver_version_change(baseline, current);
659732
assert_eq!(actual, expected);
660733
}

test_crates/manifest_tests/workspace_overrides/new/pkg/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "pkg"
3-
version = "0.1.0"
3+
version = "1.0.0"
44
edition = "2021"
55

66
[dependencies]

test_crates/manifest_tests/workspace_overrides/old/pkg/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "pkg"
3-
version = "0.1.0"
3+
version = "1.0.0"
44
edition = "2021"
55

66
[dependencies]

test_outputs/integration_snapshots__cfg_conditional_compilation.snap

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ info:
1212
CARGO_TERM_COLOR: never
1313
RUSTDOCFLAGS: "--cfg custom"
1414
RUST_BACKTRACE: "0"
15-
snapshot_kind: text
1615
---
1716
success: false
1817
exit_code: 1
@@ -47,7 +46,7 @@ Failed in:
4746
Built [TIME] (baseline)
4847
Parsing cfg_conditional_compilation v0.1.0 (baseline)
4948
Parsed [TIME] (baseline)
50-
Checking cfg_conditional_compilation v0.1.0 -> v0.1.0 (no change)
49+
Checking cfg_conditional_compilation v0.1.0 -> v0.1.0 (minimum minor change)
5150
Checked [TIME] [TOTAL] checks: [PASS] pass, 2 fail, 0 warn, [SKIP] skip
5251

5352
Summary semver requires new major version: 2 major and 0 minor checks failed

test_outputs/integration_snapshots__cfg_conditional_compilation_without_cfg_set.snap

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ info:
1111
env:
1212
CARGO_TERM_COLOR: never
1313
RUST_BACKTRACE: "0"
14-
snapshot_kind: text
1514
---
1615
success: true
1716
exit_code: 0
@@ -26,7 +25,7 @@ exit_code: 0
2625
Built [TIME] (baseline)
2726
Parsing cfg_conditional_compilation v0.1.0 (baseline)
2827
Parsed [TIME] (baseline)
29-
Checking cfg_conditional_compilation v0.1.0 -> v0.1.0 (no change)
28+
Checking cfg_conditional_compilation v0.1.0 -> v0.1.0 (minimum minor change)
3029
Checked [TIME] [TOTAL] checks: [PASS] pass, [SKIP] skip
3130
Summary no semver update required
3231
Finished [TIME] cfg_conditional_compilation

0 commit comments

Comments
 (0)