]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/settings/contextmenu/servicemenuinstaller/servicemenuinstaller.cpp
Merge branch 'master' into kf6
[dolphin.git] / src / settings / contextmenu / servicemenuinstaller / servicemenuinstaller.cpp
index 7f42ee3bd5927e3ec109ffac44d259491eea3401..fa7369e06a1399f74b97d9ed28c6f404d90b3b19 100644 (file)
@@ -4,32 +4,31 @@
  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
  */
 
+#include <KLocalizedString>
+#include <KShell>
+#include <QCommandLineParser>
 #include <QDebug>
-#include <QProcess>
-#include <QTimer>
-#include <QStandardPaths>
 #include <QDir>
 #include <QDirIterator>
-#include <QCommandLineParser>
+#include <QGuiApplication>
 #include <QMimeDatabase>
+#include <QProcess>
+#include <QStandardPaths>
+#include <QTimer>
 #include <QUrl>
-#include <QGuiApplication>
-#include <KLocalizedString>
-#include <KShell>
 
-#include "../../../config-packagekit.h"
+#include "../../../config-dolphin.h"
 
-Q_GLOBAL_STATIC_WITH_ARGS(QStringList, binaryPackages, ({QLatin1String("application/vnd.debian.binary-package"),
-                                                        QLatin1String("application/x-rpm"),
-                                                        QLatin1String("application/x-xz"),
-                                                        QLatin1String("application/zstd")}))
+Q_GLOBAL_STATIC_WITH_ARGS(QStringList,
+                          binaryPackages,
+                          ({QLatin1String("application/vnd.debian.binary-package"),
+                            QLatin1String("application/x-rpm"),
+                            QLatin1String("application/x-xz"),
+                            QLatin1String("application/zstd")}))
 
-enum PackageOperation {
-    Install,
-    Uninstall
-};
+enum PackageOperation { Install, Uninstall };
 
-#ifdef HAVE_PACKAGEKIT
+#if HAVE_PACKAGEKIT
 #include <PackageKit/Daemon>
 #include <PackageKit/Details>
 #include <PackageKit/Transaction>
@@ -41,7 +40,7 @@ enum PackageOperation {
 Q_NORETURN void fail(const QString &str)
 {
     qCritical() << str;
-    const QStringList args = {"--detailederror" ,i18n("Dolphin service menu installation failed"),  str};
+    const QStringList args = {"--detailederror", i18n("Dolphin service menu installation failed"), str};
     QProcess::startDetached("kdialog", args);
 
     exit(1);
@@ -53,26 +52,24 @@ QString getServiceMenusDir()
     return QDir(dataLocation).absoluteFilePath("kio/servicemenus");
 }
 
-#ifdef HAVE_PACKAGEKIT
+#if HAVE_PACKAGEKIT
 void packageKitInstall(const QString &fileName)
 {
     PackageKit::Transaction *transaction = PackageKit::Daemon::installFile(fileName, PackageKit::Transaction::TransactionFlagNone);
 
     const auto exitWithError = [=](PackageKit::Transaction::Error, const QString &details) {
-       fail(details);
+        fail(details);
     };
 
-    QObject::connect(transaction, &PackageKit::Transaction::finished,
-                     [=](PackageKit::Transaction::Exit status, uint) {
-                        if (status == PackageKit::Transaction::ExitSuccess) {
-                            exit(0);
-                        }
-                        // Fallback error handling
-                        QTimer::singleShot(500, [=](){
-                            fail(i18n("Failed to install \"%1\", exited with status \"%2\"",
-                                      fileName, QVariant::fromValue(status).toString()));
-                        });
-                    });
+    QObject::connect(transaction, &PackageKit::Transaction::finished, [=](PackageKit::Transaction::Exit status, uint) {
+        if (status == PackageKit::Transaction::ExitSuccess) {
+            exit(0);
+        }
+        // Fallback error handling
+        QTimer::singleShot(500, [=]() {
+            fail(i18n("Failed to install \"%1\", exited with status \"%2\"", fileName, QVariant::fromValue(status).toString()));
+        });
+    });
     QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError);
 }
 
@@ -88,30 +85,27 @@ void packageKitUninstall(const QString &fileName)
     };
 
     PackageKit::Transaction *transaction = PackageKit::Daemon::getDetailsLocal(fileName);
-    QObject::connect(transaction, &PackageKit::Transaction::details,
-                     [=](const PackageKit::Details &details) {
-                         PackageKit::Transaction *transaction = PackageKit::Daemon::removePackage(details.packageId());
-                         QObject::connect(transaction, &PackageKit::Transaction::finished, uninstallLambda);
-                         QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError);
-                     });
+    QObject::connect(transaction, &PackageKit::Transaction::details, [=](const PackageKit::Details &details) {
+        PackageKit::Transaction *transaction = PackageKit::Daemon::removePackage(details.packageId());
+        QObject::connect(transaction, &PackageKit::Transaction::finished, uninstallLambda);
+        QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError);
+    });
 
     QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError);
     // Fallback error handling
