summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-04-11 13:56:08 +0200
committerDavid Lönnhager <david.l@mullvad.net>2024-04-30 16:22:52 +0200
commit8287a14f70dafbc1b59a752e006bf6b9d2242523 (patch)
tree944ba7ab84279fba4ed32cba1949910263af60c7
parent876f9cb5d5abf3e4d56cce5aee3597fdb5ad14e3 (diff)
downloadmullvadvpn-8287a14f70dafbc1b59a752e006bf6b9d2242523.tar.xz
mullvadvpn-8287a14f70dafbc1b59a752e006bf6b9d2242523.zip
Implement PartialOrd for MacosVersion
-rw-r--r--talpid-platform-metadata/src/macos.rs93
1 files changed, 83 insertions, 10 deletions
diff --git a/talpid-platform-metadata/src/macos.rs b/talpid-platform-metadata/src/macos.rs
index 707130721b..7949f34539 100644
--- a/talpid-platform-metadata/src/macos.rs
+++ b/talpid-platform-metadata/src/macos.rs
@@ -1,7 +1,9 @@
mod command;
use command::command_stdout_lossy;
-use std::io;
+use std::cmp::Ordering;
+use std::fmt::Formatter;
+use std::{fmt, io};
pub fn version() -> String {
let version = MacosVersion::new()
@@ -21,12 +23,35 @@ pub fn extra_metadata() -> impl Iterator<Item = (String, String)> {
std::iter::empty()
}
-#[derive(Debug, PartialEq)]
+#[derive(Debug, Clone)]
pub struct MacosVersion {
raw_version: String,
major: u32,
minor: u32,
- patch: u32,
+ patch: Option<u32>,
+}
+
+impl PartialEq for MacosVersion {
+ fn eq(&self, other: &Self) -> bool {
+ self.major_version() == other.major_version()
+ && self.minor_version() == other.minor_version()
+ && self.patch_version() == other.patch_version()
+ }
+}
+
+impl PartialOrd for MacosVersion {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ let major = self.major_version().partial_cmp(&other.major_version())?;
+ let minor = self.minor_version().partial_cmp(&other.minor_version())?;
+ let patch = self.patch_version().partial_cmp(&other.patch_version())?;
+ Some(major.then(minor).then(patch))
+ }
+}
+
+impl fmt::Display for MacosVersion {
+ fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+ f.write_str(&self.version())
+ }
}
impl MacosVersion {
@@ -34,7 +59,7 @@ impl MacosVersion {
Self::from_raw_version(&run_sw_vers()?)
}
- fn from_raw_version(version_string: &str) -> Result<MacosVersion, io::Error> {
+ pub fn from_raw_version(version_string: &str) -> Result<MacosVersion, io::Error> {
let (major, minor, patch) = parse_version_output(version_string).ok_or(io::Error::new(
io::ErrorKind::InvalidInput,
"Failed to parse raw version string",
@@ -66,7 +91,7 @@ impl MacosVersion {
}
pub fn patch_version(&self) -> u32 {
- self.patch
+ self.patch.unwrap_or(0)
}
}
@@ -75,14 +100,11 @@ fn run_sw_vers() -> io::Result<String> {
command_stdout_lossy("sw_vers", &["-productVersion"])
}
-fn parse_version_output(output: &str) -> Option<(u32, u32, u32)> {
+fn parse_version_output(output: &str) -> Option<(u32, u32, Option<u32>)> {
let mut parts = output.split('.');
let major = parts.next()?.parse().ok()?;
let minor = parts.next()?.parse().ok()?;
- let patch = parts
- .next()
- .and_then(|patch| patch.parse().ok())
- .unwrap_or(0);
+ let patch = parts.next().and_then(|patch| patch.parse().ok());
Some((major, minor, patch))
}
@@ -95,3 +117,54 @@ fn test_version_parsing() {
assert_eq!(version.minor_version(), 2);
assert_eq!(version.patch_version(), 1);
}
+
+#[test]
+fn test_version_order() {
+ assert_eq!(
+ MacosVersion::from_raw_version("13.0").unwrap(),
+ MacosVersion::from_raw_version("13.0.0").unwrap()
+ );
+
+ assert!(
+ !(MacosVersion::from_raw_version("13.0").unwrap()
+ < MacosVersion::from_raw_version("13.0.0").unwrap())
+ );
+ assert!(
+ !(MacosVersion::from_raw_version("13.0").unwrap()
+ > MacosVersion::from_raw_version("13.0.0").unwrap())
+ );
+
+ // test major version
+ assert!(
+ MacosVersion::from_raw_version("13.0").unwrap()
+ < MacosVersion::from_raw_version("14.2.1").unwrap()
+ );
+ assert!(
+ MacosVersion::from_raw_version("13.0").unwrap()
+ > MacosVersion::from_raw_version("12.1").unwrap()
+ );
+
+ // test minor version
+ assert!(
+ MacosVersion::from_raw_version("14.3").unwrap()
+ > MacosVersion::from_raw_version("14.2").unwrap()
+ );
+ assert!(
+ MacosVersion::from_raw_version("14.2").unwrap()
+ < MacosVersion::from_raw_version("14.3").unwrap()
+ );
+
+ // test patch version
+ assert!(
+ MacosVersion::from_raw_version("14.2.1").unwrap()
+ > MacosVersion::from_raw_version("14.2").unwrap()
+ );
+ assert!(
+ MacosVersion::from_raw_version("14.2.2").unwrap()
+ > MacosVersion::from_raw_version("14.2.1").unwrap()
+ );
+ assert!(
+ MacosVersion::from_raw_version("14.2.2").unwrap()
+ < MacosVersion::from_raw_version("14.2.3").unwrap()
+ );
+}