use std::collections::BTreeMap;
use semver::Version;
use crate::model::changeset::ChangeType;
use crate::package_manager::Project;
use super::PropagationMap;
pub(crate) fn bump_version(version: &semver::Version, change_type: ChangeType) -> semver::Version {
let mut v = version.clone();
match change_type {
ChangeType::Major => {
v.major += 1;
v.minor = 0;
v.patch = 0;
}
ChangeType::Minor => {
v.minor += 1;
v.patch = 0;
}
ChangeType::Patch => {
v.patch += 1;
}
}
v.pre = semver::Prerelease::EMPTY;
v.build = semver::BuildMetadata::EMPTY;
v
}
pub(crate) fn infer_change_type(old: &Version, new: &Version) -> ChangeType {
if new.major != old.major {
ChangeType::Major
} else if new.minor != old.minor {
ChangeType::Minor
} else {
ChangeType::Patch
}
}
pub(crate) fn effective_new_version(
pkg_name: &str,
projects: &[Project],
aggregated: &BTreeMap<String, ChangeType>,
version_overrides: &BTreeMap<String, Version>,
propagation_map: &PropagationMap,
) -> Option<Version> {
if let Some(v) = version_overrides.get(pkg_name) {
return Some(v.clone());
}
let ct = aggregated
.get(pkg_name)
.copied()
.or_else(|| propagation_map.get(pkg_name).map(|(ct, _)| *ct))?;
let project = projects.iter().find(|p| p.name() == pkg_name)?;
Some(bump_version(project.version(), ct))
}