From b6d7ffab477cbd7d6c49c4c16ec1de615279e7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 13 Apr 2014 23:06:28 +0200 Subject: [PATCH] Detect and report missing local libraries. --- logic/OneSixLibrary.cpp | 27 +++++++++++++-------------- logic/OneSixLibrary.h | 1 + logic/OneSixUpdate.cpp | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/logic/OneSixLibrary.cpp b/logic/OneSixLibrary.cpp index c78679d1..7032809d 100644 --- a/logic/OneSixLibrary.cpp +++ b/logic/OneSixLibrary.cpp @@ -140,33 +140,32 @@ QString OneSixLibrary::hint() const return m_hint; } -bool OneSixLibrary::filesExist() +QStringList OneSixLibrary::files() { + QStringList retval; QString storage = storagePath(); if (storage.contains("${arch}")) { QString cooked_storage = storage; cooked_storage.replace("${arch}", "32"); - QFileInfo info32(PathCombine("libraries", cooked_storage)); - if (!info32.exists()) - { - return false; - } + retval.append(PathCombine("libraries", cooked_storage)); cooked_storage = storage; cooked_storage.replace("${arch}", "64"); - QFileInfo info64(PathCombine("libraries", cooked_storage)); - if (!info64.exists()) - { - return false; - } + retval.append(PathCombine("libraries", cooked_storage)); } else + retval.append(PathCombine("libraries", storage)); + return retval; +} + +bool OneSixLibrary::filesExist() +{ + auto libFiles = files(); + for(auto file: libFiles) { - QFileInfo info(PathCombine("libraries", storage)); + QFileInfo info(file); if (!info.exists()) - { return false; - } } return true; } diff --git a/logic/OneSixLibrary.h b/logic/OneSixLibrary.h index 3bd21c51..a74b7cac 100644 --- a/logic/OneSixLibrary.h +++ b/logic/OneSixLibrary.h @@ -143,4 +143,5 @@ public: bool extractTo(QString target_dir); bool filesExist(); + QStringList files(); }; diff --git a/logic/OneSixUpdate.cpp b/logic/OneSixUpdate.cpp index cddd0def..27bc415f 100644 --- a/logic/OneSixUpdate.cpp +++ b/logic/OneSixUpdate.cpp @@ -268,10 +268,16 @@ void OneSixUpdate::jarlibStart() auto metacache = MMC->metacache(); QList ForgeLibs; + QList> brokenLocalLibs; + for (auto lib : libs) { if (lib->hint() == "local") + { + if(!lib->filesExist()) + brokenLocalLibs.append(lib); continue; + } QString raw_storage = lib->storagePath(); QString raw_dl = lib->downloadUrl(); @@ -305,6 +311,18 @@ void OneSixUpdate::jarlibStart() f(raw_storage, raw_dl); } } + if(!brokenLocalLibs.empty()) + { + jarlibDownloadJob.reset(); + QStringList failed; + for(auto brokenLib : brokenLocalLibs) + { + failed.append(brokenLib->files()); + } + QString failed_all = failed.join("\n"); + emitFailed(tr("Some libraries marked as 'local' are missing their jar files:\n%1\n\nYou'll have to correct this problem manually. If this is an externally tracked instance, make sure to run it at least once outside of MultiMC.").arg(failed_all)); + return; + } // TODO: think about how to propagate this from the original json file... or IF AT ALL QString forgeMirrorList = "http://files.minecraftforge.net/mirror-brand.list"; if (!ForgeLibs.empty())