feat: complete hosted mod sync and launcher interface updates
Some checks failed
Axolotl desktop CI / guardrails (push) Has been cancelled
Axolotl desktop CI / desktop (macos-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (ubuntu-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (windows-latest) (push) Has been cancelled
Axolotl desktop CI / website (push) Has been cancelled
Repository checks / typos (push) Has been cancelled
Repository checks / tombi (push) Has been cancelled
Rust checks / shear (push) Has been cancelled
Sync source to CNB / Sync Git ref (push) Has been cancelled

Add pack sync markers, tagged mod updates, parallel progress, JWT downloads and retry recovery. Include pending onboarding, about scene, compatibility data pack and download fixes.
This commit is contained in:
2026-09-15 19:06:56 +08:00
parent 5d473ebfbc
commit bc904065c3
63 changed files with 3516 additions and 1059 deletions

View File

@ -642,11 +642,17 @@ pub(crate) fn is_native_library(library: &Library) -> bool {
.is_some_and(|classifier| classifier.starts_with("natives-"))
}
/// Whether this library carries a Java artifact (regular JAR) that must be
/// downloaded and placed on the classpath. A library can have both a Java
/// Whether this library carries a non-native primary artifact that must be
/// downloaded. This is normally a Java JAR, but loader processors can also
/// declare archives and mapping files. A library can have both a primary
/// artifact and native classifiers after manifest merging (LWJGL is the
/// canonical example); the two are independent and must not be treated as
/// mutually exclusive.
///
/// `include_in_classpath` only controls the final Minecraft runtime classpath.
/// Forge and NeoForge deliberately exclude installer processor dependencies
/// from that classpath, but those artifacts are still required while the
/// loader processors run.
pub(crate) fn needs_java_artifact(library: &Library) -> bool {
// Four-part native coordinates (group:artifact:version:natives-*) store
// their native archive metadata in downloads.artifact, which is not a
@ -671,7 +677,7 @@ pub(crate) fn needs_java_artifact(library: &Library) -> bool {
{
return false;
}
library.include_in_classpath
true
}
fn java_artifact_applies(
@ -2853,6 +2859,26 @@ mod tests {
);
}
#[test]
fn neoforge_processor_dependency_is_downloaded_outside_runtime_classpath() {
let library: Library = serde_json::from_value(serde_json::json!({
"name": "net.neoforged.installertools:installertools:2.1.2",
"include_in_classpath": false,
"downloadable": true,
"downloads": {"artifact": {
"path": "net/neoforged/installertools/installertools/2.1.2/installertools-2.1.2.jar",
"url": "https://maven.neoforged.net/releases/net/neoforged/installertools/installertools/2.1.2/installertools-2.1.2.jar",
"sha1": "72524c0362f812d8aa4cdb4c03e9b45e2b71ae3b",
"size": 83543
}}
}))
.unwrap();
assert!(!library.include_in_classpath);
assert!(needs_java_artifact(&library));
assert!(java_artifact_applies(&library, "x86_64", false));
}
#[test]
fn java_artifact_rules_are_applied_before_path_deduplication() {
let blocked: Library = serde_json::from_value(serde_json::json!({