-    QObject::connect(transaction, &PackageKit::Transaction::finished,
-        [=](PackageKit::Transaction::Exit status, uint) {
-            if (status != PackageKit::Transaction::ExitSuccess) {
-                QTimer::singleShot(500, [=]() {
-                    fail(i18n("Failed to uninstall \"%1\", exited with status \"%2\"",
-                              fileName, QVariant::fromValue(status).toString()));
-                });
-            }
-        });
-    }
+    QObject::connect(transaction, &PackageKit::Transaction::finished, [=](PackageKit::Transaction::Exit status, uint) {
+        if (status != PackageKit::Transaction::ExitSuccess) {
+            QTimer::singleShot(500, [=]() {
+                fail(i18n("Failed to uninstall \"%1\", exited with status \"%2\"", fileName, QVariant::fromValue(status).toString()));
+            });
+        }
+    });
+}
 #endif
 
 Q_NORETURN void packageKit(PackageOperation operation, const QString &fileName)
 {
-#ifdef HAVE_PACKAGEKIT
+#if HAVE_PACKAGEKIT
     QFileInfo fileInfo(fileName);
     if (!fileInfo.exists()) {
         fail(i18n("The file does not exist!"));
@@ -131,46 +125,54 @@ Q_NORETURN void packageKit(PackageOperation operation, const QString &fileName)
 #endif
 }
 
-struct UncompressCommand
-{
+struct UncompressCommand {
     QString command;
     QStringList args1;
     QStringList args2;
 };
 
-enum ScriptExecution{
-    Process,
-    Konsole
-};
+enum ScriptExecution { Process, Konsole };
 
 void runUncompress(const QString &inputPath, const QString &outputPath)
 {
     QVector<QPair<QStringList, UncompressCommand>> mimeTypeToCommand;
-    mimeTypeToCommand.append({{"application/x-tar", "application/tar", "application/x-gtar", "multipart/x-tar"},
-                              UncompressCommand({"tar", {"-xf"}, {"-C"}})});
-    mimeTypeToCommand.append({{"application/x-gzip", "application/gzip",
-                               "application/x-gzip-compressed-tar", "application/gzip-compressed-tar",
-                               "application/x-gzip-compressed", "application/gzip-compressed",
-                               "application/tgz", "application/x-compressed-tar",
-                               "application/x-compressed-gtar", "file/tgz",
-                               "multipart/x-tar-gz", "application/x-gunzip", "application/gzipped",
+    mimeTypeToCommand.append({{"application/x-tar", "application/tar", "application/x-gtar", "multipart/x-tar"}, UncompressCommand({"tar", {"-xf"}, {"-C"}})});
+    mimeTypeToCommand.append({{"application/x-gzip",
+                               "application/gzip",
+                               "application/x-gzip-compressed-tar",
+                               "application/gzip-compressed-tar",
+                               "application/x-gzip-compressed",
+                               "application/gzip-compressed",
+                               "application/tgz",
+                               "application/x-compressed-tar",
+                               "application/x-compressed-gtar",
+                               "file/tgz",
+                               "multipart/x-tar-gz",
+                               "application/x-gunzip",
+                               "application/gzipped",
                                "gzip/document"},
                               UncompressCommand({"tar", {"-zxf"}, {"-C"}})});
-    mimeTypeToCommand.append({{"application/bzip", "application/bzip2", "application/x-bzip",
-                               "application/x-bzip2", "application/bzip-compressed",
-                               "application/bzip2-compressed", "application/x-bzip-compressed",
-                               "application/x-bzip2-compressed", "application/bzip-compressed-tar",
-                               "application/bzip2-compressed-tar", "application/x-bzip-compressed-tar",
-                               "application/x-bzip2-compressed-tar", "application/x-bz2"},
+    mimeTypeToCommand.append({{"application/bzip",
+                               "application/bzip2",
+                               "application/x-bzip",
+                               "application/x-bzip2",
+                               "application/bzip-compressed",
+                               "application/bzip2-compressed",
+                               "application/x-bzip-compressed",
+                               "application/x-bzip2-compressed",
+                               "application/bzip-compressed-tar",
+                               "application/bzip2-compressed-tar",
+                               "application/x-bzip-compressed-tar",
+                               "application/x-bzip2-compressed-tar",
+                               "application/x-bz2"},
                               UncompressCommand({"tar", {"-jxf"}, {"-C"}})});
-    mimeTypeToCommand.append({{"application/zip", "application/x-zip", "application/x-zip-compressed",
-                               "multipart/x-zip"},
-                              UncompressCommand({"unzip", {}, {"-d"}})});
+    mimeTypeToCommand.append(
+        {{"application/zip", "application/x-zip", "application/x-zip-compressed", "multipart/x-zip"}, UncompressCommand({"unzip", {}, {"-d"}})});
 
     const auto mime = QMimeDatabase().mimeTypeForFile(inputPath).name();
 
     UncompressCommand command{};
-    for (const auto &pair : qAsConst(mimeTypeToCommand)) {
+    for (const auto &pair : std::as_const(mimeTypeToCommand)) {
         if (pair.first.contains(mime)) {
             command = pair.second;
             break;
@@ -182,17 +184,13 @@ void runUncompress(const QString &inputPath, const QString &outputPath)
     }
 
     QProcess process;
-    process.start(
-        command.command,
-        QStringList() << command.args1 << inputPath << command.args2 << outputPath,
-        QIODevice::NotOpen);
+    process.start(command.command, QStringList() << command.args1 << inputPath << command.args2 << outputPath, QIODevice::NotOpen);
     if (!process.waitForStarted()) {
         fail(i18n("Failed to run uncompressor command for %1", inputPath));
     }
 
     if (!process.waitForFinished()) {
-        fail(
-            i18n("Process did not finish in reasonable time: %1 %2", process.program(), process.arguments().join(" ")));
+        fail(i18n("Process did not finish in reasonable time: %1 %2", process.program(), process.arguments().join(" ")));
     }
 
     if (process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) {
@@ -204,7 +202,7 @@ QString findRecursive(const QString &dir, const QString &basename)
 {
     QDirIterator it(dir, QStringList{basename}, QDir::Files, QDirIterator::Subdirectories);
     while (it.hasNext()) {
-        return QFileInfo(it.next()).canonicalFilePath();
+        return QFileInfo(it.next()).absoluteFilePath();
     }
 
     return QString();
@@ -224,7 +222,11 @@ bool runScriptOnce(const QString &path, const QStringList &args, ScriptExecution
         bashCommand.append("|| $SHELL");
         // If the install script fails a shell opens and the user can fix the problem
         // without an error konsole closes
-        process.start("konsole", QStringList() << "-e" << "bash" << "-c" << bashCommand, QIODevice::NotOpen);
+        process.start("konsole",
+                      QStringList() << "-e"
+                                    << "bash"
+                                    << "-c" << bashCommand,
+                      QIODevice::NotOpen);
     } else {
         process.start(path, args, QIODevice::NotOpen);
     }
@@ -267,9 +269,10 @@ bool runScriptVariants(const QString &path, bool hasArgVariants, const QStringLi
         return true;
     }
 
-    errorText = i18nc(
-        "%2 = comma separated list of arguments",
-        "Installer script %1 failed, tried arguments \"%2\".", path, argVariants.join(i18nc("Separator between arguments", "\", \"")));
+    errorText = i18nc("%2 = comma separated list of arguments",
+                      "Installer script %1 failed, tried arguments \"%2\".",
+                      path,
+                      argVariants.join(i18nc("Separator between arguments", "\", \"")));
     return false;
 }
 
@@ -337,7 +340,7 @@ bool cmdInstall(const QString &archive, QString &errorText)
 
         // If "install-it" is missing, try "install"
         QString installerPath;
-        const QStringList basenames2 = {"installKDE4.sh", "installKDE4", "install.sh", "install"};
+        const QStringList basenames2 = {"installKDE4.sh", "installKDE4", "install.sh", "install*.sh"};
         for (const auto &basename : basenames2) {
             const auto path = findRecursive(dir, basename);
             if (!path.isEmpty()) {
@@ -379,7 +382,7 @@ bool cmdUninstall(const QString &archive, QString &errorText)
 
         // Try "deinstall" first
         QString deinstallPath;
-        const QStringList basenames1 = {"uninstall.sh", "uninstal", "deinstall.sh", "deinstall"};
+        const QStringList basenames1 = {"uninstall.sh", "uninstall", "deinstall.sh", "deinstall"};
         for (const auto &basename : basenames1) {
             const auto path = findRecursive(dir, basename);
             if (!path.isEmpty()) {
@@ -396,8 +399,7 @@ bool cmdUninstall(const QString &archive, QString &errorText)
         } else {
             // If "deinstall" is missing, try "install --uninstall"
             QString installerPath;
-            const QStringList basenames2 = {"install-it.sh", "install-it", "installKDE4.sh",
-                                            "installKDE4", "install.sh", "install"};
+            const QStringList basenames2 = {"install-it.sh", "install-it", "installKDE4.sh", "installKDE4", "install.sh", "install"};
             for (const auto &basename : basenames2) {
                 const auto path = findRecursive(dir, basename);
                 if (!path.isEmpty()) {
@@ -407,8 +409,7 @@ bool cmdUninstall(const QString &archive, QString &errorText)
             }
 
             if (!installerPath.isEmpty()) {
-                const bool ok = runScriptVariants(installerPath, true,
-                                                  {"--remove", "--delete", "--uninstall", "--deinstall"}, errorText);
+                const bool ok = runScriptVariants(installerPath, true, {"--remove", "--delete", "--uninstall", "--deinstall"}, errorText);
                 if (!ok) {
                     return ok;
                 }