fix(updater): ensure updater knows binaries are in ./bin/ on linux and can find them

Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
Rachel Powers 2023-06-30 21:24:30 -07:00
parent cd527c44a4
commit 1fd90e9dd0
No known key found for this signature in database
GPG Key ID: E10E321EB160949B
3 changed files with 40 additions and 26 deletions

View File

@ -1126,7 +1126,7 @@ bool Application::updaterEnabled()
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)
return BuildConfig.UPDATER_ENABLED; return BuildConfig.UPDATER_ENABLED;
#else #else
return BuildConfig.UPDATER_ENABLED && QFileInfo(FS::PathCombine(applicationDirPath(), updaterBinaryName())).isFile(); return BuildConfig.UPDATER_ENABLED && QFileInfo(FS::PathCombine(m_rootPath, updaterBinaryName())).isFile();
#endif #endif
} }
@ -1135,6 +1135,8 @@ QString Application::updaterBinaryName()
auto exe_name = QStringLiteral("%1_updater").arg(BuildConfig.LAUNCHER_APP_BINARY_NAME); auto exe_name = QStringLiteral("%1_updater").arg(BuildConfig.LAUNCHER_APP_BINARY_NAME);
#if defined Q_OS_WIN32 #if defined Q_OS_WIN32
exe_name.append(".exe"); exe_name.append(".exe");
#else
exe_name.prepend("bin/");
#endif #endif
return exe_name; return exe_name;
} }
@ -1215,7 +1217,7 @@ void Application::performMainStartupAction()
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
m_updater.reset(new MacSparkleUpdater()); m_updater.reset(new MacSparkleUpdater());
#else #else
m_updater.reset(new PrismExternalUpdater(m_mainWindow, applicationDirPath(), m_dataPath)); m_updater.reset(new PrismExternalUpdater(m_mainWindow, m_rootPath, m_dataPath));
#endif #endif
qDebug() << "<> Updater started."; qDebug() << "<> Updater started.";
} }

View File

