@@ -733,84 +733,85 @@ pub async fn retrieve_data(
733733 }
734734 //futures::future::try_join_all(version_futures).await?;
735735
736- // Get old manifest versions for merging
737- let old_manifest_versions = if let Ok ( old_versions ) = Arc :: try_unwrap ( old_versions ) {
738- old_versions . into_inner ( )
739- } else {
740- Vec :: new ( )
736+ // Extract versions by locking the mutex instead of try_unwrap
737+ // This avoids silent failures when Arc still has strong references from async closures
738+ let old_manifest_versions = {
739+ let mut guard = old_versions . lock ( ) . await ;
740+ std :: mem :: take ( & mut * guard )
741741 } ;
742742
743- if let Ok ( versions) = Arc :: try_unwrap ( versions) {
744- let new_versions = versions. into_inner ( ) ;
745-
746- // Merge new versions with old ones to preserve existing data
747- let mut final_versions = old_manifest_versions;
743+ let new_versions = {
744+ let mut guard = versions. lock ( ) . await ;
745+ std:: mem:: take ( & mut * guard)
746+ } ;
748747
749- for new_version in new_versions {
750- if let Some ( existing) = final_versions. iter_mut ( ) . find ( |v| v. id == new_version. id ) {
751- // Merge loaders: keep old loaders + add/update new ones
752- for new_loader in new_version. loaders {
753- if let Some ( existing_loader) = existing. loaders . iter_mut ( ) . find ( |l| l. id == new_loader. id ) {
754- let loader_id = new_loader. id . clone ( ) ;
755- * existing_loader = new_loader;
756- info ! ( "✅ Forge - Updated loader: {}/{}" , existing. id, loader_id) ;
757- } else {
758- info ! ( "✅ Forge - Added new loader: {}/{}" , existing. id, new_loader. id) ;
759- existing. loaders . push ( new_loader) ;
760- }
748+ // Merge new versions with old ones to preserve existing data
749+ let mut final_versions = old_manifest_versions;
750+
751+ for new_version in new_versions {
752+ if let Some ( existing) = final_versions. iter_mut ( ) . find ( |v| v. id == new_version. id ) {
753+ // Merge loaders: keep old loaders + add/update new ones
754+ for new_loader in new_version. loaders {
755+ if let Some ( existing_loader) = existing. loaders . iter_mut ( ) . find ( |l| l. id == new_loader. id ) {
756+ let loader_id = new_loader. id . clone ( ) ;
757+ * existing_loader = new_loader;
758+ info ! ( "✅ Forge - Updated loader: {}/{}" , existing. id, loader_id) ;
759+ } else {
760+ info ! ( "✅ Forge - Added new loader: {}/{}" , existing. id, new_loader. id) ;
761+ existing. loaders . push ( new_loader) ;
761762 }
762- } else {
763- info ! ( "✅ Forge - Added new Minecraft version: {}" , new_version. id) ;
764- final_versions. push ( new_version) ;
765763 }
764+ } else {
765+ info ! ( "✅ Forge - Added new Minecraft version: {}" , new_version. id) ;
766+ final_versions. push ( new_version) ;
766767 }
768+ }
767769
768- // Sort versions
769- final_versions. sort_by ( |x, y| {
770- minecraft_versions
771- . versions
772- . iter ( )
773- . position ( |z| {
774- x. id . replace ( "1.7.10_pre4" , "1.7.10-pre4" ) == z. id
775- } )
776- . unwrap_or_default ( )
777- . cmp (
778- & minecraft_versions
779- . versions
780- . iter ( )
781- . position ( |z| {
782- y. id . replace ( "1.7.10_pre4" , "1.7.10-pre4" ) == z. id
783- } )
784- . unwrap_or_default ( ) ,
785- )
786- } ) ;
787-
788- // Sort loaders within each version
789- for version in & mut final_versions {
790- let loader_versions = maven_metadata. get ( & version. id ) ;
791- if let Some ( loader_versions) = loader_versions {
792- version. loaders . sort_by ( |x, y| {
793- loader_versions
794- . iter ( )
795- . position ( |z| & y. id == z)
796- . unwrap_or_default ( )
797- . cmp (
798- & loader_versions
799- . iter ( )
800- . position ( |z| & x. id == z)
801- . unwrap_or_default ( ) ,
802- )
803- } )
804- }
770+ // Sort versions
771+ final_versions. sort_by ( |x, y| {
772+ minecraft_versions
773+ . versions
774+ . iter ( )
775+ . position ( |z| {
776+ x. id . replace ( "1.7.10_pre4" , "1.7.10-pre4" ) == z. id
777+ } )
778+ . unwrap_or_default ( )
779+ . cmp (
780+ & minecraft_versions
781+ . versions
782+ . iter ( )
783+ . position ( |z| {
784+ y. id . replace ( "1.7.10_pre4" , "1.7.10-pre4" ) == z. id
785+ } )
786+ . unwrap_or_default ( ) ,
787+ )
788+ } ) ;
789+
790+ // Sort loaders within each version
791+ for version in & mut final_versions {
792+ let loader_versions = maven_metadata. get ( & version. id ) ;
793+ if let Some ( loader_versions) = loader_versions {
794+ version. loaders . sort_by ( |x, y| {
795+ loader_versions
796+ . iter ( )
797+ . position ( |z| & y. id == z)
798+ . unwrap_or_default ( )
799+ . cmp (
800+ & loader_versions
801+ . iter ( )
802+ . position ( |z| & x. id == z)
803+ . unwrap_or_default ( ) ,
804+ )
805+ } )
805806 }
806-
807- // Set the full Forge versions JSON in manifest_builder with nested structure
808- // This preserves game version -> loader version mappings
809- let versions_json = serde_json:: to_value ( & final_versions) ?;
810- manifest_builder. set_loader_versions ( "forge" , versions_json) ;
811- info ! ( version_count = final_versions. len( ) , "Set Forge versions with nested structure in CAS manifest builder" ) ;
812807 }
813808
809+ // Set the full Forge versions JSON in manifest_builder with nested structure
810+ // This preserves game version -> loader version mappings
811+ let versions_json = serde_json:: to_value ( & final_versions) ?;
812+ manifest_builder. set_loader_versions ( "forge" , versions_json) ;
813+ info ! ( version_count = final_versions. len( ) , "Set Forge versions with nested structure in CAS manifest builder" ) ;
814+
814815 Ok ( ( ) )
815816}
816817
0 commit comments