feat: switch to version_matches for semver comparison

Fixes `*` not resolving to versions which are
pre-releases.
This commit is contained in:
daimond113 2025-01-16 22:48:43 +01:00
parent 6ae7e5078c
commit 805a257a76
No known key found for this signature in database
GPG key ID: 3A8ECE51328B513C
7 changed files with 13 additions and 11 deletions

View file

@ -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());
});

View file

@ -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

View file

@ -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,

View file

@ -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)
}

View file

@ -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(&current_version()) => break 'engines,
Some(req) if version_matches(req, &current_version()) => break 'engines,
// the user has not requested a specific version, so we'll just use the current one
None => break 'engines,
_ => (),

View file

@ -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)| {

View file

@ -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)