]> git.sur5r.net Git - minitube/blobdiff - lib/updater/src/impl/runinstaller.cpp
New upstream version 3.8
[minitube] / lib / updater / src / impl / runinstaller.cpp
index 67aa7f23ce2fadd75421d7e3316edddb0780809f..2e50d27ed21cf9bf3743689bbb035e3bde9ccfb5 100644 (file)
@@ -2,20 +2,58 @@
 
 #include <QDesktopServices>
 
+#include "defaultupdater.h"
+
 namespace updater {
 
 RunInstaller::RunInstaller() : Installer() {}
 
 void RunInstaller::start(const QString &filename) {
-    if (arguments.isEmpty()) {
-        if (!QDesktopServices::openUrl(QUrl("file:///" + filename)))
-            emit error("Cannot start update");
+    auto processedArguments = arguments;
+    processedArguments << autoRestartArguments;
+
+    if (command.isEmpty()) {
+        command = filename;
+    } else {
+        // replace markers
+        for (auto &arg : processedArguments)
+            arg.replace("%filename%", filename);
+#ifdef Q_OS_LINUX
+            if (runAsAdmin) {
+                processedArguments.prepend(command);
+                command = "pkexec";
+            }
+#endif
+    }
+
+    QProcess *process = new QProcess();
+    QObject::connect(process, &QProcess::errorOccurred, this, [this](auto error) {
+        this->emit error("Update error: " + QVariant::fromValue(error).toString());
+    });
+
+    if (autoRestart && updater->getRelaunchAfterInstall()) {
+        auto thread = new QThread;
+        process->moveToThread(thread);
+        connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this,
+                [this](int exitCode, QProcess::ExitStatus exitStatus) {
+                    qDebug() << "finished" << exitCode << exitStatus;
+                    if (exitCode == 0 && exitStatus == QProcess::NormalExit) {
+                        qDebug() << "Restarting" << qApp->applicationFilePath();
+                        QProcess *restartProcess = new QProcess(this);
+                        restartProcess->startDetached(qApp->applicationFilePath(), {});
+                    }
+                });
+        qDebug() << "Executing" << command << processedArguments;
+        process->start(command, processedArguments);
+        process->waitForFinished(60000);
     } else {
-        QProcess *process = new QProcess(this);
-        QObject::connect(process, &QProcess::errorOccurred, this, [this](auto error) {
-            this->emit error("Update error: " + QVariant::fromValue(error).toString());
-        });
-        process->startDetached(filename, arguments);
+        qDebug() << "Forking" << command << processedArguments;
+        if (!process->startDetached(command, processedArguments)) {
+            qWarning() << "Cannot execute" << command << processedArguments
+                       << process->errorString();
+            // Fallback to opening the downloaded payload
+            QDesktopServices::openUrl(QUrl("file:///" + filename));
+        }
     }
 }