From af3cdbf343fe64b9f58e631433906640e3f29c37 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sat, 18 Apr 2026 21:29:16 +0300 Subject: [PATCH] fetch: use flexver for file selection Signed-off-by: NotAShelf Change-Id: Ia01283a5665ac9497858821f13a7751d6a6a6964 --- src/fetch.rs | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/fetch.rs b/src/fetch.rs index 5049c24..ecf0f28 100644 --- a/src/fetch.rs +++ b/src/fetch.rs @@ -11,8 +11,8 @@ use tokio::sync::Semaphore; use crate::{ error::{PakkerError, Result}, - model::{Config, LockFile, Project, ProjectFile}, - utils::verify_hash, + model::{Config, LockFile, Project, ProjectFile, UpdateStrategy}, + utils::{FlexVer, verify_hash}, }; /// Maximum number of concurrent downloads @@ -326,18 +326,25 @@ impl Fetcher { ))); } - // Prefer release over beta over alpha - let best = compatible_files - .iter() - .max_by_key(|f| { - let type_priority = match f.release_type { - crate::model::ReleaseType::Release => 3, - crate::model::ReleaseType::Beta => 2, - crate::model::ReleaseType::Alpha => 1, - }; - (type_priority, &f.date_published) - }) - .unwrap(); + // Select best file based on update strategy + let best = if project.update_strategy == UpdateStrategy::FlexVer { + let mut sorted: Vec<_> = compatible_files.iter().collect(); + sorted.sort_by(|a, b| FlexVer(&b.file_name).cmp(&FlexVer(&a.file_name))); + *sorted.first().unwrap() + } else { + // Prefer release over beta over alpha, then by date published + compatible_files + .iter() + .max_by_key(|f| { + let type_priority = match f.release_type { + crate::model::ReleaseType::Release => 3, + crate::model::ReleaseType::Beta => 2, + crate::model::ReleaseType::Alpha => 1, + }; + (type_priority, &f.date_published) + }) + .unwrap() + }; Ok(best) }