summaryrefslogtreecommitdiff
path: root/src/atom/mod.rs
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2025-11-18 03:21:44 +0000
committerJohn Turner <jturner.usa@gmail.com>2025-11-18 03:21:44 +0000
commit2dc5df611258104ec56dbf6cea0089c28766e270 (patch)
tree9498a9aa36b2079bb85c8711fa6eb0df06bd13e6 /src/atom/mod.rs
parente2cc9488035371406d38ad07c8c84c7bb4a2378c (diff)
downloadgentoo-utils-2dc5df611258104ec56dbf6cea0089c28766e270.tar.gz
support portage build-id extension
Diffstat (limited to 'src/atom/mod.rs')
-rw-r--r--src/atom/mod.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/atom/mod.rs b/src/atom/mod.rs
index 54de7ee..0378a8d 100644
--- a/src/atom/mod.rs
+++ b/src/atom/mod.rs
@@ -64,6 +64,7 @@ pub struct Version {
letter: Option<char>,
suffixes: VersionSuffixes,
rev: Option<VersionNumber>,
+ build_id: Option<VersionNumber>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -374,6 +375,13 @@ impl PartialEq for Version {
(Some(_), None) | (None, Some(_)) => false,
(None, None) => true,
}
+ && match (&self.build_id, &other.build_id) {
+ (Some(a), Some(b)) => {
+ a.get().parse::<u64>().unwrap() == b.get().parse::<u64>().unwrap()
+ }
+ (Some(_), None) | (None, Some(_)) => false,
+ (None, None) => true,
+ }
}
}
@@ -410,14 +418,30 @@ impl Ord for Version {
}
match (&self.rev, &other.rev) {
+ (Some(a), Some(b)) => match a
+ .get()
+ .parse::<u64>()
+ .unwrap()
+ .cmp(&b.get().parse().unwrap())
+ {
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => (),
+ },
+ (Some(a), None) if a.get().chars().all(|c| c == '0') => (),
+ (Some(_), None) => return Ordering::Greater,
+ (None, Some(b)) if b.get().chars().all(|c| c == '0') => (),
+ (None, Some(_)) => return Ordering::Less,
+ (None, None) => (),
+ }
+
+ match (&self.build_id, &other.build_id) {
(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,
+ .cmp(&b.get().parse::<u64>().unwrap()),
(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,
}
@@ -759,6 +783,7 @@ mod test {
("1.0.0_alpha", "1.0.0_alpha_p", Ordering::Less),
("1.0.0-r0", "1.0.0", Ordering::Equal),
("1.0.0-r0000", "1.0.0", Ordering::Equal),
+ ("1.0.0-r1-1", "1.0.0-r1-2", Ordering::Less),
];
for (a, b, ordering) in versions.iter().map(|(a, b, ordering)| {