Merge https://github.com/Drayshak/MultiMC5 into develop
This commit is contained in:
		@@ -414,6 +414,8 @@ logic/JavaCheckerJob.h
 | 
			
		||||
logic/JavaCheckerJob.cpp
 | 
			
		||||
 | 
			
		||||
# Assets
 | 
			
		||||
logic/assets/AssetsMigrateTask.h
 | 
			
		||||
logic/assets/AssetsMigrateTask.cpp
 | 
			
		||||
logic/assets/AssetsUtils.h
 | 
			
		||||
logic/assets/AssetsUtils.cpp
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -88,6 +88,7 @@
 | 
			
		||||
#include "logic/LegacyInstance.h"
 | 
			
		||||
 | 
			
		||||
#include "logic/assets/AssetsUtils.h"
 | 
			
		||||
#include "logic/assets/AssetsMigrateTask.h"
 | 
			
		||||
#include <logic/updater/UpdateChecker.h>
 | 
			
		||||
 | 
			
		||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 | 
			
		||||
@@ -286,8 +287,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
 | 
			
		||||
 | 
			
		||||
	// removing this looks stupid
 | 
			
		||||
	view->setFocus();
 | 
			
		||||
 | 
			
		||||
	AssetsUtils::migrateOldAssets();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MainWindow::~MainWindow()
 | 
			
		||||
