diff --git a/src/cli/install.rs b/src/cli/install.rs index 20a0b17..1f92680 100644 --- a/src/cli/install.rs +++ b/src/cli/install.rs @@ -342,7 +342,7 @@ pub async fn install( crate::cli::version::get_installed_versions(engine) .await? .into_iter() - .filter(|version| version_matches(version, &req)) + .filter(|version| version_matches(&req, version)) .next_back() .map(|version| (engine, version)), ) @@ -418,7 +418,7 @@ pub async fn install( continue; }; - if !version_matches(version, &req) { + if !version_matches(&req, version) { multi.suspend(|| { println!("{}: package {id} requires {engine} {req}, but {version} is installed", "warn".yellow().bold()); }); diff --git a/src/cli/version.rs b/src/cli/version.rs index 1d3fb69..bdccd05 100644 --- a/src/cli/version.rs +++ b/src/cli/version.rs @@ -184,7 +184,7 @@ pub async fn get_or_download_engine( let max_matching = installed_versions .iter() - .filter(|v| version_matches(v, &req)) + .filter(|v| version_matches(&req, v)) .next_back(); if let Some(version) = max_matching { return Ok(path diff --git a/src/engine/source/github/mod.rs b/src/engine/source/github/mod.rs index 316e95e..40c865b 100644 --- a/src/engine/source/github/mod.rs +++ b/src/engine/source/github/mod.rs @@ -60,7 +60,7 @@ impl EngineSource for GitHubEngineSource { .into_iter() .filter_map( |release| match release.tag_name.trim_start_matches('v').parse() { - Ok(version) if version_matches(&version, requirement) => { + Ok(version) if version_matches(requirement, &version) => { Some((version, release)) } _ => None, diff --git a/src/lib.rs b/src/lib.rs index 642bbd8..91bced6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -430,7 +430,7 @@ pub async fn find_roots( /// Returns whether a version matches a version requirement /// Differs from `VersionReq::matches` in that EVERY version matches `*` -pub fn version_matches(version: &Version, req: &VersionReq) -> bool { +pub fn version_matches(req: &VersionReq, version: &Version) -> bool { *req == VersionReq::STAR || req.matches(version) } diff --git a/src/main.rs b/src/main.rs index 3d7bf07..9c2afe5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ use anyhow::Context; use clap::{builder::styling::AnsiColor, Parser}; use fs_err::tokio as fs; use indicatif::MultiProgress; -use pesde::{engine::EngineKind, find_roots, AuthConfig, Project}; +use pesde::{engine::EngineKind, find_roots, version_matches, AuthConfig, Project}; use semver::VersionReq; use std::{ io, @@ -297,7 +297,7 @@ async fn run() -> anyhow::Result<()> { if engine == EngineKind::Pesde { match &req { // we're already running a compatible version - Some(req) if req.matches(¤t_version()) => break 'engines, + Some(req) if version_matches(req, ¤t_version()) => break 'engines, // the user has not requested a specific version, so we'll just use the current one None => break 'engines, _ => (), diff --git a/src/source/pesde/mod.rs b/src/source/pesde/mod.rs index d04f687..82e5059 100644 --- a/src/source/pesde/mod.rs +++ b/src/source/pesde/mod.rs @@ -24,7 +24,7 @@ use crate::{ DependencySpecifiers, PackageSource, ResolveResult, VersionId, IGNORED_DIRS, IGNORED_FILES, }, util::hash, - Project, + version_matches, Project, }; use fs_err::tokio as fs; use futures::StreamExt; @@ -163,7 +163,7 @@ impl PackageSource for PesdePackageSource { .into_iter() .filter(|(_, entry)| !entry.yanked) .filter(|(VersionId(version, target), _)| { - specifier.version.matches(version) + version_matches(&specifier.version, version) && specifier.target.unwrap_or(*project_target) == *target }) .map(|(id, entry)| { diff --git a/src/source/wally/mod.rs b/src/source/wally/mod.rs index 36b13c4..5e24815 100644 --- a/src/source/wally/mod.rs +++ b/src/source/wally/mod.rs @@ -17,7 +17,7 @@ use crate::{ PackageSources, ResolveResult, IGNORED_DIRS, IGNORED_FILES, }, util::hash, - Project, + version_matches, Project, }; use fs_err::tokio as fs; use gix::Url; @@ -182,7 +182,9 @@ impl PackageSource for WallyPackageSource { PackageNames::Wally(specifier.name.clone()), entries .into_iter() - .filter(|manifest| specifier.version.matches(&manifest.package.version)) + .filter(|manifest| { + version_matches(&specifier.version, &manifest.package.version) + }) .map(|manifest| { let dependencies = manifest.all_dependencies().map_err(|e| { errors::ResolveError::AllDependencies(specifier.to_string(), e)