Skip to content

Commit a8577e7

Browse files
committed
Refactors CAS manifest handling for loaders
1 parent 8611fbd commit a8577e7

8 files changed

Lines changed: 195 additions & 94 deletions

File tree

daedalus/src/lib.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,10 @@ impl GradleSpecifier {
187187

188188
/// Returns if specifier belongs to a lwjgl library
189189
pub fn is_lwjgl(&self) -> bool {
190-
vec![
191-
"org.lwjgl",
190+
["org.lwjgl",
192191
"org.lwjgl.lwjgl",
193192
"net.java.jinput",
194-
"net.java.jutils",
195-
]
193+
"net.java.jutils"]
196194
.contains(&self.package.as_str())
197195
}
198196

@@ -379,7 +377,7 @@ pub async fn download_file_mirrors(
379377
}
380378
}
381379

382-
return Err(Error::MirrorsFailed("No mirrors succeeded!".to_string()));
380+
Err(Error::MirrorsFailed("No mirrors succeeded!".to_string()))
383381
}
384382

385383
/// Downloads a file with retry and checksum functionality

daedalus/src/version.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,25 @@ pub enum MinecraftVersion {
2020
/// Snapshot version (YYwWWx format)
2121
/// Example: 23w10a = year 23, week 10, revision a
2222
Snapshot {
23+
/// Year (e.g., 23 for 2023)
2324
year: u32,
25+
/// Week number (1-52)
2426
week: u32,
27+
/// Revision letter (e.g., "a", "b")
2528
revision: String,
2629
},
2730
/// Regular release version
2831
/// Example: 1.20.4
2932
Release {
33+
/// Major version number
3034
major: u32,
35+
/// Minor version number
3136
minor: u32,
37+
/// Patch version number
3238
patch: u32,
39+
/// Pre-release identifier (pre, rc, etc.)
3340
prerelease: Option<Prerelease>,
41+
/// Build metadata (for Forge versions)
3442
build: Option<Vec<u32>>,
3543
},
3644
}

daedalus_client/src/forge.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -411,13 +411,6 @@ pub async fn retrieve_data(
411411
new_hash.clone()
412412
};
413413

414-
manifest_builder.add_version(
415-
"forge",
416-
loader_version_full.to_string(),
417-
version_hash.clone(),
418-
version_bytes.len() as u64,
419-
);
420-
421414
let base_url = dotenvy::var("BASE_URL").unwrap();
422415
let cas_url = format!(
423416
"{}/v{}/objects/{}/{}",
@@ -745,13 +738,6 @@ pub async fn retrieve_data(
745738
new_hash.clone()
746739
};
747740

748-
manifest_builder.add_version(
749-
"forge",
750-
loader_version_full.to_string(),
751-
version_hash.clone(),
752-
version_bytes.len() as u64,
753-
);
754-
755741
let base_url = dotenvy::var("BASE_URL").unwrap();
756742
let cas_url = format!(
757743
"{}/v{}/objects/{}/{}",
@@ -930,6 +916,12 @@ pub async fn retrieve_data(
930916
})
931917
}
932918
}
919+
920+
// Set the full Forge versions JSON in manifest_builder with nested structure
921+
// This preserves game version -> loader version mappings
922+
let versions_json = serde_json::to_value(&final_versions)?;
923+
manifest_builder.set_loader_versions("forge", versions_json);
924+
info!(version_count = final_versions.len(), "Set Forge versions with nested structure in CAS manifest builder");
933925
}
934926

935927
Ok(())

daedalus_client/src/loaders/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ impl<S: LoaderStrategy> LoaderProcessor<S> {
557557
loader.clone(),
558558
version_hash.clone(),
559559
version_bytes.len() as u64,
560+
version_info.release_time,
560561
);
561562

562563
let base_url = dotenvy::var("BASE_URL").unwrap();