@@ -1163,6 +1162,29 @@ void MainWindow::instanceEnded()
 | 
			
		||||
	this->show();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::checkMigrateLegacyAssets()
 | 
			
		||||
{
 | 
			
		||||
	int legacyAssets = AssetsUtils::findLegacyAssets();
 | 
			
		||||
	if(legacyAssets > 0)
 | 
			
		||||
	{
 | 
			
		||||
		ProgressDialog migrateDlg(this);
 | 
			
		||||
		AssetsMigrateTask migrateTask(legacyAssets, &migrateDlg);
 | 
			
		||||
 | 
			
		||||
		if (migrateDlg.exec(&migrateTask))
 | 
			
		||||
		{
 | 
			
		||||
			QLOG_INFO() << "Assets migration task completed successfully";
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			QLOG_INFO() << "Assets migration task reported failure";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		QLOG_INFO() << "Didn't find any legacy assets to migrate";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::checkSetDefaultJava()
 | 
			
		||||
{
 | 
			
		||||
	bool askForJava = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,7 @@ public:
 | 
			
		||||
	void openWebPage(QUrl url);
 | 
			
		||||
 | 
			
		||||
	void checkSetDefaultJava();
 | 
			
		||||
	void checkMigrateLegacyAssets();
 | 
			
		||||
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										141
									
								
								logic/assets/AssetsMigrateTask.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								logic/assets/AssetsMigrateTask.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,141 @@
 | 
			
		||||
#include "AssetsMigrateTask.h"
 | 
			
		||||
#include "MultiMC.h"
 | 
			
		||||
#include "logger/QsLog.h"
 | 
			
		||||
#include <QJsonObject>
 | 
			
		||||
#include <QJsonDocument>
 | 
			
		||||
#include <QDirIterator>
 | 
			
		||||
#include "gui/dialogs/CustomMessageBox.h"
 | 
			
		||||
#include <QDesktopServices>
 | 
			
		||||
 | 
			
		||||
AssetsMigrateTask::AssetsMigrateTask(int expected, QObject *parent)
 | 
			
		||||
	: Task(parent)
 | 
			
		||||
{
 | 
			
		||||
	this->m_expected = expected;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AssetsMigrateTask::executeTask()
 | 
			
		||||
{
 | 
			
		||||
	this->setStatus(tr("Migrating legacy assets..."));
 | 
			
		||||
	this->setProgress(0);
 | 
			
		||||
 | 
			
		||||
	QDir assets_dir("assets");
 | 
			
		||||
	if (!assets_dir.exists())
 | 
			
		||||
	{
 | 
			
		||||
		emitFailed("Assets directory didn't exist");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	assets_dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
 | 
			
		||||
	int base_length = assets_dir.path().length();
 | 
			
		||||
 | 
			
		||||
	QList<QString> blacklist = {"indexes", "objects", "virtual"};
 | 
			
		||||
 | 
			
		||||
	if (!assets_dir.exists("objects"))
 | 
			
		||||
		assets_dir.mkdir("objects");
 | 
			
		||||
	QDir objects_dir("assets/objects");
 | 
			
		||||
 | 
			
		||||
	QDirIterator iterator(assets_dir, QDirIterator::Subdirectories);
 | 
			
		||||
	int successes = 0;
 | 
			
		||||
	int failures = 0;
 | 
			
		||||
	while (iterator.hasNext())
 | 
			
		||||
	{
 | 
			
		||||
		QString currentDir = iterator.next();
 | 
			
		||||
		currentDir = currentDir.remove(0, base_length + 1);
 | 
			
		||||
 | 
			
		||||
		bool ignore = false;
 | 
			
		||||
		for (QString blacklisted : blacklist)
 | 
			
		||||
		{
 | 
			
		||||
			if (currentDir.startsWith(blacklisted))
 | 
			
		||||
				ignore = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!iterator.fileInfo().isDir() && !ignore)
 | 
			
		||||
		{
 | 
			
		||||
			QString filename = iterator.filePath();
 | 
			
		||||
 | 
			
		||||
			QFile input(filename);
 | 
			
		||||
			input.open(QIODevice::ReadOnly | QIODevice::WriteOnly);
 | 
			
		||||
			QString sha1sum =
 | 
			
		||||
				QCryptographicHash::hash(input.readAll(), QCryptographicHash::Sha1)
 | 
			
		||||
					.toHex()
 | 
			
		||||
					.constData();
 | 
			
		||||
 | 
			
		||||
			QString object_name = filename.remove(0, base_length + 1);
 | 
			
		||||
			QLOG_DEBUG() << "Processing" << object_name << ":" << sha1sum << input.size();
 | 
			
		||||
 | 
			
		||||
			QString object_tlk = sha1sum.left(2);
 | 
			
		||||
			QString object_tlk_dir = objects_dir.path() + "/" + object_tlk;
 | 
			
		||||
 | 
			
		||||
			QDir tlk_dir(object_tlk_dir);
 | 
			
		||||
			if (!tlk_dir.exists())
 | 
			
		||||
				objects_dir.mkdir(object_tlk);
 | 
			
		||||
 | 
			
		||||
			QString new_filename = tlk_dir.path() + "/" + sha1sum;
 | 
			
		||||
			QFile new_object(new_filename);
 | 
			
		||||
			if (!new_object.exists())
 | 
			
		||||
			{
 | 
			
		||||
				bool rename_success = input.rename(new_filename);
 | 
			
		||||
				QLOG_DEBUG() << " Doesn't exist, copying to" << new_filename << ":"
 | 
			
		||||
							 << QString::number(rename_success);
 | 
			
		||||
				if (rename_success)
 | 
			
		||||
					successes++;
 | 
			
		||||
				else
 | 
			
		||||
					failures++;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				input.remove();
 | 
			
		||||
				QLOG_DEBUG() << " Already exists, deleting original and not copying.";
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			this->setProgress(100 * ((successes + failures) / (float) this->m_expected));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (successes + failures == 0)
 | 
			
		||||
	{
 | 
			
		||||
		this->setProgress(100);
 | 
			
		||||
		QLOG_DEBUG() << "No legacy assets needed importing.";
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		QLOG_DEBUG() << "Finished copying legacy assets:" << successes << "successes and"
 | 
			
		||||
					 << failures << "failures.";
 | 
			
		||||
 | 
			
		||||
		this->setStatus("Cleaning up legacy assets...");
 | 
			
		||||
		this->setProgress(100);
 | 
			
		||||
 | 
			
		||||
		QDirIterator cleanup_iterator(assets_dir);
 | 
			
		||||
 | 
			
		||||
		while (cleanup_iterator.hasNext())
 | 
			
		||||
		{
 | 
			
		||||
			QString currentDir = cleanup_iterator.next();
 | 
			
		||||
			currentDir = currentDir.remove(0, base_length + 1);
 | 
			
		||||
 | 
			
		||||
			bool ignore = false;
 | 
			
		||||
			for (QString blacklisted : blacklist)
 | 
			
		||||
			{
 | 
			
		||||
				if (currentDir.startsWith(blacklisted))
 | 
			
		||||
					ignore = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (cleanup_iterator.fileInfo().isDir() && !ignore)
 | 
			
		||||
			{
 | 
			
		||||
				QString path = cleanup_iterator.filePath();
 | 
			
		||||
				QDir folder(path);
 | 
			
		||||
 | 
			
		||||
				QLOG_DEBUG() << "Cleaning up legacy assets folder:" << path;
 | 
			
		||||
 | 
			
		||||
				folder.removeRecursively();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(failures > 0)
 | 
			
		||||
	{
 | 
			
		||||
		emitFailed(QString("Failed to migrate %1 legacy assets").arg(failures));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		emitSucceeded();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								logic/assets/AssetsMigrateTask.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								logic/assets/AssetsMigrateTask.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "logic/tasks/Task.h"
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
#include <QNetworkReply>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
class AssetsMigrateTask : public Task
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	explicit AssetsMigrateTask(int expected, QObject* parent=0);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	virtual void executeTask();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	int m_expected;
 | 
			
		||||
};
 | 
			
		||||
@@ -25,23 +25,18 @@
 | 
			
		||||
 | 
			
		||||
namespace AssetsUtils
 | 
			
		||||
{
 | 
			
		||||
void migrateOldAssets()
 | 
			
		||||
int findLegacyAssets()
 | 
			
		||||
{
 | 
			
		||||
	QDir assets_dir("assets");
 | 
			
		||||
	if (!assets_dir.exists())
 | 
			
		||||
		return;
 | 
			
		||||
		return 0;
 | 
			
		||||
	assets_dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
 | 
			
		||||
	int base_length = assets_dir.path().length();
 | 
			
		||||
 | 
			
		||||
	QList<QString> blacklist = {"indexes", "objects", "virtual"};
 | 
			
		||||
 | 
			
		||||
	if (!assets_dir.exists("objects"))
 | 
			
		||||
		assets_dir.mkdir("objects");
 | 
			
		||||
	QDir objects_dir("assets/objects");
 | 
			
		||||
 | 
			
		||||
	QDirIterator iterator(assets_dir, QDirIterator::Subdirectories);
 | 
			
		||||
	int successes = 0;
 | 
			
		||||
	int failures = 0;
 | 
			
		||||
	int found = 0;
 | 
			
		||||
	while (iterator.hasNext())
 | 
			
		||||
	{
 | 
			
		||||
		QString currentDir = iterator.next();
 | 
			
		||||
@@ -56,79 +51,11 @@ void migrateOldAssets()
 | 
			
		||||
 | 
			
		||||
		if (!iterator.fileInfo().isDir() && !ignore)
 | 
			
		||||
		{
 | 
			
		||||
			QString filename = iterator.filePath();
 | 
			
		||||
 | 
			
		||||
			QFile input(filename);
 | 
			
		||||
			input.open(QIODevice::ReadOnly | QIODevice::WriteOnly);
 | 
			
		||||
			QString sha1sum =
 | 
			
		||||
				QCryptographicHash::hash(input.readAll(), QCryptographicHash::Sha1)
 | 
			
		||||
					.toHex()
 | 
			
		||||
					.constData();
 | 
			
		||||
 | 
			
		||||
			QString object_name = filename.remove(0, base_length + 1);
 | 
			
		||||
			QLOG_DEBUG() << "Processing" << object_name << ":" << sha1sum << input.size();
 | 
			
		||||
 | 
			
		||||
			QString object_tlk = sha1sum.left(2);
 | 
			
		||||
			QString object_tlk_dir = objects_dir.path() + "/" + object_tlk;
 | 
			
		||||
 | 
			
		||||
			QDir tlk_dir(object_tlk_dir);
 | 
			
		||||
			if (!tlk_dir.exists())
 | 
			
		||||
				objects_dir.mkdir(object_tlk);
 | 
			
		||||
 | 
			
		||||
			QString new_filename = tlk_dir.path() + "/" + sha1sum;
 | 
			
		||||
			QFile new_object(new_filename);
 | 
			
		||||
			if (!new_object.exists())
 | 
			
		||||
			{
 | 
			
		||||
				bool rename_success = input.rename(new_filename);
 | 
			
		||||
				QLOG_DEBUG() << " Doesn't exist, copying to" << new_filename << ":"
 | 
			
		||||
							 << QString::number(rename_success);
 | 
			
		||||
				if (rename_success)
 | 
			
		||||
					successes++;
 | 
			
		||||
				else
 | 
			
		||||
					failures++;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				input.remove();
 | 
			
		||||
				QLOG_DEBUG() << " Already exists, deleting original and not copying.";
 | 
			
		||||
			}
 | 
			
		||||
			found++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (successes + failures == 0)
 | 
			
		||||
	{
 | 
			
		||||
		QLOG_DEBUG() << "No legacy assets needed importing.";
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		QLOG_DEBUG() << "Finished copying legacy assets:" << successes << "successes and"
 | 
			
		||||
					 << failures << "failures.";
 | 
			
		||||
 | 
			
		||||
		QDirIterator cleanup_iterator(assets_dir);
 | 
			
		||||
 | 
			
		||||
		while (cleanup_iterator.hasNext())
 | 
			
		||||
		{
 | 
			
		||||
			QString currentDir = cleanup_iterator.next();
 | 
			
		||||
			currentDir = currentDir.remove(0, base_length + 1);
 | 
			
		||||
 | 
			
		||||
			bool ignore = false;
 | 
			
		||||
			for (QString blacklisted : blacklist)
 | 
			
		||||
			{
 | 
			
		||||
				if (currentDir.startsWith(blacklisted))
 | 
			
		||||
					ignore = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (cleanup_iterator.fileInfo().isDir() && !ignore)
 | 
			
		||||
			{
 | 
			
		||||
				QString path = cleanup_iterator.filePath();
 | 
			
		||||
				QDir folder(path);
 | 
			
		||||
 | 
			
		||||
				QLOG_DEBUG() << "Cleaning up legacy assets folder:" << path;
 | 
			
		||||
 | 
			
		||||
				folder.removeRecursively();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,6 @@ struct AssetsIndex
 | 
			
		||||
 | 
			
		||||
namespace AssetsUtils
 | 
			
		||||
{
 | 
			
		||||
void migrateOldAssets();
 | 
			
		||||
bool loadAssetsIndexJson(QString file, AssetsIndex* index);
 | 
			
		||||
int findLegacyAssets();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								main.cpp
									
									
									
									
									
								
							@@ -8,6 +8,7 @@ int main_gui(MultiMC &app)
 | 
			
		||||
	mainWin.restoreState(QByteArray::fromBase64(MMC->settings()->get("MainWindowState").toByteArray()));
 | 
			
		||||
	mainWin.restoreGeometry(QByteArray::fromBase64(MMC->settings()->get("MainWindowGeometry").toByteArray()));
 | 
			
		||||
	mainWin.show();
 | 
			
		||||
	mainWin.checkMigrateLegacyAssets();
 | 
			
		||||
	mainWin.checkSetDefaultJava();
 | 
			
		||||
	auto exitCode = app.exec();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user