diff --git a/packages/core/src/store/package.rs b/packages/core/src/store/package.rs index 445b6035..12d3f233 100644 --- a/packages/core/src/store/package.rs +++ b/packages/core/src/store/package.rs @@ -476,7 +476,17 @@ impl PackageManager { let not_found = infer_modrinth(packages, packages_to_infer, package_type).await; if let Some(not_found) = not_found { - infer_curseforge(packages, not_found, package_type).await; + if let Some(not_found) = infer_curseforge(packages, not_found, package_type).await { + for path in not_found { + tracing::warn!("failed to infer package: {:?}", path); + + let package_path = PackagePath::new(&path); + let meta = PackageMetadata::Unknown; + let package = Package::new(&package_path, meta)?; + + packages.insert(package_path, package); + } + } } } @@ -600,7 +610,7 @@ async fn infer_modrinth(packages: &mut PackagesMap, to_infer: HashSet, } #[tracing::instrument(skip(packages, to_infer))] -async fn infer_curseforge(packages: &mut PackagesMap, to_infer: HashSet, package_type: PackageType) { +async fn infer_curseforge(packages: &mut PackagesMap, to_infer: HashSet, package_type: PackageType) -> Option> { let provider = Providers::Curseforge; let mut murmur_map = HashMap::::new(); @@ -610,14 +620,22 @@ async fn infer_curseforge(packages: &mut PackagesMap, to_infer: HashSet } }); - let sha1_len = murmur_map.len(); + let murmur_len = murmur_map.len(); match provider.get_versions_by_hashes(murmur_map.iter().map(|hash| hash.0.clone()).collect()).await { Ok(versions) => { - let found_all = (sha1_len - versions.len()) <= 0; + let found_all = (murmur_len - versions.len()) <= 0; - if !found_all { - tracing::warn!("failed to infer all packages from Curseforge"); - } + let havent_found = if !found_all { + Some(murmur_map.iter().filter_map(|(hash, path)| { + if versions.contains_key(hash) { + None + } else { + Some(path.clone()) + } + }).collect::>()) + } else { + None + }; for (hash, version) in versions { let package_path = match murmur_map.get(&hash) { @@ -640,11 +658,15 @@ async fn infer_curseforge(packages: &mut PackagesMap, to_infer: HashSet packages.insert(package_path, package); } } + + return havent_found; }, Err(err) => { tracing::error!("failed to get versions from Curseforge: {}", err); } }; + + return Some(to_infer); } /// Metadata that represents a [`Package`].