From 41e5d9555721113c962b3e059b34465c10184784 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Fri, 24 Jan 2025 06:10:50 -0600 Subject: [PATCH] fix: spurious semver warning on `mise outdated` --- src/aqua/aqua_registry.rs | 42 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/aqua/aqua_registry.rs b/src/aqua/aqua_registry.rs index 86fd162373..91f2644062 100644 --- a/src/aqua/aqua_registry.rs +++ b/src/aqua/aqua_registry.rs @@ -209,6 +209,7 @@ impl AquaRegistry { .next() .wrap_err(format!("no package found for {id} in {path:?}"))?; if let Some(version_filter) = &pkg.version_filter { + // TODO: should this use AquaPackage::expr_parser somehow? pkg.version_filter_expr = Some(Parser::new().compile(version_filter)?); } Ok(pkg) @@ -248,24 +249,8 @@ impl AquaPackage { } fn version_override(&self, v: &str) -> &AquaPackage { - let ver = versions::Versioning::new(v.strip_prefix('v').unwrap_or(v)); - let mut expr = Parser::new(); + let expr = self.expr_parser(v); let ctx = self.expr_ctx(v); - expr.add_function("semver", |c| { - if c.args.len() != 1 { - return Err("semver() takes exactly one argument".to_string().into()); - } - let semver = c.args[0].as_string().unwrap().replace(' ', ""); - if let Some(check_version) = versions::Requirement::new(&semver) { - if let Some(ver) = &ver { - Ok(check_version.matches(ver).into()) - } else { - Err("invalid version".to_string().into()) - } - } else { - Err("invalid semver".to_string().into()) - } - }); vec![self] .into_iter() .chain(self.version_overrides.iter()) @@ -401,10 +386,31 @@ impl AquaPackage { } fn expr(&self, v: &str, program: Program) -> Result { - let expr = Parser::new(); + let expr = self.expr_parser(v); expr.run(program, &self.expr_ctx(v)).map_err(|e| eyre!(e)) } + fn expr_parser(&self, v: &str) -> Parser { + let ver = versions::Versioning::new(v.strip_prefix('v').unwrap_or(v)); + let mut expr = Parser::new(); + expr.add_function("semver", move |c| { + if c.args.len() != 1 { + return Err("semver() takes exactly one argument".to_string().into()); + } + let semver = c.args[0].as_string().unwrap().replace(' ', ""); + if let Some(check_version) = versions::Requirement::new(&semver) { + if let Some(ver) = &ver { + Ok(check_version.matches(ver).into()) + } else { + Err("invalid version".to_string().into()) + } + } else { + Err("invalid semver".to_string().into()) + } + }); + expr + } + fn expr_ctx(&self, v: &str) -> Context { let mut ctx = Context::default(); ctx.insert("Version", v);