NOISSUE add instance-local library storage
Any libraries stored in $instanceroot/libraries/ will override the libraries from MultiMC's global folders, as long as they are marked 'local' in the json patch.
This commit is contained in:
		| @@ -55,18 +55,23 @@ struct GradleSpecifier | |||||||
| 		} | 		} | ||||||
| 		return retval; | 		return retval; | ||||||
| 	} | 	} | ||||||
|  | 	QString getFileName() const | ||||||
|  | 	{ | ||||||
|  | 		QString filename = m_artifactId + '-' + m_version; | ||||||
|  | 		if(!m_classifier.isEmpty()) | ||||||
|  | 		{ | ||||||
|  | 			filename += "-" + m_classifier; | ||||||
|  | 		} | ||||||
|  | 		filename += "." + m_extension; | ||||||
|  | 		return filename; | ||||||
|  | 	} | ||||||
| 	QString toPath() const | 	QString toPath() const | ||||||
| 	{ | 	{ | ||||||
| 		if(!m_valid) | 		if(!m_valid) | ||||||
| 			return "INVALID"; | 			return "INVALID"; | ||||||
| 		QString path = m_groupId; | 		QString path = m_groupId; | ||||||
| 		path.replace('.', '/'); | 		path.replace('.', '/'); | ||||||
| 		path += '/' + m_artifactId + '/' + m_version + '/' + m_artifactId + '-' + m_version; | 		path += '/' + m_artifactId + '/' + m_version + '/' + getFileName(); | ||||||
| 		if(!m_classifier.isEmpty()) |  | ||||||
| 		{ |  | ||||||
| 			path += "-" + m_classifier; |  | ||||||
| 		} |  | ||||||
| 		path += "." + m_extension; |  | ||||||
| 		return path; | 		return path; | ||||||
| 	} | 	} | ||||||
| 	inline bool valid() const | 	inline bool valid() const | ||||||
|   | |||||||
| @@ -1,15 +1,31 @@ | |||||||
| #include "Library.h" | #include "Library.h" | ||||||
|  | #include "MinecraftInstance.h" | ||||||
|  |  | ||||||
| #include <net/Download.h> | #include <net/Download.h> | ||||||
| #include <net/ChecksumValidator.h> | #include <net/ChecksumValidator.h> | ||||||
| #include <minecraft/forge/ForgeXzDownload.h> | #include <minecraft/forge/ForgeXzDownload.h> | ||||||
| #include <Env.h> | #include <Env.h> | ||||||
| #include <FileSystem.h> | #include <FileSystem.h> | ||||||
|  |  | ||||||
| void Library::getApplicableFiles(OpSys system, QStringList& jar, QStringList& native, QStringList& native32, QStringList& native64) const |  | ||||||
|  | void Library::getApplicableFiles(OpSys system, QStringList& jar, QStringList& native, QStringList& native32, | ||||||
|  | 								 QStringList& native64, const QString &overridePath) const | ||||||
| { | { | ||||||
|  | 	bool isLocal = (hint() == "local"); | ||||||
| 	auto actualPath = [&](QString relPath) | 	auto actualPath = [&](QString relPath) | ||||||
| 	{ | 	{ | ||||||
| 		QFileInfo out(FS::PathCombine(storagePrefix(), relPath)); | 		QFileInfo out(FS::PathCombine(storagePrefix(), relPath)); | ||||||
|  | 		if(isLocal && !overridePath.isEmpty()) | ||||||
|  | 		{ | ||||||
|  | 			QString fileName = out.fileName(); | ||||||
|  | 			auto fullPath = FS::PathCombine(overridePath, fileName); | ||||||
|  | 			qDebug() << fullPath; | ||||||
|  | 			QFileInfo fileinfo(fullPath); | ||||||
|  | 			if(fileinfo.exists()) | ||||||
|  | 			{ | ||||||
|  | 				return fileinfo.absoluteFilePath(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		return out.absoluteFilePath(); | 		return out.absoluteFilePath(); | ||||||
| 	}; | 	}; | ||||||
| 	if(m_mojangDownloads) | 	if(m_mojangDownloads) | ||||||
| @@ -69,7 +85,8 @@ void Library::getApplicableFiles(OpSys system, QStringList& jar, QStringList& na | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| QList<NetActionPtr> Library::getDownloads(OpSys system, HttpMetaCache * cache, QStringList &failedFiles) const | QList< std::shared_ptr< NetAction > > Library::getDownloads(OpSys system, class HttpMetaCache* cache, | ||||||
|  | 															QStringList& failedFiles, const QString & overridePath) const | ||||||
| { | { | ||||||
| 	QList<NetActionPtr> out; | 	QList<NetActionPtr> out; | ||||||
| 	bool isAlwaysStale = (hint() == "always-stale"); | 	bool isAlwaysStale = (hint() == "always-stale"); | ||||||
| @@ -87,6 +104,25 @@ QList<NetActionPtr> Library::getDownloads(OpSys system, HttpMetaCache * cache, Q | |||||||
| 			return true; | 			return true; | ||||||
| 		if(isLocal) | 		if(isLocal) | ||||||
| 		{ | 		{ | ||||||
|  | 			if(!overridePath.isEmpty()) | ||||||
|  | 			{ | ||||||
|  | 				QString fileName; | ||||||
|  | 				int position = storage.lastIndexOf('/'); | ||||||
|  | 				if(position == -1) | ||||||
|  | 				{ | ||||||
|  | 					fileName = storage; | ||||||
|  | 				} | ||||||
|  | 				else | ||||||
|  | 				{ | ||||||
|  | 					fileName = storage.mid(position); | ||||||
|  | 				} | ||||||
|  | 				auto fullPath = FS::PathCombine(overridePath, fileName); | ||||||
|  | 				QFileInfo fileinfo(fullPath); | ||||||
|  | 				if(fileinfo.exists()) | ||||||
|  | 				{ | ||||||
|  | 					return true; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 			QFileInfo fileinfo(entry->getFullPath()); | 			QFileInfo fileinfo(entry->getFullPath()); | ||||||
| 			if(!fileinfo.exists()) | 			if(!fileinfo.exists()) | ||||||
| 			{ | 			{ | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ | |||||||
| #include "multimc_logic_export.h" | #include "multimc_logic_export.h" | ||||||
|  |  | ||||||
| class Library; | class Library; | ||||||
|  | class MinecraftInstance; | ||||||
|  |  | ||||||
| typedef std::shared_ptr<Library> LibraryPtr; | typedef std::shared_ptr<Library> LibraryPtr; | ||||||
|  |  | ||||||
| @@ -99,7 +100,8 @@ public: /* methods */ | |||||||
| 		m_repositoryURL = base_url; | 		m_repositoryURL = base_url; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void getApplicableFiles(OpSys system, QStringList & jar, QStringList & native, QStringList & native32, QStringList & native64) const; | 	void getApplicableFiles(OpSys system, QStringList & jar, QStringList & native, | ||||||
|  | 							QStringList & native32, QStringList & native64, const QString & overridePath) const; | ||||||
|  |  | ||||||
| 	void setAbsoluteUrl(const QString &absolute_url) | 	void setAbsoluteUrl(const QString &absolute_url) | ||||||
| 	{ | 	{ | ||||||
| @@ -126,7 +128,8 @@ public: /* methods */ | |||||||
| 	bool isActive() const; | 	bool isActive() const; | ||||||
|  |  | ||||||
| 	// Get a list of downloads for this library | 	// Get a list of downloads for this library | ||||||
| 	QList<NetActionPtr> getDownloads(OpSys system, class HttpMetaCache * cache, QStringList &failedFiles) const; | 	QList<NetActionPtr> getDownloads(OpSys system, class HttpMetaCache * cache, | ||||||
|  | 									 QStringList & failedFiles, const QString & overridePath) const; | ||||||
|  |  | ||||||
| private: /* methods */ | private: /* methods */ | ||||||
| 	/// the default storage prefix used by MultiMC | 	/// the default storage prefix used by MultiMC | ||||||
|   | |||||||
| @@ -31,6 +31,7 @@ slots: | |||||||
| 	{ | 	{ | ||||||
| 		cache.reset(new HttpMetaCache()); | 		cache.reset(new HttpMetaCache()); | ||||||
| 		cache->addBase("libraries", QDir("libraries").absolutePath()); | 		cache->addBase("libraries", QDir("libraries").absolutePath()); | ||||||
|  | 		dataDir = QDir("data").absolutePath(); | ||||||
| 	} | 	} | ||||||
| 	void test_legacy() | 	void test_legacy() | ||||||
| 	{ | 	{ | ||||||
| @@ -39,7 +40,7 @@ slots: | |||||||
| 		QCOMPARE(test.isNative(), false); | 		QCOMPARE(test.isNative(), false); | ||||||
|  |  | ||||||
| 		QStringList jar, native, native32, native64; | 		QStringList jar, native, native32, native64; | ||||||
| 		test.getApplicableFiles(currentSystem, jar, native, native32, native64); | 		test.getApplicableFiles(currentSystem, jar, native, native32, native64, QString()); | ||||||
| 		QCOMPARE(jar, getStorage("test/package/testname/testversion/testname-testversion.jar")); | 		QCOMPARE(jar, getStorage("test/package/testname/testversion/testname-testversion.jar")); | ||||||
| 		QCOMPARE(native, {}); | 		QCOMPARE(native, {}); | ||||||
| 		QCOMPARE(native32, {}); | 		QCOMPARE(native32, {}); | ||||||
| @@ -50,7 +51,7 @@ slots: | |||||||
| 		QStringList failedFiles; | 		QStringList failedFiles; | ||||||
| 		Library test("test.package:testname:testversion"); | 		Library test("test.package:testname:testversion"); | ||||||
| 		test.setRepositoryURL("file://foo/bar"); | 		test.setRepositoryURL("file://foo/bar"); | ||||||
| 		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles); | 		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles, QString()); | ||||||
| 		QCOMPARE(downloads.size(), 1); | 		QCOMPARE(downloads.size(), 1); | ||||||
| 		QCOMPARE(failedFiles, {}); | 		QCOMPARE(failedFiles, {}); | ||||||
| 		NetActionPtr dl = downloads[0]; | 		NetActionPtr dl = downloads[0]; | ||||||
| @@ -62,10 +63,27 @@ slots: | |||||||
| 		QCOMPARE(test.isNative(), false); | 		QCOMPARE(test.isNative(), false); | ||||||
| 		QStringList failedFiles; | 		QStringList failedFiles; | ||||||
| 		test.setHint("local"); | 		test.setHint("local"); | ||||||
| 		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles); | 		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles, QString()); | ||||||
| 		QCOMPARE(downloads.size(), 0); | 		QCOMPARE(downloads.size(), 0); | ||||||
| 		QCOMPARE(failedFiles, getStorage("test/package/testname/testversion/testname-testversion.jar")); | 		QCOMPARE(failedFiles, getStorage("test/package/testname/testversion/testname-testversion.jar")); | ||||||
| 	} | 	} | ||||||
|  | 	void test_legacy_url_local_override() | ||||||
|  | 	{ | ||||||
|  | 		Library test("com.paulscode:codecwav:20101023"); | ||||||
|  | 		QCOMPARE(test.isNative(), false); | ||||||
|  | 		QStringList failedFiles; | ||||||
|  | 		test.setHint("local"); | ||||||
|  | 		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles, QString("data")); | ||||||
|  | 		QCOMPARE(downloads.size(), 0); | ||||||
|  | 		QCOMPARE(failedFiles.size(), 0); | ||||||
|  |  | ||||||
|  | 		QStringList jar, native, native32, native64; | ||||||
|  | 		test.getApplicableFiles(currentSystem, jar, native, native32, native64, QString("data")); | ||||||
|  | 		QCOMPARE(jar, {QFileInfo("data/codecwav-20101023.jar").absoluteFilePath()}); | ||||||
|  | 		QCOMPARE(native, {}); | ||||||
|  | 		QCOMPARE(native32, {}); | ||||||
|  | 		QCOMPARE(native64, {}); | ||||||
|  | 	} | ||||||
| 	void test_legacy_native() | 	void test_legacy_native() | ||||||
| 	{ | 	{ | ||||||
| 		Library test("test.package:testname:testversion"); | 		Library test("test.package:testname:testversion"); | ||||||
| @@ -74,13 +92,13 @@ slots: | |||||||
| 		test.setRepositoryURL("file://foo/bar"); | 		test.setRepositoryURL("file://foo/bar"); | ||||||
| 		{ | 		{ | ||||||
| 			QStringList jar, native, native32, native64; | 			QStringList jar, native, native32, native64; | ||||||
| 			test.getApplicableFiles(Os_Linux, jar, native, native32, native64); | 			test.getApplicableFiles(Os_Linux, jar, native, native32, native64, QString()); | ||||||
| 			QCOMPARE(jar, {}); | 			QCOMPARE(jar, {}); | ||||||
| 			QCOMPARE(native, getStorage("test/package/testname/testversion/testname-testversion-linux.jar")); | 			QCOMPARE(native, getStorage("test/package/testname/testversion/testname-testversion-linux.jar")); | ||||||
| 			QCOMPARE(native32, {}); | 			QCOMPARE(native32, {}); | ||||||
| 			QCOMPARE(native64, {}); | 			QCOMPARE(native64, {}); | ||||||
| 			QStringList failedFiles; | 			QStringList failedFiles; | ||||||
| 			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles); | 			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles, QString()); | ||||||
| 			QCOMPARE(dls.size(), 1); | 			QCOMPARE(dls.size(), 1); | ||||||
| 			QCOMPARE(failedFiles, {}); | 			QCOMPARE(failedFiles, {}); | ||||||
| 			auto dl = dls[0]; | 			auto dl = dls[0]; | ||||||
| @@ -97,13 +115,13 @@ slots: | |||||||
| 		test.setRepositoryURL("file://foo/bar"); | 		test.setRepositoryURL("file://foo/bar"); | ||||||
| 		{ | 		{ | ||||||
| 			QStringList jar, native, native32, native64; | 			QStringList jar, native, native32, native64; | ||||||
| 			test.getApplicableFiles(Os_Linux, jar, native, native32, native64); | 			test.getApplicableFiles(Os_Linux, jar, native, native32, native64, QString()); | ||||||
| 			QCOMPARE(jar, {}); | 			QCOMPARE(jar, {}); | ||||||
| 			QCOMPARE(native, {}); | 			QCOMPARE(native, {}); | ||||||
| 			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-linux-32.jar")); | 			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-linux-32.jar")); | ||||||
| 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-linux-64.jar")); | 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-linux-64.jar")); | ||||||
| 			QStringList failedFiles; | 			QStringList failedFiles; | ||||||
| 			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles); | 			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles, QString()); | ||||||
| 			QCOMPARE(dls.size(), 2); | 			QCOMPARE(dls.size(), 2); | ||||||
| 			QCOMPARE(failedFiles, {}); | 			QCOMPARE(failedFiles, {}); | ||||||
| 			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-linux-32.jar")); | 			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-linux-32.jar")); | ||||||
| @@ -111,13 +129,13 @@ slots: | |||||||
| 		} | 		} | ||||||
| 		{ | 		{ | ||||||
| 			QStringList jar, native, native32, native64; | 			QStringList jar, native, native32, native64; | ||||||
| 			test.getApplicableFiles(Os_Windows, jar, native, native32, native64); | 			test.getApplicableFiles(Os_Windows, jar, native, native32, native64, QString()); | ||||||
| 			QCOMPARE(jar, {}); | 			QCOMPARE(jar, {}); | ||||||
| 			QCOMPARE(native, {}); | 			QCOMPARE(native, {}); | ||||||
| 			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-windows-32.jar")); | 			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-windows-32.jar")); | ||||||
| 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-windows-64.jar")); | 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-windows-64.jar")); | ||||||
| 			QStringList failedFiles; | 			QStringList failedFiles; | ||||||
| 			auto dls = test.getDownloads(Os_Windows, cache.get(), failedFiles); | 			auto dls = test.getDownloads(Os_Windows, cache.get(), failedFiles, QString()); | ||||||
| 			QCOMPARE(dls.size(), 2); | 			QCOMPARE(dls.size(), 2); | ||||||
| 			QCOMPARE(failedFiles, {}); | 			QCOMPARE(failedFiles, {}); | ||||||
| 			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-windows-32.jar")); | 			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-windows-32.jar")); | ||||||
| @@ -125,45 +143,103 @@ slots: | |||||||
| 		} | 		} | ||||||
| 		{ | 		{ | ||||||
| 			QStringList jar, native, native32, native64; | 			QStringList jar, native, native32, native64; | ||||||
| 			test.getApplicableFiles(Os_OSX, jar, native, native32, native64); | 			test.getApplicableFiles(Os_OSX, jar, native, native32, native64, QString()); | ||||||
| 			QCOMPARE(jar, {}); | 			QCOMPARE(jar, {}); | ||||||
| 			QCOMPARE(native, {}); | 			QCOMPARE(native, {}); | ||||||
| 			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-osx-32.jar")); | 			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-osx-32.jar")); | ||||||
| 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-osx-64.jar")); | 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-osx-64.jar")); | ||||||
| 			QStringList failedFiles; | 			QStringList failedFiles; | ||||||
| 			auto dls = test.getDownloads(Os_OSX, cache.get(), failedFiles); | 			auto dls = test.getDownloads(Os_OSX, cache.get(), failedFiles, QString()); | ||||||
| 			QCOMPARE(dls.size(), 2); | 			QCOMPARE(dls.size(), 2); | ||||||
| 			QCOMPARE(failedFiles, {}); | 			QCOMPARE(failedFiles, {}); | ||||||
| 			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-osx-32.jar")); | 			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-osx-32.jar")); | ||||||
| 			QCOMPARE(dls[1]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-osx-64.jar")); | 			QCOMPARE(dls[1]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-osx-64.jar")); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	void test_legacy_native_arch_local_override() | ||||||
|  | 	{ | ||||||
|  | 		Library test("test.package:testname:testversion"); | ||||||
|  | 		test.m_nativeClassifiers[OpSys::Os_Linux]="linux-${arch}"; | ||||||
|  | 		test.setHint("local"); | ||||||
|  | 		QCOMPARE(test.isNative(), true); | ||||||
|  | 		test.setRepositoryURL("file://foo/bar"); | ||||||
|  | 		{ | ||||||
|  | 			QStringList jar, native, native32, native64; | ||||||
|  | 			test.getApplicableFiles(Os_Linux, jar, native, native32, native64, QString("data")); | ||||||
|  | 			QCOMPARE(jar, {}); | ||||||
|  | 			QCOMPARE(native, {}); | ||||||
|  | 			QCOMPARE(native32, {QFileInfo("data/testname-testversion-linux-32.jar").absoluteFilePath()}); | ||||||
|  | 			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-linux-64.jar")); | ||||||
|  | 			QStringList failedFiles; | ||||||
|  | 			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles, QString("data")); | ||||||
|  | 			QCOMPARE(dls.size(), 0); | ||||||
|  | 			QCOMPARE(failedFiles, {getStorage("test/package/testname/testversion/testname-testversion-linux-64.jar")}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	void test_onenine() | 	void test_onenine() | ||||||
| 	{ | 	{ | ||||||
| 		auto test = readMojangJson("data/lib-simple.json"); | 		auto test = readMojangJson("data/lib-simple.json"); | ||||||
| 		QStringList jar, native, native32, native64; | 		{ | ||||||
| 		test->getApplicableFiles(Os_OSX, jar, native, native32, native64); | 			QStringList jar, native, native32, native64; | ||||||
| 		QCOMPARE(jar, getStorage("com/paulscode/codecwav/20101023/codecwav-20101023.jar")); | 			test->getApplicableFiles(Os_OSX, jar, native, native32, native64, QString()); | ||||||
| 		QCOMPARE(native, {}); | 			QCOMPARE(jar, getStorage("com/paulscode/codecwav/20101023/codecwav-20101023.jar")); | ||||||
| 		QCOMPARE(native32, {}); | 			QCOMPARE(native, {}); | ||||||
| 		QCOMPARE(native64, {}); | 			QCOMPARE(native32, {}); | ||||||
| 		QStringList failedFiles; | 			QCOMPARE(native64, {}); | ||||||
| 		auto dls = test->getDownloads(Os_Linux, cache.get(), failedFiles); | 		} | ||||||
| 		QCOMPARE(dls.size(), 1); | 		{ | ||||||
| 		QCOMPARE(failedFiles, {}); | 			QStringList failedFiles; | ||||||
| 		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar")); | 			auto dls = test->getDownloads(Os_Linux, cache.get(), failedFiles, QString()); | ||||||
|  | 			QCOMPARE(dls.size(), 1); | ||||||
|  | 			QCOMPARE(failedFiles, {}); | ||||||
|  | 			QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar")); | ||||||
|  | 		} | ||||||
|  | 		test->setHint("local"); | ||||||
|  | 		{ | ||||||
|  | 			QStringList jar, native, native32, native64; | ||||||
|  | 			test->getApplicableFiles(Os_OSX, jar, native, native32, native64, QString("data")); | ||||||
|  | 			QCOMPARE(jar, {QFileInfo("data/codecwav-20101023.jar").absoluteFilePath()}); | ||||||
|  | 			QCOMPARE(native, {}); | ||||||
|  | 			QCOMPARE(native32, {}); | ||||||
|  | 			QCOMPARE(native64, {}); | ||||||
|  | 		} | ||||||
|  | 		{ | ||||||
|  | 			QStringList failedFiles; | ||||||
|  | 			auto dls = test->getDownloads(Os_Linux, cache.get(), failedFiles, QString("data")); | ||||||
|  | 			QCOMPARE(dls.size(), 0); | ||||||
|  | 			QCOMPARE(failedFiles, {}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	void test_onenine_local_override() | ||||||
|  | 	{ | ||||||
|  | 		auto test = readMojangJson("data/lib-simple.json"); | ||||||
|  | 		test->setHint("local"); | ||||||
|  | 		{ | ||||||
|  | 			QStringList jar, native, native32, native64; | ||||||
|  | 			test->getApplicableFiles(Os_OSX, jar, native, native32, native64, QString("data")); | ||||||
|  | 			QCOMPARE(jar, {QFileInfo("data/codecwav-20101023.jar").absoluteFilePath()}); | ||||||
|  | 			QCOMPARE(native, {}); | ||||||
|  | 			QCOMPARE(native32, {}); | ||||||
|  | 			QCOMPARE(native64, {}); | ||||||
|  | 		} | ||||||
|  | 		{ | ||||||
|  | 			QStringList failedFiles; | ||||||
|  | 			auto dls = test->getDownloads(Os_Linux, cache.get(), failedFiles, QString("data")); | ||||||
|  | 			QCOMPARE(dls.size(), 0); | ||||||
|  | 			QCOMPARE(failedFiles, {}); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	void test_onenine_native() | 	void test_onenine_native() | ||||||
| 	{ | 	{ | ||||||
| 		auto test = readMojangJson("data/lib-native.json"); | 		auto test = readMojangJson("data/lib-native.json"); | ||||||
| 		QStringList jar, native, native32, native64; | 		QStringList jar, native, native32, native64; | ||||||
| 		test->getApplicableFiles(Os_OSX, jar, native, native32, native64); | 		test->getApplicableFiles(Os_OSX, jar, native, native32, native64, QString()); | ||||||
| 		QCOMPARE(jar, getStorage("org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar")); | 		QCOMPARE(jar, getStorage("org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar")); | ||||||
| 		QCOMPARE(native, getStorage("org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar")); | 		QCOMPARE(native, getStorage("org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar")); | ||||||
| 		QCOMPARE(native32, {}); | 		QCOMPARE(native32, {}); | ||||||
| 		QCOMPARE(native64, {}); | 		QCOMPARE(native64, {}); | ||||||
| 		QStringList failedFiles; | 		QStringList failedFiles; | ||||||
| 		auto dls = test->getDownloads(Os_OSX, cache.get(), failedFiles); | 		auto dls = test->getDownloads(Os_OSX, cache.get(), failedFiles, QString()); | ||||||
| 		QCOMPARE(dls.size(), 2); | 		QCOMPARE(dls.size(), 2); | ||||||
| 		QCOMPARE(failedFiles, {}); | 		QCOMPARE(failedFiles, {}); | ||||||
| 		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar")); | 		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar")); | ||||||
| @@ -173,13 +249,13 @@ slots: | |||||||
| 	{ | 	{ | ||||||
| 		auto test = readMojangJson("data/lib-native-arch.json"); | 		auto test = readMojangJson("data/lib-native-arch.json"); | ||||||
| 		QStringList jar, native, native32, native64; | 		QStringList jar, native, native32, native64; | ||||||
| 		test->getApplicableFiles(Os_Windows, jar, native, native32, native64); | 		test->getApplicableFiles(Os_Windows, jar, native, native32, native64, QString()); | ||||||
| 		QCOMPARE(jar, {}); | 		QCOMPARE(jar, {}); | ||||||
| 		QCOMPARE(native, {}); | 		QCOMPARE(native, {}); | ||||||
| 		QCOMPARE(native32, getStorage("tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar")); | 		QCOMPARE(native32, getStorage("tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar")); | ||||||
| 		QCOMPARE(native64, getStorage("tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar")); | 		QCOMPARE(native64, getStorage("tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar")); | ||||||
| 		QStringList failedFiles; | 		QStringList failedFiles; | ||||||
| 		auto dls = test->getDownloads(Os_Windows, cache.get(), failedFiles); | 		auto dls = test->getDownloads(Os_Windows, cache.get(), failedFiles, QString()); | ||||||
| 		QCOMPARE(dls.size(), 2); | 		QCOMPARE(dls.size(), 2); | ||||||
| 		QCOMPARE(failedFiles, {}); | 		QCOMPARE(failedFiles, {}); | ||||||
| 		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar")); | 		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar")); | ||||||
| @@ -187,7 +263,7 @@ slots: | |||||||
| 	} | 	} | ||||||
| private: | private: | ||||||
| 	std::unique_ptr<HttpMetaCache> cache; | 	std::unique_ptr<HttpMetaCache> cache; | ||||||
| 	QString workDir; | 	QString dataDir; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| QTEST_GUILESS_MAIN(LibraryTest) | QTEST_GUILESS_MAIN(LibraryTest) | ||||||
|   | |||||||
| @@ -69,6 +69,8 @@ public: | |||||||
|  |  | ||||||
| 	virtual QString getNativePath() const = 0; | 	virtual QString getNativePath() const = 0; | ||||||
|  |  | ||||||
|  | 	virtual QString getLocalLibraryPath() const = 0; | ||||||
|  |  | ||||||
| 	virtual QStringList processMinecraftArgs(AuthSessionPtr account) const = 0; | 	virtual QStringList processMinecraftArgs(AuthSessionPtr account) const = 0; | ||||||
|  |  | ||||||
| 	virtual JavaVersion getJavaVersion() const; | 	virtual JavaVersion getJavaVersion() const; | ||||||
|   | |||||||
| @@ -581,14 +581,14 @@ const QList<LibraryPtr> & MinecraftProfile::getLibraries() const | |||||||
| 	return m_libraries; | 	return m_libraries; | ||||||
| } | } | ||||||
|  |  | ||||||
| void MinecraftProfile::getLibraryFiles(const QString& architecture, QStringList& jars, QStringList& nativeJars) const | void MinecraftProfile::getLibraryFiles(const QString& architecture, QStringList& jars, QStringList& nativeJars, const QString& overridePath) const | ||||||
| { | { | ||||||
| 	QStringList native32, native64; | 	QStringList native32, native64; | ||||||
| 	jars.clear(); | 	jars.clear(); | ||||||
| 	nativeJars.clear(); | 	nativeJars.clear(); | ||||||
| 	for (auto lib : getLibraries()) | 	for (auto lib : getLibraries()) | ||||||
| 	{ | 	{ | ||||||
| 		lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64); | 		lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath); | ||||||
| 	} | 	} | ||||||
| 	if(architecture == "32") | 	if(architecture == "32") | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
| @@ -111,7 +111,7 @@ public: /* getters for profile variables */ | |||||||
| 	const QStringList & getTweakers() const; | 	const QStringList & getTweakers() const; | ||||||
| 	const QList<JarmodPtr> & getJarMods() const; | 	const QList<JarmodPtr> & getJarMods() const; | ||||||
| 	const QList<LibraryPtr> & getLibraries() const; | 	const QList<LibraryPtr> & getLibraries() const; | ||||||
| 	void getLibraryFiles(const QString & architecture, QStringList & jars, QStringList & nativeJars) const; | 	void getLibraryFiles(const QString & architecture, QStringList & jars, QStringList & nativeJars, const QString & overridePath) const; | ||||||
| 	QString getMainJarUrl() const; | 	QString getMainJarUrl() const; | ||||||
| 	bool hasTrait(const QString & trait) const; | 	bool hasTrait(const QString & trait) const; | ||||||
| 	ProblemSeverity getProblemSeverity() const; | 	ProblemSeverity getProblemSeverity() const; | ||||||
|   | |||||||
| @@ -132,6 +132,11 @@ public: | |||||||
| 	QStringList getNativeJars() const override; | 	QStringList getNativeJars() const override; | ||||||
| 	QString getNativePath() const override; | 	QString getNativePath() const override; | ||||||
|  |  | ||||||
|  | 	QString getLocalLibraryPath() const override | ||||||
|  | 	{ | ||||||
|  | 		return QString(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	QStringList processMinecraftArgs(AuthSessionPtr account) const override; | 	QStringList processMinecraftArgs(AuthSessionPtr account) const override; | ||||||
| 	QStringList verboseDescription(AuthSessionPtr session) override; | 	QStringList verboseDescription(AuthSessionPtr session) override; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -145,6 +145,12 @@ QString OneSixInstance::getNativePath() const | |||||||
| 	return natives_dir.absolutePath(); | 	return natives_dir.absolutePath(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | QString OneSixInstance::getLocalLibraryPath() const | ||||||
|  | { | ||||||
|  | 	QDir libraries_dir(FS::PathCombine(instanceRoot(), "libraries/")); | ||||||
|  | 	return libraries_dir.absolutePath(); | ||||||
|  | } | ||||||
|  |  | ||||||
| QString OneSixInstance::mainJarPath() const | QString OneSixInstance::mainJarPath() const | ||||||
| { | { | ||||||
| 	auto jarMods = getJarMods(); | 	auto jarMods = getJarMods(); | ||||||
| @@ -207,7 +213,7 @@ QString OneSixInstance::createLaunchScript(AuthSessionPtr session) | |||||||
| 	{ | 	{ | ||||||
| 		QStringList jars, nativeJars; | 		QStringList jars, nativeJars; | ||||||
| 		auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | 		auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | ||||||
| 		m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); | 		m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); | ||||||
| 		for(auto file: jars) | 		for(auto file: jars) | ||||||
| 		{ | 		{ | ||||||
| 			launchScript += "cp " + file + "\n"; | 			launchScript += "cp " + file + "\n"; | ||||||
| @@ -251,7 +257,7 @@ QStringList OneSixInstance::verboseDescription(AuthSessionPtr session) | |||||||
| 		out << "Libraries:"; | 		out << "Libraries:"; | ||||||
| 		QStringList jars, nativeJars; | 		QStringList jars, nativeJars; | ||||||
| 		auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | 		auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | ||||||
| 		m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); | 		m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); | ||||||
| 		auto printLibFile = [&](const QString & path) | 		auto printLibFile = [&](const QString & path) | ||||||
| 		{ | 		{ | ||||||
| 			QFileInfo info(path); | 			QFileInfo info(path); | ||||||
| @@ -654,7 +660,7 @@ QStringList OneSixInstance::getClassPath() const | |||||||
| { | { | ||||||
| 	QStringList jars, nativeJars; | 	QStringList jars, nativeJars; | ||||||
| 	auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | 	auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | ||||||
| 	m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); | 	m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); | ||||||
| 	jars.append(mainJarPath()); | 	jars.append(mainJarPath()); | ||||||
| 	return jars; | 	return jars; | ||||||
| } | } | ||||||
| @@ -668,6 +674,6 @@ QStringList OneSixInstance::getNativeJars() const | |||||||
| { | { | ||||||
| 	QStringList jars, nativeJars; | 	QStringList jars, nativeJars; | ||||||
| 	auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | 	auto javaArchitecture = settings()->get("JavaArchitecture").toString(); | ||||||
| 	m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); | 	m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath()); | ||||||
| 	return nativeJars; | 	return nativeJars; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -104,6 +104,8 @@ public: | |||||||
| 	QStringList getNativeJars() const override; | 	QStringList getNativeJars() const override; | ||||||
| 	QString getNativePath() const override; | 	QString getNativePath() const override; | ||||||
|  |  | ||||||
|  | 	QString getLocalLibraryPath() const override; | ||||||
|  |  | ||||||
| 	QStringList processMinecraftArgs(AuthSessionPtr account) const override; | 	QStringList processMinecraftArgs(AuthSessionPtr account) const override; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ void LibrariesTask::executeTask() | |||||||
| 	QStringList failedFiles; | 	QStringList failedFiles; | ||||||
| 	for (auto lib : libs) | 	for (auto lib : libs) | ||||||
| 	{ | 	{ | ||||||
| 		auto dls = lib->getDownloads(currentSystem, metacache.get(), failedFiles); | 		auto dls = lib->getDownloads(currentSystem, metacache.get(), failedFiles, inst->getLocalLibraryPath()); | ||||||
| 		for(auto dl : dls) | 		for(auto dl : dls) | ||||||
| 		{ | 		{ | ||||||
| 			downloadJob->addNetAction(dl); | 			downloadJob->addNetAction(dl); | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								api/logic/minecraft/testdata/codecwav-20101023.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/minecraft/testdata/codecwav-20101023.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | dummy test file. | ||||||
							
								
								
									
										1
									
								
								api/logic/minecraft/testdata/testname-testversion-linux-32.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/minecraft/testdata/testname-testversion-linux-32.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | dummy test file. | ||||||
		Reference in New Issue
	
	Block a user