fetch: use flexver for file selection

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ia01283a5665ac9497858821f13a7751d6a6a6964
This commit is contained in:
raf 2026-04-18 21:29:16 +03:00
commit af3cdbf343
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

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