wp_self_update/
versioning.rs1use crate::types::VersionRelation;
2use orion_error::{ToStructError, UvsFrom};
3use semver::Version;
4use wp_error::run_error::{RunReason, RunResult};
5
6pub(crate) fn parse_version(raw: &str) -> RunResult<Version> {
7 let normalized = raw.trim().trim_start_matches('v');
8 Version::parse(normalized).map_err(|e| {
9 RunReason::from_conf()
10 .to_err()
11 .with_detail(format!("invalid semver '{}': {}", raw, e))
12 })
13}
14
15pub(crate) fn compare_versions(current: &Version, latest: &Version) -> VersionRelation {
16 if latest > current {
17 return VersionRelation::UpdateAvailable;
18 }
19 if latest == current {
20 return VersionRelation::UpToDate;
21 }
22 VersionRelation::AheadOfChannel
23}
24
25pub fn compare_versions_str(current: &str, latest: &str) -> RunResult<VersionRelation> {
26 let current_version = parse_version(current)?;
27 let latest_version = parse_version(latest)?;
28 Ok(compare_versions(¤t_version, &latest_version))
29}
30
31pub fn validate_artifact_version_consistency(version: &str, artifact: &str) -> RunResult<()> {
32 if artifact.contains(version) {
33 return Ok(());
34 }
35 Err(RunReason::from_conf().to_err().with_detail(format!(
36 "artifact/version mismatch: artifact '{}' does not contain version '{}'",
37 artifact, version
38 )))
39}
40
41pub fn relation_message(relation: VersionRelation) -> &'static str {
42 match relation {
43 VersionRelation::UpdateAvailable => "update available",
44 VersionRelation::UpToDate => "up-to-date",
45 VersionRelation::AheadOfChannel => "ahead of channel manifest",
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn parse_version_accepts_v_prefix() {
55 let parsed = parse_version("v0.19.0-alpha.3").unwrap();
56 assert_eq!(parsed.to_string(), "0.19.0-alpha.3");
57 }
58
59 #[test]
60 fn compare_versions_update_available() {
61 let current = Version::parse("0.18.0").unwrap();
62 let latest = Version::parse("0.19.0").unwrap();
63 assert_eq!(
64 compare_versions(¤t, &latest),
65 VersionRelation::UpdateAvailable
66 );
67 }
68
69 #[test]
70 fn compare_versions_up_to_date() {
71 let current = Version::parse("0.19.0").unwrap();
72 let latest = Version::parse("0.19.0").unwrap();
73 assert_eq!(
74 compare_versions(¤t, &latest),
75 VersionRelation::UpToDate
76 );
77 }
78
79 #[test]
80 fn compare_versions_ahead_of_channel() {
81 let current = Version::parse("0.19.0").unwrap();
82 let latest = Version::parse("0.15.3").unwrap();
83 assert_eq!(
84 compare_versions(¤t, &latest),
85 VersionRelation::AheadOfChannel
86 );
87 }
88}