From add722b8d356dcc7cf9d3a4feb80312721a8845d Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 18 Feb 2026 14:55:37 +0200 Subject: [PATCH] ensure that save lock isunlocked on success Signed-off-by: Trial97 (cherry picked from commit 464a04a2cbdb3b0a38f19b364f3bed19fa9c46c3) --- .../atlauncher/ATLPackInstallTask.cpp | 103 +++++++-------- .../import_ftb/PackInstallTask.cpp | 105 +++++++-------- .../legacy_ftb/PackInstallTask.cpp | 120 +++++++++--------- 3 files changed, 166 insertions(+), 162 deletions(-) diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp index 5b9551484..fc898c0cc 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp @@ -994,65 +994,66 @@ void PackInstallTask::install() auto instanceConfigPath = FS::PathCombine(m_stagingPath, "instance.cfg"); MinecraftInstance instance(m_globalSettings, std::make_unique(instanceConfigPath), m_stagingPath); - SettingsObject::Lock lock(instance.settings()); + { + SettingsObject::Lock lock(instance.settings()); + auto components = instance.getPackProfile(); + components->buildingFromScratch(); - auto components = instance.getPackProfile(); - components->buildingFromScratch(); - - // Use a component to add libraries BEFORE Minecraft - if (!createLibrariesComponent(instance.instanceRoot(), components)) { - emitFailed(tr("Failed to create libraries component")); - return; - } - - // Minecraft - components->setComponentVersion("net.minecraft", m_version.minecraft, true); - - // Loader - if (m_version.loader.type == QString("forge")) { - auto version = getVersionForLoader("net.minecraftforge"); - if (version == Q_NULLPTR) + // Use a component to add libraries BEFORE Minecraft + if (!createLibrariesComponent(instance.instanceRoot(), components)) { + emitFailed(tr("Failed to create libraries component")); return; + } - components->setComponentVersion("net.minecraftforge", version); - } else if (m_version.loader.type == QString("neoforge")) { - auto version = getVersionForLoader("net.neoforged"); - if (version == Q_NULLPTR) + // Minecraft + components->setComponentVersion("net.minecraft", m_version.minecraft, true); + + // Loader + if (m_version.loader.type == QString("forge")) { + auto version = getVersionForLoader("net.minecraftforge"); + if (version == Q_NULLPTR) + return; + + components->setComponentVersion("net.minecraftforge", version); + } else if (m_version.loader.type == QString("neoforge")) { + auto version = getVersionForLoader("net.neoforged"); + if (version == Q_NULLPTR) + return; + + components->setComponentVersion("net.neoforged", version); + } else if (m_version.loader.type == QString("fabric")) { + auto version = getVersionForLoader("net.fabricmc.fabric-loader"); + if (version == Q_NULLPTR) + return; + + components->setComponentVersion("net.fabricmc.fabric-loader", version); + } else if (m_version.loader.type != QString()) { + emitFailed(tr("Unknown loader type: ") + m_version.loader.type); return; + } - components->setComponentVersion("net.neoforged", version); - } else if (m_version.loader.type == QString("fabric")) { - auto version = getVersionForLoader("net.fabricmc.fabric-loader"); - if (version == Q_NULLPTR) + for (const auto& componentUid : componentsToInstall.keys()) { + auto version = componentsToInstall.value(componentUid); + components->setComponentVersion(componentUid, version->version()); + } + + components->installJarMods(jarmods); + + // Use a component to fill in the rest of the data + // todo: use more detection + if (!createPackComponent(instance.instanceRoot(), components)) { + emitFailed(tr("Failed to create pack component")); return; + } - components->setComponentVersion("net.fabricmc.fabric-loader", version); - } else if (m_version.loader.type != QString()) { - emitFailed(tr("Unknown loader type: ") + m_version.loader.type); - return; + components->saveNow(); + + instance.setName(name()); + instance.setIconKey(m_instIcon); + instance.setManagedPack("atlauncher", m_pack_safe_name, m_pack_name, m_version_name, m_version_name); + + jarmods.clear(); } - - for (const auto& componentUid : componentsToInstall.keys()) { - auto version = componentsToInstall.value(componentUid); - components->setComponentVersion(componentUid, version->version()); - } - - components->installJarMods(jarmods); - - // Use a component to fill in the rest of the data - // todo: use more detection - if (!createPackComponent(instance.instanceRoot(), components)) { - emitFailed(tr("Failed to create pack component")); - return; - } - - components->saveNow(); - - instance.setName(name()); - instance.setIconKey(m_instIcon); - instance.setManagedPack("atlauncher", m_pack_safe_name, m_pack_name, m_version_name, m_version_name); - - jarmods.clear(); emitSucceeded(); } diff --git a/launcher/modplatform/import_ftb/PackInstallTask.cpp b/launcher/modplatform/import_ftb/PackInstallTask.cpp index 48cea691e..878ef26fa 100644 --- a/launcher/modplatform/import_ftb/PackInstallTask.cpp +++ b/launcher/modplatform/import_ftb/PackInstallTask.cpp @@ -52,63 +52,64 @@ void PackInstallTask::copySettings() QString instanceConfigPath = FS::PathCombine(m_stagingPath, "instance.cfg"); MinecraftInstance instance(m_globalSettings, std::make_unique(instanceConfigPath), m_stagingPath); - SettingsObject::Lock lock(instance.settings()); - instance.settings()->set("InstanceType", "OneSix"); - instance.settings()->set("totalTimePlayed", m_pack.totalPlayTime / 1000); + { + SettingsObject::Lock lock(instance.settings()); + instance.settings()->set("InstanceType", "OneSix"); + instance.settings()->set("totalTimePlayed", m_pack.totalPlayTime / 1000); - if (m_pack.jvmArgs.isValid() && !m_pack.jvmArgs.toString().isEmpty()) { - instance.settings()->set("OverrideJavaArgs", true); - instance.settings()->set("JvmArgs", m_pack.jvmArgs.toString()); - } - - auto components = instance.getPackProfile(); - components->buildingFromScratch(); - components->setComponentVersion("net.minecraft", m_pack.mcVersion, true); - - auto modloader = m_pack.loaderType; - if (modloader.has_value()) - switch (modloader.value()) { - case ModPlatform::NeoForge: { - components->setComponentVersion("net.neoforged", m_pack.loaderVersion, true); - break; - } - case ModPlatform::Forge: { - components->setComponentVersion("net.minecraftforge", m_pack.loaderVersion, true); - break; - } - case ModPlatform::Fabric: { - components->setComponentVersion("net.fabricmc.fabric-loader", m_pack.loaderVersion, true); - break; - } - case ModPlatform::Quilt: { - components->setComponentVersion("org.quiltmc.quilt-loader", m_pack.loaderVersion, true); - break; - } - case ModPlatform::Cauldron: - break; - case ModPlatform::LiteLoader: - break; - case ModPlatform::DataPack: - break; - case ModPlatform::Babric: - break; - case ModPlatform::BTA: - break; - case ModPlatform::LegacyFabric: - break; - case ModPlatform::Ornithe: - break; - case ModPlatform::Rift: - break; + if (m_pack.jvmArgs.isValid() && !m_pack.jvmArgs.toString().isEmpty()) { + instance.settings()->set("OverrideJavaArgs", true); + instance.settings()->set("JvmArgs", m_pack.jvmArgs.toString()); } - components->saveNow(); - instance.setName(name()); - if (m_instIcon == "default") - m_instIcon = "ftb_logo"; - instance.setIconKey(m_instIcon); + auto components = instance.getPackProfile(); + components->buildingFromScratch(); + components->setComponentVersion("net.minecraft", m_pack.mcVersion, true); + auto modloader = m_pack.loaderType; + if (modloader.has_value()) + switch (modloader.value()) { + case ModPlatform::NeoForge: { + components->setComponentVersion("net.neoforged", m_pack.loaderVersion, true); + break; + } + case ModPlatform::Forge: { + components->setComponentVersion("net.minecraftforge", m_pack.loaderVersion, true); + break; + } + case ModPlatform::Fabric: { + components->setComponentVersion("net.fabricmc.fabric-loader", m_pack.loaderVersion, true); + break; + } + case ModPlatform::Quilt: { + components->setComponentVersion("org.quiltmc.quilt-loader", m_pack.loaderVersion, true); + break; + } + case ModPlatform::Cauldron: + break; + case ModPlatform::LiteLoader: + break; + case ModPlatform::DataPack: + break; + case ModPlatform::Babric: + break; + case ModPlatform::BTA: + break; + case ModPlatform::LegacyFabric: + break; + case ModPlatform::Ornithe: + break; + case ModPlatform::Rift: + break; + } + components->saveNow(); + + instance.setName(name()); + if (m_instIcon == "default") + m_instIcon = "ftb_logo"; + instance.setIconKey(m_instIcon); + } emitSucceeded(); } diff --git a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp index 51e4f4b9d..06c180fcd 100644 --- a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp +++ b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp @@ -134,76 +134,78 @@ void PackInstallTask::install() QString instanceConfigPath = FS::PathCombine(m_stagingPath, "instance.cfg"); MinecraftInstance instance(m_globalSettings, std::make_unique(instanceConfigPath), m_stagingPath); - SettingsObject::Lock lock(instance.settings()); + { + SettingsObject::Lock lock(instance.settings()); - auto components = instance.getPackProfile(); - components->buildingFromScratch(); - components->setComponentVersion("net.minecraft", m_pack.mcVersion, true); + auto components = instance.getPackProfile(); + components->buildingFromScratch(); + components->setComponentVersion("net.minecraft", m_pack.mcVersion, true); - bool fallback = true; + bool fallback = true; - // handle different versions - QFile packJson(m_stagingPath + "/minecraft/pack.json"); - QDir jarmodDir = QDir(m_stagingPath + "/unzip/instMods"); - if (packJson.exists()) { - if (packJson.open(QIODevice::ReadOnly | QIODevice::Text)) { - QJsonDocument doc = QJsonDocument::fromJson(packJson.readAll()); - packJson.close(); + // handle different versions + QFile packJson(m_stagingPath + "/minecraft/pack.json"); + QDir jarmodDir = QDir(m_stagingPath + "/unzip/instMods"); + if (packJson.exists()) { + if (packJson.open(QIODevice::ReadOnly | QIODevice::Text)) { + QJsonDocument doc = QJsonDocument::fromJson(packJson.readAll()); + packJson.close(); - // we only care about the libs - QJsonArray libs = doc.object().value("libraries").toArray(); + // we only care about the libs + QJsonArray libs = doc.object().value("libraries").toArray(); - for (const auto& value : libs) { - QString nameValue = value.toObject().value("name").toString(); - if (!nameValue.startsWith("net.minecraftforge")) { - continue; + for (const auto& value : libs) { + QString nameValue = value.toObject().value("name").toString(); + if (!nameValue.startsWith("net.minecraftforge")) { + continue; + } + + GradleSpecifier forgeVersion(nameValue); + + components->setComponentVersion("net.minecraftforge", + forgeVersion.version().replace(m_pack.mcVersion, "").replace("-", "")); + packJson.remove(); + fallback = false; + break; } - - GradleSpecifier forgeVersion(nameValue); - - components->setComponentVersion("net.minecraftforge", - forgeVersion.version().replace(m_pack.mcVersion, "").replace("-", "")); - packJson.remove(); - fallback = false; - break; + } else { + qWarning() << "Failed to open file '" << packJson.fileName() << "' for reading!"; } - } else { - qWarning() << "Failed to open file '" << packJson.fileName() << "' for reading!"; - } - } - - if (jarmodDir.exists()) { - qDebug() << "Found jarmods, installing..."; - - QStringList jarmods; - for (auto info : jarmodDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files)) { - qDebug() << "Jarmod:" << info.fileName(); - jarmods.push_back(info.absoluteFilePath()); } - components->installJarMods(jarmods); - fallback = false; + if (jarmodDir.exists()) { + qDebug() << "Found jarmods, installing..."; + + QStringList jarmods; + for (auto info : jarmodDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files)) { + qDebug() << "Jarmod:" << info.fileName(); + jarmods.push_back(info.absoluteFilePath()); + } + + components->installJarMods(jarmods); + fallback = false; + } + + // just nuke unzip directory, it s not needed anymore + FS::deletePath(m_stagingPath + "/unzip"); + + if (fallback) { + // TODO: Some fallback mechanism... or just keep failing! + emitFailed(tr("No installation method found!")); + return; + } + + components->saveNow(); + + progress(4, 4); + + instance.setName(name()); + if (m_instIcon == "default") { + m_instIcon = "ftb_logo"; + } + instance.setIconKey(m_instIcon); } - // just nuke unzip directory, it s not needed anymore - FS::deletePath(m_stagingPath + "/unzip"); - - if (fallback) { - // TODO: Some fallback mechanism... or just keep failing! - emitFailed(tr("No installation method found!")); - return; - } - - components->saveNow(); - - progress(4, 4); - - instance.setName(name()); - if (m_instIcon == "default") { - m_instIcon = "ftb_logo"; - } - instance.setIconKey(m_instIcon); - emitSucceeded(); }