GH-1262 fix relative paths for java binaries
This commit is contained in:
		| @@ -1677,17 +1677,8 @@ void MainWindow::checkSetDefaultJava() | ||||
| 			break; | ||||
| 		} | ||||
| 		QString currentJavaPath = MMC->settings()->get("JavaPath").toString(); | ||||
| 		if (currentJavaPath.isEmpty()) | ||||
| 		{ | ||||
| 			askForJava = true; | ||||
| 			break; | ||||
| 		} | ||||
| 		if(!currentJavaPath.contains('/')) | ||||
| 		{ | ||||
| 			currentJavaPath = QStandardPaths::findExecutable(currentJavaPath); | ||||
| 		} | ||||
| 		QFile currentJavaBin(currentJavaPath); | ||||
| 		if(!currentJavaBin.exists()) | ||||
| 		QString actualPath = ResolveExecutable(currentJavaPath); | ||||
| 		if (currentJavaPath.isNull()) | ||||
| 		{ | ||||
| 			askForJava = true; | ||||
| 			break; | ||||
|   | ||||
| @@ -10,6 +10,7 @@ | ||||
| #include "MultiMC.h" | ||||
|  | ||||
| #include <java/JavaVersionList.h> | ||||
| #include <pathutils.h> | ||||
|  | ||||
| InstanceSettingsPage::InstanceSettingsPage(BaseInstance *inst, QWidget *parent) | ||||
| 	: QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst) | ||||
| @@ -184,11 +185,21 @@ void InstanceSettingsPage::on_javaDetectBtn_clicked() | ||||
|  | ||||
| void InstanceSettingsPage::on_javaBrowseBtn_clicked() | ||||
| { | ||||
| 	QString dir = QFileDialog::getOpenFileName(this, tr("Find Java executable")); | ||||
| 	if (!dir.isNull()) | ||||
| 	QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable")); | ||||
| 	QString cooked_path = NormalizePath(raw_path); | ||||
|  | ||||
| 	// do not allow current dir - it's dirty. Do not allow dirs that don't exist | ||||
| 	if(cooked_path.isEmpty()) | ||||
| 	{ | ||||
| 		ui->javaPathTextBox->setText(dir); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	QFileInfo javaInfo(cooked_path);; | ||||
| 	if(!javaInfo.exists() || !javaInfo.isExecutable()) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 	ui->javaPathTextBox->setText(cooked_path); | ||||
| } | ||||
|  | ||||
| void InstanceSettingsPage::on_javaTestBtn_clicked() | ||||
|   | ||||
| @@ -105,13 +105,24 @@ void JavaPage::on_javaDetectBtn_clicked() | ||||
| 		ui->javaPathTextBox->setText(java->path); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void JavaPage::on_javaBrowseBtn_clicked() | ||||
| { | ||||
| 	QString dir = QFileDialog::getOpenFileName(this, tr("Find Java executable")); | ||||
| 	if (!dir.isNull()) | ||||
| 	QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable")); | ||||
| 	QString cooked_path = NormalizePath(raw_path); | ||||
|  | ||||
| 	// do not allow current dir - it's dirty. Do not allow dirs that don't exist | ||||
| 	if(cooked_path.isEmpty()) | ||||
| 	{ | ||||
| 		ui->javaPathTextBox->setText(dir); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	QFileInfo javaInfo(cooked_path);; | ||||
| 	if(!javaInfo.exists() || !javaInfo.isExecutable()) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 	ui->javaPathTextBox->setText(cooked_path); | ||||
| } | ||||
|  | ||||
| void JavaPage::on_javaTestBtn_clicked() | ||||
|   | ||||
| @@ -25,6 +25,18 @@ MULTIMC_UTIL_EXPORT QString PathCombine(QString path1, QString path2, QString pa | ||||
|  | ||||
| MULTIMC_UTIL_EXPORT QString AbsolutePath(QString path); | ||||
|  | ||||
| /** | ||||
|  * Resolve an executable | ||||
|  * | ||||
|  * Will resolve: | ||||
|  *   single executable (by name) | ||||
|  *   relative path | ||||
|  *   absolute path | ||||
|  * | ||||
|  * @return absolute path to executable or null string | ||||
|  */ | ||||
| MULTIMC_UTIL_EXPORT QString ResolveExecutable(QString path); | ||||
|  | ||||
| /** | ||||
|  * Normalize path | ||||
|  * | ||||
| @@ -33,7 +45,7 @@ MULTIMC_UTIL_EXPORT QString AbsolutePath(QString path); | ||||
|  * | ||||
|  * Returns false if the path logic somehow filed (and normalizedPath in invalid) | ||||
|  */ | ||||
| QString NormalizePath(QString path); | ||||
| MULTIMC_UTIL_EXPORT QString NormalizePath(QString path); | ||||
|  | ||||
| MULTIMC_UTIL_EXPORT QString RemoveInvalidFilenameChars(QString string, QChar replaceWith = '-'); | ||||
|  | ||||
|   | ||||
| @@ -40,6 +40,24 @@ QString AbsolutePath(QString path) | ||||
| 	return QFileInfo(path).absolutePath(); | ||||
| } | ||||
|  | ||||
| QString ResolveExecutable(QString path) | ||||
| { | ||||
| 	if (path.isEmpty()) | ||||
| 	{ | ||||
| 		return QString(); | ||||
| 	} | ||||
| 	if(!path.contains('/')) | ||||
| 	{ | ||||
| 		path = QStandardPaths::findExecutable(path); | ||||
| 	} | ||||
| 	QFileInfo pathInfo(path); | ||||
| 	if(!pathInfo.exists() || !pathInfo.isExecutable()) | ||||
| 	{ | ||||
| 		return QString(); | ||||
| 	} | ||||
| 	return pathInfo.absoluteFilePath(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Normalize path | ||||
|  * | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
|  | ||||
| #include "CheckJava.h" | ||||
| #include <launch/LaunchTask.h> | ||||
| #include <pathutils.h> | ||||
| #include <QStandardPaths> | ||||
| #include <QFileInfo> | ||||
|  | ||||
| @@ -22,7 +23,7 @@ void CheckJava::executeTask() | ||||
| { | ||||
| 	auto instance = m_parent->instance(); | ||||
| 	auto settings = instance->settings(); | ||||
| 	m_javaPath = settings->get("JavaPath").toString(); | ||||
| 	m_javaPath = ResolveExecutable(settings->get("JavaPath").toString()); | ||||
| 	bool perInstance = settings->get("OverrideJava").toBool() || settings->get("OverrideJavaLocation").toBool(); | ||||
|  | ||||
| 	auto realJavaPath = QStandardPaths::findExecutable(m_javaPath); | ||||
|   | ||||
| @@ -16,6 +16,7 @@ | ||||
| #include "LaunchMinecraft.h" | ||||
| #include <launch/LaunchTask.h> | ||||
| #include <minecraft/OneSixInstance.h> | ||||
| #include <pathutils.h> | ||||
| #include <QStandardPaths> | ||||
|  | ||||
| LaunchMinecraft::LaunchMinecraft(LaunchTask *parent) : LaunchStep(parent) | ||||
| @@ -33,7 +34,7 @@ void LaunchMinecraft::executeTask() | ||||
| 	QString allArgs = args.join(", "); | ||||
| 	emit logLine("Java Arguments:\n[" + m_parent->censorPrivateInfo(allArgs) + "]\n\n", MessageLevel::MultiMC); | ||||
|  | ||||
| 	auto javaPath = instance->settings()->get("JavaPath").toString(); | ||||
| 	auto javaPath = ResolveExecutable(instance->settings()->get("JavaPath").toString()); | ||||
|  | ||||
| 	m_process.setProcessEnvironment(instance->createEnvironment()); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Petr Mrázek
					Petr Mrázek