From d0e538b1fbcc71e7bd42b321c0eb3f5f2265656b Mon Sep 17 00:00:00 2001 From: Bloxx12 Date: Tue, 6 May 2025 12:29:52 +0200 Subject: [PATCH] main: strip nix store paths the paths we match with regex are always prefixed with /nix/store/<...>-, which amounts to 44 chars. Since this is always the same, we can just strip these 44 chars before matching with regex. This reduces both complexity of the regex and performance. --- src/main.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 65e881b..9e54fd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -254,7 +254,7 @@ fn main() { fn store_path_regex() -> &'static Regex { static REGEX: OnceLock = OnceLock::new(); REGEX.get_or_init(|| { - Regex::new(r"^/nix/store/[a-z0-9]+-(.+?)-([0-9].*?)$") + Regex::new(r"(.+?)-([0-9].*?)$") .expect("Failed to compile regex pattern for nix store paths") }) } @@ -263,8 +263,14 @@ 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/....- + // This part is exactly 44 chars long, so we just remove it. + let stripped_path = &path[44..]; + debug!("Stripped path: {stripped_path}"); + // Match the regex against the input - if let Some(cap) = store_path_regex().captures(path) { + 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());