Skip to content

Commit 00eb182

Browse files
committed
Versioning
1 parent aa8a496 commit 00eb182

File tree

4 files changed

+156
-7
lines changed

4 files changed

+156
-7
lines changed

development_tools/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ chrono = "0.4.38"
88
env_logger = "0.11.4"
99
log = "0.4.22"
1010
log4rs = "1.3.0"
11+
semver = "1.0.23"
1112
syslog = "6.1.1"

development_tools/src/versioning.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,41 @@
1-
/// TODO implement
2-
pub fn parse_and_increment_version(version: &str) -> String {
3-
version.to_string()
1+
use semver::{Error, Version, VersionReq};
2+
3+
/// Find the maximum version that satisfies the given version requirement string.
4+
///
5+
/// # Arguments
6+
///
7+
/// * `version_req_str` - A string slice that holds the version requirement.
8+
/// * `iterable` - An iterator over a collection of strings that can be parsed into versions.
9+
///
10+
/// # Returns
11+
///
12+
/// * `Ok(Some(Version))` - The maximum version that satisfies the version requirement.
13+
/// * `Ok(None)` - If no version satisfies the version requirement.
14+
/// * `Err(Error)` - If the version requirement string is invalid.
15+
///
16+
/// # Example
17+
///
18+
/// ```
19+
/// use development_tools::find_max_matching_version;
20+
/// use semver::Version;
21+
///
22+
/// assert_eq!(
23+
/// find_max_matching_version("<= 1.0.0", vec!["0.9.0", "1.0.0", "1.0.1"]).unwrap(),
24+
/// Some(Version::parse("1.0.0").unwrap())
25+
/// );
26+
/// ```
27+
pub fn find_max_matching_version<'a, I>(
28+
version_req_str: &str,
29+
iterable: I,
30+
) -> Result<Option<Version>, Error>
31+
where
32+
I: IntoIterator<Item = &'a str>,
33+
{
34+
let v_req = VersionReq::parse(version_req_str)?;
35+
36+
Ok(iterable
37+
.into_iter()
38+
.filter_map(|s| Version::parse(s).ok())
39+
.filter(|s| v_req.matches(s))
40+
.max())
441
}
Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,113 @@
1+
use development_tools::find_max_matching_version;
2+
use semver::{BuildMetadata, Prerelease, Version, VersionReq};
3+
use std::process::Command;
4+
15
#[cfg(test)]
2-
mod tests_versioning {}
6+
mod tests_versioning {
7+
8+
use super::*;
9+
10+
#[test]
11+
fn test_parse_and_increment_version() {
12+
let mut parsed_version = Version::parse("0.2.6").unwrap();
13+
14+
assert_eq!(
15+
parsed_version,
16+
Version {
17+
major: 0,
18+
minor: 2,
19+
patch: 6,
20+
pre: Prerelease::EMPTY,
21+
build: BuildMetadata::EMPTY,
22+
}
23+
);
24+
25+
parsed_version.patch += 1;
26+
assert_eq!(parsed_version.to_string(), "0.2.7");
27+
println!("New patch release: v{}", parsed_version);
28+
29+
parsed_version.minor += 1;
30+
parsed_version.patch = 0;
31+
assert_eq!(parsed_version.to_string(), "0.3.0");
32+
println!("New minor release: v{}", parsed_version);
33+
34+
parsed_version.major += 1;
35+
parsed_version.minor = 0;
36+
assert_eq!(parsed_version.to_string(), "1.0.0");
37+
println!("New major release: v{}", parsed_version);
38+
}
39+
40+
#[test]
41+
fn test_parse_complex_version() {
42+
let version_str = "1.0.49-125+g72ee7853";
43+
let parsed_version = Version::parse(version_str).unwrap();
44+
let pre = Prerelease::new("125").unwrap();
45+
let build = BuildMetadata::new("g72ee7853").unwrap();
46+
47+
assert_eq!(
48+
parsed_version,
49+
Version {
50+
major: 1,
51+
minor: 0,
52+
patch: 49,
53+
pre,
54+
build
55+
}
56+
);
57+
58+
assert_eq!(
59+
parsed_version.build,
60+
BuildMetadata::new("g72ee7853").unwrap()
61+
);
62+
63+
let serialized_version = parsed_version.to_string();
64+
assert_eq!(&serialized_version, version_str);
65+
}
66+
67+
#[test]
68+
fn test_version_is_prerelease() {
69+
let version_1 = Version::parse("1.0.0-alpha").unwrap();
70+
let version_2 = Version::parse("1.0.0").unwrap();
71+
72+
assert!(!version_1.pre.is_empty());
73+
assert!(version_2.pre.is_empty());
74+
}
75+
76+
#[test]
77+
fn test_find_max_matching_version() {
78+
assert_eq!(
79+
find_max_matching_version("<= 1.0.0", vec!["0.9.0", "1.0.0", "1.0.1"]).unwrap(),
80+
Some(Version::parse("1.0.0").unwrap())
81+
);
82+
83+
assert_eq!(
84+
find_max_matching_version(
85+
">1.2.3-alpha.3",
86+
vec![
87+
"1.2.3-alpha.3",
88+
"1.2.3-alpha.4",
89+
"1.2.3-alpha.10",
90+
"1.2.3-beta.4",
91+
"3.4.5-alpha.9",
92+
]
93+
)
94+
.unwrap(),
95+
Some(Version::parse("1.2.3-beta.4").unwrap())
96+
);
97+
}
98+
99+
#[test]
100+
fn test_check_external_command_version_for_compatibility() {
101+
let version_constraint = ">=1.50.0";
102+
let version_test = VersionReq::parse(version_constraint).unwrap();
103+
let output = Command::new("rustc").arg("--version").output().unwrap();
104+
105+
assert_eq!(output.status.success(), true);
106+
107+
let version_str = String::from_utf8(output.stdout).unwrap();
108+
let version = version_str.split_whitespace().nth(1).unwrap();
109+
let parsed_version = Version::parse(version).unwrap();
110+
111+
assert!(version_test.matches(&parsed_version));
112+
}
113+
}

src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ fn main() {
283283
log::debug!("[foo] debug");
284284
foo::run();
285285
// Versioning
286-
let version = "1.2.3";
287-
let result = parse_and_increment_version(version);
288-
println!("Version: {}", result);
286+
let max_version =
287+
find_max_matching_version("<= 1.0.0", vec!["0.9.0", "1.0.0", "1.0.1"]).unwrap();
288+
println!("Max version: {:?}", max_version);
289289
}

0 commit comments

Comments
 (0)