in mrpack export, match with hash rather than by primary on version (#7254)

This commit is contained in:
Prospector
2026-08-20 15:09:58 -07:00
committed by GitHub
parent 5f9522b5cf
commit 82d0184a85
@@ -529,12 +529,12 @@ pub async fn create_mrpack_json(
) )
.await? .await?
.into_iter() .into_iter()
.filter_map(|(path, file)| match file.metadata { .filter_map(|(path, file)| {
Some(metadata) => Some((path, metadata.version_id)), file.metadata
_ => None, .map(|metadata| (path, file.hash, metadata.version_id))
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let version_ids = projects.iter().map(|x| &*x.1).collect::<Vec<_>>(); let version_ids = projects.iter().map(|x| &*x.2).collect::<Vec<_>>();
let versions = CachedEntry::get_version_v3_many( let versions = CachedEntry::get_version_v3_many(
&version_ids, &version_ids,
Some(CacheBehaviour::MustRevalidate), Some(CacheBehaviour::MustRevalidate),
@@ -544,43 +544,38 @@ pub async fn create_mrpack_json(
.await?; .await?;
let files = projects let files = projects
.into_iter() .into_iter()
.filter_map(|(path, version_id)| { .filter_map(|(path, hash, version_id)| {
if let Some(version) = versions.iter().find(|x| x.id == version_id) let version = versions.iter().find(|x| x.id == version_id)?;
{ let env = get_mrpack_environment(version.environment);
let env = get_mrpack_environment(version.environment); let file = version.files.iter().find(|file| {
let Some(primary_file) = version.files.first() else { file.hashes
return Some(Err(crate::ErrorKind::OtherError(format!( .get("sha1")
"No primary file found for mod at: {path}" .is_some_and(|file_hash| file_hash == &hash)
)) })?;
.as_error())); let file_size = file.size;
}; let downloads = vec![file.url.clone()];
let file_size = primary_file.size; let hashes = file
let downloads = vec![primary_file.url.clone()]; .hashes
let hashes = primary_file .clone()
.hashes .into_iter()
.clone() .map(|(h1, h2)| (PackFileHash::from(h1), h2))
.into_iter() .collect();
.map(|(h1, h2)| (PackFileHash::from(h1), h2))
.collect();
Some(Ok(PackFile { Some(Ok(PackFile {
path: match path.try_into() { path: match path.try_into() {
Ok(path) => path, Ok(path) => path,
Err(_) => { Err(_) => {
return Some(Err(crate::ErrorKind::OtherError( return Some(Err(crate::ErrorKind::OtherError(
"Invalid file path in project".into(), "Invalid file path in project".into(),
) )
.as_error())); .as_error()));
} }
}, },
hashes, hashes,
env: Some(env), env: Some(env),
downloads, downloads,
file_size, file_size,
})) }))
} else {
None
}
}) })
.collect::<crate::Result<Vec<PackFile>>>()?; .collect::<crate::Result<Vec<PackFile>>>()?;