summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2025-11-14 23:13:19 +0000
committerJohn Turner <jturner.usa@gmail.com>2025-11-14 23:13:19 +0000
commit07d1823f0fc0a21ebc7858a154bd877040ccb470 (patch)
tree7a5fbff5a13c355389c8fc2748f6fbe13e692aff
parent29af7572a07f59446d410a91df8e3ce601cc1284 (diff)
downloadgentoo-utils-07d1823f0fc0a21ebc7858a154bd877040ccb470.tar.gz
compare version letter in version cmp algo
-rw-r--r--src/atom/mod.rs63
1 files changed, 45 insertions, 18 deletions
diff --git a/src/atom/mod.rs b/src/atom/mod.rs
index 4516410..97c57f7 100644
--- a/src/atom/mod.rs
+++ b/src/atom/mod.rs
@@ -329,6 +329,7 @@ impl PartialEq for Version {
fn eq(&self, other: &Self) -> bool {
self.numbers == other.numbers
&& self.suffixes == other.suffixes
+ && self.letter == other.letter
&& match (&self.rev, &other.rev) {
(Some(a), Some(b)) => {
a.get().parse::<u64>().unwrap() == b.get().parse::<u64>().unwrap()
@@ -353,24 +354,38 @@ impl PartialOrd for Version {
impl Ord for Version {
fn cmp(&self, other: &Self) -> Ordering {
match self.numbers.cmp(&other.numbers) {
- Ordering::Less => Ordering::Less,
- Ordering::Greater => Ordering::Greater,
- Ordering::Equal => match self.suffixes.cmp(&other.suffixes) {
- Ordering::Less => Ordering::Less,
- Ordering::Greater => Ordering::Greater,
- Ordering::Equal => match (&self.rev, &other.rev) {
- (Some(a), Some(b)) => a
- .get()
- .parse::<u64>()
- .unwrap()
- .cmp(&b.get().parse().unwrap()),
- (Some(a), None) if a.get().chars().all(|c| c == '0') => Ordering::Equal,
- (Some(_), None) => Ordering::Greater,
- (None, Some(b)) if b.get().chars().all(|c| c == '0') => Ordering::Equal,
- (None, Some(_)) => Ordering::Less,
- (None, None) => Ordering::Equal,
- },
- },
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => (),
+ }
+
+ match self.suffixes.cmp(&other.suffixes) {
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => (),
+ }
+
+ match (self.letter, other.letter) {
+ (Some(a), Some(b)) if a < b => return Ordering::Less,
+ (Some(a), Some(b)) if a > b => return Ordering::Greater,
+ (Some(a), Some(b)) if a == b => (),
+ (Some(_), None) => return Ordering::Greater,
+ (None, Some(_)) => return Ordering::Less,
+ (None, None) => (),
+ _ => unreachable!(),
+ };
+
+ match (&self.rev, &other.rev) {
+ (Some(a), Some(b)) => a
+ .get()
+ .parse::<u64>()
+ .unwrap()
+ .cmp(&b.get().parse().unwrap()),
+ (Some(a), None) if a.get().chars().all(|c| c == '0') => Ordering::Equal,
+ (Some(_), None) => Ordering::Greater,
+ (None, Some(b)) if b.get().chars().all(|c| c == '0') => Ordering::Equal,
+ (None, Some(_)) => Ordering::Less,
+ (None, None) => Ordering::Equal,
}
}
}
@@ -738,4 +753,16 @@ mod test {
assert_partial_cmp_display!(a, b, ordering);
}
}
+
+ #[test]
+ fn test_version_cmp_letter() {
+ let a = Version::parser()
+ .parse_finished(InputIter::new("1.0.0"))
+ .unwrap();
+ let b = Version::parser()
+ .parse_finished(InputIter::new("1.0.0a"))
+ .unwrap();
+
+ assert_cmp_display!(a, b, Ordering::Less);
+ }
}