daedalus_client/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ fn main() -> Result<(), crate::infrastructure::error::Error> {
382382

383383
info!(
384384
loader = %loader,
385-
version_count = loader_manifest.versions.len(),
385+
version_count = loader_manifest.versions.as_array().map(|a| a.len()).unwrap_or(0),
386386
path = %manifest_path,
387387
"Uploading loader manifest"
388388
);

daedalus_client/src/minecraft.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -641,9 +641,7 @@ pub async fn retrieve_data(
641641
.expect("Safe to unwrap since we ensure it's valid in version_json already")
642642
}),
643643
compliance_level: 1,
644-
assets_index_url: Some(
645-
version_info.asset_index.sha1.clone(),
646-
),
644+
assets_index_url: Some(format_url(&assets_path)),
647645
assets_index_sha1: Some(
648646
version_info.asset_index.sha1.clone(),
649647
),
@@ -691,19 +689,16 @@ pub async fn retrieve_data(
691689
}
692690

693691
let version_bytes = serde_json::to_vec(&version_info)?;
694-
let version_hash = uploader.upload_cas(
692+
let _version_hash = uploader.upload_cas(
695693
version_bytes.clone(),
696694
Some("application/json".to_string()),
697695
s3_client,
698696
semaphore.clone(),
699697
).await?;
700698

701-
manifest_builder.add_version(
702-
"minecraft",
703-
version_info.id.clone(),
704-
version_hash,
705-
version_bytes.len() as u64,
706-
);
699+
// NOTE: We don't call manifest_builder.add_version() for minecraft here.
700+
// Instead, we use set_loader_versions() with the full VersionManifest at the end
701+
// to preserve rich metadata (type, url, time, releaseTime, sha1, etc.)
707702

708703
Ok::<(), crate::infrastructure::error::Error>(())
709704
}
@@ -861,6 +856,7 @@ pub async fn retrieve_data(
861856
lwjgl.version.clone(),
862857
lwjgl_hash,
863858
lwjgl_bytes.len() as u64,
859+
lwjgl.release_time,
864860
);
865861

866862
} else {
@@ -887,13 +883,22 @@ pub async fn retrieve_data(
887883
let elapsed = now.elapsed();
888884
info!("Elapsed: {:.2?}", elapsed);
889885

890-
Ok(Arc::try_unwrap(cloned_manifest)
886+
// Get the final manifest with all processed versions
887+
let final_manifest = Arc::try_unwrap(cloned_manifest)
891888
.map_err(|err| {
892889
crate::infrastructure::error::invalid_input(
893890
format!("Failed to unwrap Arc<Mutex<VersionManifest>>: {:?}", err)
894891
)
895892
})?
896-
.into_inner())
893+
.into_inner();
894+
895+
// Set the full Minecraft versions JSON in manifest_builder
896+
// This preserves rich metadata (type, url, time, releaseTime, sha1, complianceLevel, etc.)
897+
let versions_json = serde_json::to_value(&final_manifest.versions)?;
898+
manifest_builder.set_loader_versions("minecraft", versions_json);
899+
info!(version_count = final_manifest.versions.len(), "Set Minecraft versions with rich metadata in CAS manifest builder");
900+
901+
Ok(final_manifest)
897902
}
898903

899904
#[derive(Deserialize, Debug, Clone)]

daedalus_client/src/neoforge.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -368,13 +368,6 @@ pub async fn retrieve_data(
368368
new_hash.clone()
369369
};
370370

371-
manifest_builder.add_version(
372-
"neoforge",
373-
loader_version_full.to_string(),
374-
version_hash.clone(),
375-
version_bytes.len() as u64,
376-
);
377-
378371
let base_url = dotenvy::var("BASE_URL").unwrap();
379372
let cas_url = format!(
380373
"{}/v{}/objects/{}/{}",
@@ -558,13 +551,11 @@ pub async fn retrieve_data(
558551
}
559552
}
560553

561-
// Note: Versions are now tracked in ManifestBuilder and uploaded separately
562-
// in the main loop via manifest_builder.build_loader_manifest()
563-
564-
info!(
565-
"✅ NeoForge - Processed {} Minecraft versions",
566-
final_versions.len()
567-
);
554+
// Set the full NeoForge versions JSON in manifest_builder with nested structure
555+
// This preserves game version -> loader version mappings
556+
let versions_json = serde_json::to_value(&final_versions)?;
557+
manifest_builder.set_loader_versions("neoforge", versions_json);
558+
info!(version_count = final_versions.len(), "Set NeoForge versions with nested structure in CAS manifest builder");
568559
}
569560

570561
Ok(())

0 commit comments

Comments
 (0)