1use std::collections::BTreeMap;
2use std::path::PathBuf;
3
4use callisto_changelog::ChangelogInput;
5use callisto_format::PreState;
6use callisto_model::{
7 BumpReason, BumpRecord, CommitSha, ConfigKey, Diagnostic, LockfileRefreshResult, PackageId, Severity, Version,
8 VersionReport, SCHEMA_VERSION,
9};
10
11use crate::cascade::SpecRewrite;
12
13#[derive(Clone, Debug, Default)]
14pub struct VersionPlan {
15 pub bumps: Vec<PlannedBump>,
16 pub rewrites: Vec<SpecRewrite>,
17 pub platform_writes: Vec<PlatformWrite>,
18 pub optional_dep_updates: Vec<OptionalDepUpdate>,
19 pub changelog_writes: Vec<ChangelogWrite>,
20 pub consumed_changesets: Vec<PathBuf>,
21 pub pre_state_update: Option<PreState>,
22 pub delete_pre_json: Option<PathBuf>,
23 pub pre_cursor_updates: Vec<(PackageId, CommitSha)>,
24 pub observed_versions: BTreeMap<PackageId, Version>,
25 pub diagnostics: Vec<Diagnostic>,
26}
27
28#[derive(Clone, Debug, PartialEq, Eq)]
29pub struct PlannedBump {
30 pub package: PackageId,
31 pub from: Version,
32 pub to: Version,
33 pub severity: Severity,
34 pub governed_by: Option<ConfigKey>,
35 pub reason: Option<BumpReason>,
36 pub writes: Vec<VersionWriteTarget>,
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
40pub enum VersionWriteTarget {
41 Manifest(PathBuf),
42 CargoWorkspacePackage { root_manifest: PathBuf },
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46pub struct PlatformWrite {
47 pub manifest: PathBuf,
48 pub version: Version,
49 pub from: Version,
50}
51
52#[derive(Clone, Debug, PartialEq, Eq)]
53pub struct OptionalDepUpdate {
54 pub manifest: PathBuf,
55 pub updates: Vec<(String, Version)>,
56}
57
58#[derive(Clone, Debug, PartialEq, Eq)]
59pub struct ChangelogWrite {
60 pub changelog_path: PathBuf,
61 pub input: ChangelogInput,
62}
63
64impl VersionPlan {
65 pub fn to_report(&self, lockfiles: Option<Vec<LockfileRefreshResult>>) -> VersionReport {
66 let mut bumps = Vec::new();
67 for b in &self.bumps {
68 bumps.push(BumpRecord {
69 package: b.package.clone(),
70 from: b.from.clone(),
71 to: b.to.clone(),
72 severity: b.severity,
73 governed_by: b.governed_by.clone(),
74 reason: b.reason.clone(),
75 });
76 }
77
78 VersionReport {
79 schema_version: SCHEMA_VERSION,
80 bumps,
81 lockfile_refresh_results: lockfiles,
82 diagnostics: self.diagnostics.clone(),
83 }
84 }
85}
86
87#[cfg(test)]
88mod platform_write_from_field_tests {
89 use super::*;
90 use callisto_model::VersionGrammar;
91
92 #[test]
93 fn platform_write_carries_from_field_distinct_from_version() {
94 let pw = PlatformWrite {
95 manifest: PathBuf::from("platform/package.json"),
96 version: Version::parse("1.1.0", VersionGrammar::SemVer).unwrap(),
97 from: Version::parse("1.0.0", VersionGrammar::SemVer).unwrap(),
98 };
99 assert_eq!(pw.from.render(), "1.0.0");
100 assert_eq!(pw.version.render(), "1.1.0");
101 }
102}