diff --git a/src/main.rs b/src/main.rs index b512847..aa188d0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -253,7 +253,7 @@ fn main() { fn store_path_regex() -> &'static Regex { static REGEX: OnceLock = OnceLock::new(); REGEX.get_or_init(|| { - Regex::new(r"(.+?)-([0-9].*?)$") + Regex::new(r"(.+?)(-([0-9].*?))?$") .expect("Failed to compile regex pattern for nix store paths") }) } @@ -269,8 +269,8 @@ fn store_path_regex() -> &'static Regex { fn get_version<'a>(pack: impl Into<&'a str>) -> Result<(&'a str, &'a str)> { let path = pack.into(); - // We can strip the path since it _always_ starts with - // /nix/store/....- + // We can strip the path since it _always_ follows the format + // /nix/store/<...>--...... // This part is exactly 44 chars long, so we just remove it. let stripped_path = &path[44..]; debug!("Stripped path: {stripped_path}"); @@ -279,11 +279,15 @@ fn get_version<'a>(pack: impl Into<&'a str>) -> Result<(&'a str, &'a str)> { if let Some(cap) = store_path_regex().captures(stripped_path) { // Handle potential missing captures safely let name = cap.get(1).map_or("", |m| m.as_str()); - let version = cap.get(2).map_or("", |m| m.as_str()); + let mut version = cap.get(2).map_or("", |m| m.as_str()); - if name.is_empty() || version.is_empty() { + if version.starts_with('-') { + version = &version[1..]; + } + + if name.is_empty() { return Err(AppError::ParseError { - message: format!("Failed to extract name or version from path: {path}"), + message: format!("Failed to extract name from path: {path}"), context: "get_version".to_string(), source: None, });