@ -40,7 +40,7 @@
class PrismExternalUpdater::Private { class PrismExternalUpdater::Private {
public: public:
QDir binDir; QDir appDir;
QDir dataDir; QDir dataDir;
QTimer updateTimer; QTimer updateTimer;
bool allowBeta; bool allowBeta;
@ -52,10 +52,10 @@ class PrismExternalUpdater::Private {
QWidget* parent; QWidget* parent;
}; };
PrismExternalUpdater::PrismExternalUpdater(QWidget* parent, const QString& binDir, const QString& dataDir) PrismExternalUpdater::PrismExternalUpdater(QWidget* parent, const QString& appDir, const QString& dataDir)
{ {
priv = new PrismExternalUpdater::Private(); priv = new PrismExternalUpdater::Private();
priv->binDir = QDir(binDir); priv->appDir = QDir(appDir);
priv->dataDir = QDir(dataDir); priv->dataDir = QDir(dataDir);
auto settings_file = priv->dataDir.absoluteFilePath("prismlauncher_update.cfg"); auto settings_file = priv->dataDir.absoluteFilePath("prismlauncher_update.cfg");
priv->settings = std::make_unique<QSettings>(settings_file, QSettings::Format::IniFormat); priv->settings = std::make_unique<QSettings>(settings_file, QSettings::Format::IniFormat);
@ -100,13 +100,15 @@ void PrismExternalUpdater::checkForUpdates()
auto env = QProcessEnvironment::systemEnvironment(); auto env = QProcessEnvironment::systemEnvironment();
env.insert("__COMPAT_LAYER", "RUNASINVOKER"); env.insert("__COMPAT_LAYER", "RUNASINVOKER");
proc.setProcessEnvironment(env); proc.setProcessEnvironment(env);
#else
exe_name = QString("bin/%1").arg(exe_name);
#endif #endif
QStringList args = { "--check-only", "--dir", priv->dataDir.absolutePath(), "--debug" }; QStringList args = { "--check-only", "--dir", priv->dataDir.absolutePath(), "--debug" };
if (priv->allowBeta) if (priv->allowBeta)
args.append("--pre-release"); args.append("--pre-release");
proc.start(priv->binDir.absoluteFilePath(exe_name), args); proc.start(priv->appDir.absoluteFilePath(exe_name), args);
auto result_start = proc.waitForStarted(5000); auto result_start = proc.waitForStarted(5000);
if (!result_start) { if (!result_start) {
auto err = proc.error(); auto err = proc.error();
@ -342,7 +344,7 @@ void PrismExternalUpdater::performUpdate(const QString& version_tag)
if (priv->allowBeta) if (priv->allowBeta)
args.append("--pre-release"); args.append("--pre-release");
auto result = proc.startDetached(priv->binDir.absoluteFilePath(exe_name), args); auto result = proc.startDetached(priv->appDir.absoluteFilePath(exe_name), args);
if (!result) { if (!result) {
qDebug() << "Failed to start updater:" << proc.error() << proc.errorString(); qDebug() << "Failed to start updater:" << proc.error() << proc.errorString();
} }

View File

@ -258,9 +258,9 @@ PrismUpdaterApp::PrismUpdaterApp(int& argc, char** argv) : QApplication(argc, ar
m_isFlatpak = DesktopServices::isFlatpak(); m_isFlatpak = DesktopServices::isFlatpak();
QString prism_executable = QCoreApplication::applicationDirPath() + "/" + BuildConfig.LAUNCHER_APP_BINARY_NAME; QString prism_executable = FS::PathCombine(applicationDirPath(), BuildConfig.LAUNCHER_APP_BINARY_NAME);
#if defined Q_OS_WIN32 #if defined Q_OS_WIN32
prism_executable += ".exe"; prism_executable.append(".exe");
#endif #endif
if (!QFileInfo(prism_executable).isFile()) { if (!QFileInfo(prism_executable).isFile()) {
@ -349,6 +349,7 @@ PrismUpdaterApp::PrismUpdaterApp(int& argc, char** argv) : QApplication(argc, ar
m_updateLogPath = FS::PathCombine(m_dataPath, "logs", "prism_launcher_update.log"); m_updateLogPath = FS::PathCombine(m_dataPath, "logs", "prism_launcher_update.log");
{ // setup logging { // setup logging
FS::ensureFolderPathExists(FS::PathCombine(m_dataPath, "logs"));
static const QString baseLogFile = BuildConfig.LAUNCHER_NAME + "Updater" + (m_checkOnly ? "-CheckOnly" : "") + "-%0.log"; static const QString baseLogFile = BuildConfig.LAUNCHER_NAME + "Updater" + (m_checkOnly ? "-CheckOnly" : "") + "-%0.log";
static const QString logBase = FS::PathCombine(m_dataPath, "logs", baseLogFile); static const QString logBase = FS::PathCombine(m_dataPath, "logs", baseLogFile);
auto moveFile = [](const QString& oldName, const QString& newName) { auto moveFile = [](const QString& oldName, const QString& newName) {
@ -464,13 +465,13 @@ PrismUpdaterApp::PrismUpdaterApp(int& argc, char** argv) : QApplication(argc, ar
m_network->setProxy(proxy); m_network->setProxy(proxy);
} }
auto marker_file_path = QDir(applicationDirPath()).absoluteFilePath(".prism_launcher_updater_unpack.marker"); auto marker_file_path = QDir(m_rootPath).absoluteFilePath(".prism_launcher_updater_unpack.marker");
auto marker_file = QFileInfo(marker_file_path); auto marker_file = QFileInfo(marker_file_path);
if (marker_file.exists()) { if (marker_file.exists()) {
auto target_dir = QString(FS::read(marker_file_path)).trimmed(); auto target_dir = QString(FS::read(marker_file_path)).trimmed();
if (target_dir.isEmpty()) { if (target_dir.isEmpty()) {
qWarning() << "Empty updater marker file contains no install target. making best guess of parent dir"; qWarning() << "Empty updater marker file contains no install target. making best guess of parent dir";
target_dir = QDir(applicationDirPath()).absoluteFilePath(".."); target_dir = QDir(m_rootPath).absoluteFilePath("..");
} }
QMetaObject::invokeMethod( QMetaObject::invokeMethod(
@ -629,10 +630,10 @@ void PrismUpdaterApp::moveAndFinishUpdate(QDir target)
logUpdate("Waiting 2 seconds for resources to free"); logUpdate("Waiting 2 seconds for resources to free");
this->thread()->sleep(2); this->thread()->sleep(2);
auto manifest_path = FS::PathCombine(applicationDirPath(), "manifest.txt"); auto manifest_path = FS::PathCombine(m_rootPath, "manifest.txt");
QFileInfo manifest(manifest_path); QFileInfo manifest(manifest_path);
auto app_dir = QDir(applicationDirPath()); auto app_dir = QDir(m_rootPath);
QStringList file_list; QStringList file_list;
if (manifest.isFile()) { if (manifest.isFile()) {
@ -649,7 +650,7 @@ void PrismUpdaterApp::moveAndFinishUpdate(QDir target)
} }
if (file_list.isEmpty()) { if (file_list.isEmpty()) {
logUpdate(tr("Manifest empty, making best guess of the directory contents of %1").arg(applicationDirPath())); logUpdate(tr("Manifest empty, making best guess of the directory contents of %1").arg(m_rootPath));
auto entries = target.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); auto entries = target.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
for (auto entry : entries) { for (auto entry : entries) {
file_list.append(entry.fileName()); file_list.append(entry.fileName());
@ -659,7 +660,7 @@ void PrismUpdaterApp::moveAndFinishUpdate(QDir target)
bool error = false; bool error = false;
QProgressDialog progress(tr("Backing up install at %1").arg(applicationDirPath()), "", 0, file_list.length()); QProgressDialog progress(tr("Backing up install at %1").arg(m_rootPath), "", 0, file_list.length());
progress.setCancelButton(nullptr); progress.setCancelButton(nullptr);
progress.setMinimumWidth(400); progress.setMinimumWidth(400);
progress.adjustSize(); progress.adjustSize();
@ -668,7 +669,7 @@ void PrismUpdaterApp::moveAndFinishUpdate(QDir target)
int i = 0; int i = 0;
for (auto glob : file_list) { for (auto glob : file_list) {
QDirIterator iter(applicationDirPath(), QStringList({ glob }), QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); QDirIterator iter(m_rootPath, QStringList({ glob }), QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
progress.setValue(i); progress.setValue(i);
QCoreApplication::processEvents(); QCoreApplication::processEvents();
while (iter.hasNext()) { while (iter.hasNext()) {
@ -708,6 +709,8 @@ void PrismUpdaterApp::moveAndFinishUpdate(QDir target)
auto env = QProcessEnvironment::systemEnvironment(); auto env = QProcessEnvironment::systemEnvironment();
env.insert("__COMPAT_LAYER", "RUNASINVOKER"); env.insert("__COMPAT_LAYER", "RUNASINVOKER");
proc.setProcessEnvironment(env); proc.setProcessEnvironment(env);
#else
exe_name.prepend("bin/");
#endif #endif
auto app_exe_path = target.absoluteFilePath(app_exe_name); auto app_exe_path = target.absoluteFilePath(app_exe_name);
@ -894,10 +897,15 @@ QFileInfo PrismUpdaterApp::downloadAsset(const GitHubReleaseAsset& asset)
bool PrismUpdaterApp::callAppImageUpdate() bool PrismUpdaterApp::callAppImageUpdate()
{ {
auto appimage_path = QProcessEnvironment::systemEnvironment().value(QStringLiteral("APPIMAGE"));
QProcess proc = QProcess(); QProcess proc = QProcess();
qDebug() << "Calling: AppImageUpdate" << appimage_path;
proc.setProgram("AppImageUpdate"); proc.setProgram("AppImageUpdate");
proc.setArguments({ QProcessEnvironment::systemEnvironment().value(QStringLiteral("APPIMAGE")) }); proc.setArguments({ appimage_path });
return proc.startDetached(); auto result = proc.startDetached();
if (!result)
qDebug() << "Failed to start AppImageUpdate reason:" << proc.errorString();
return result;
} }
void PrismUpdaterApp::clearUpdateLog() void PrismUpdaterApp::clearUpdateLog()
@ -1005,9 +1013,8 @@ void PrismUpdaterApp::performInstall(QFileInfo file)
logUpdate(tr("Updating from %1 to %2").arg(m_prismVersion).arg(m_install_release.tag_name)); logUpdate(tr("Updating from %1 to %2").arg(m_prismVersion).arg(m_install_release.tag_name));
if (m_isPortable || file.suffix().toLower() == "zip") { if (m_isPortable || file.suffix().toLower() == "zip") {
write_lock_file(update_lock_path, QDateTime::currentDateTime(), m_prismVersion, m_install_release.tag_name, applicationDirPath(), write_lock_file(update_lock_path, QDateTime::currentDateTime(), m_prismVersion, m_install_release.tag_name, m_rootPath, m_dataPath);
m_dataPath); logUpdate(tr("Updating portable install at %1").arg(m_rootPath));
logUpdate(tr("Updating portable install at %1").arg(applicationDirPath()));
unpackAndInstall(file); unpackAndInstall(file);
} else { } else {
logUpdate(tr("Running installer file at %1").arg(file.absoluteFilePath())); logUpdate(tr("Running installer file at %1").arg(file.absoluteFilePath()));
@ -1016,6 +1023,8 @@ void PrismUpdaterApp::performInstall(QFileInfo file)
auto env = QProcessEnvironment::systemEnvironment(); auto env = QProcessEnvironment::systemEnvironment();
env.insert("__COMPAT_LAYER", "RUNASINVOKER"); env.insert("__COMPAT_LAYER", "RUNASINVOKER");
proc.setProcessEnvironment(env); proc.setProcessEnvironment(env);
#else
exe_name.prepend("bin/");
#endif #endif
proc.setProgram(file.absoluteFilePath()); proc.setProgram(file.absoluteFilePath());
bool result = proc.startDetached(); bool result = proc.startDetached();
@ -1031,7 +1040,7 @@ void PrismUpdaterApp::unpackAndInstall(QFileInfo archive)
if (auto loc = unpackArchive(archive)) { if (auto loc = unpackArchive(archive)) {
auto marker_file_path = loc.value().absoluteFilePath(".prism_launcher_updater_unpack.marker"); auto marker_file_path = loc.value().absoluteFilePath(".prism_launcher_updater_unpack.marker");
FS::write(marker_file_path, applicationDirPath().toUtf8()); FS::write(marker_file_path, m_rootPath.toUtf8());
QProcess proc = QProcess(); QProcess proc = QProcess();
@ -1042,6 +1051,8 @@ void PrismUpdaterApp::unpackAndInstall(QFileInfo archive)
auto env = QProcessEnvironment::systemEnvironment(); auto env = QProcessEnvironment::systemEnvironment();
env.insert("__COMPAT_LAYER", "RUNASINVOKER"); env.insert("__COMPAT_LAYER", "RUNASINVOKER");
proc.setProcessEnvironment(env); proc.setProcessEnvironment(env);
#else
exe_name.prepend("bin/");
#endif #endif
auto new_updater_path = loc.value().absoluteFilePath(exe_name); auto new_updater_path = loc.value().absoluteFilePath(exe_name);
@ -1057,7 +1068,7 @@ void PrismUpdaterApp::unpackAndInstall(QFileInfo archive)
void PrismUpdaterApp::backupAppDir() void PrismUpdaterApp::backupAppDir()
{ {
auto manifest_path = FS::PathCombine(applicationDirPath(), "manifest.txt"); auto manifest_path = FS::PathCombine(m_rootPath, "manifest.txt");
QFileInfo manifest(manifest_path); QFileInfo manifest(manifest_path);
QStringList file_list; QStringList file_list;
@ -1099,8 +1110,7 @@ void PrismUpdaterApp::backupAppDir()
logUpdate("manifest.txt empty or missing. making best guess at files to back up."); logUpdate("manifest.txt empty or missing. making best guess at files to back up.");
} }
logUpdate(tr("Backing up:\n %1").arg(file_list.join(",\n "))); logUpdate(tr("Backing up:\n %1").arg(file_list.join(",\n ")));
auto app_dir = QDir(m_rootPath);
QDir app_dir = QCoreApplication::applicationDirPath();
auto backup_dir = FS::PathCombine( auto backup_dir = FS::PathCombine(
app_dir.absolutePath(), app_dir.absolutePath(),
QStringLiteral("backup_") + QStringLiteral("backup_") +
@ -1110,7 +1120,7 @@ void PrismUpdaterApp::backupAppDir()
auto backup_marker_path = FS::PathCombine(m_dataPath, ".prism_launcher_update_backup_path.txt"); auto backup_marker_path = FS::PathCombine(m_dataPath, ".prism_launcher_update_backup_path.txt");
FS::write(backup_marker_path, backup_dir.toUtf8()); FS::write(backup_marker_path, backup_dir.toUtf8());
QProgressDialog progress(tr("Backing up install at %1").arg(applicationDirPath()), "", 0, file_list.length()); QProgressDialog progress(tr("Backing up install at %1").arg(m_rootPath), "", 0, file_list.length());
progress.setCancelButton(nullptr); progress.setCancelButton(nullptr);
progress.setMinimumWidth(400); progress.setMinimumWidth(400);
progress.adjustSize(); progress.adjustSize();