File indexing completed on 2024-05-12 05:44:20

0001 // SPDX-FileCopyrightText: 2023 Alexander Lohnau <alexander.lohnau@gmx.de>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #include <KAbstractFileItemActionPlugin>
0005 #include <KFileItemListProperties>
0006 #include <KIO/CommandLauncherJob>
0007 #include <KLocalizedString>
0008 #include <KPluginFactory>
0009 #include <QAction>
0010 #include <QDBusInterface>
0011 #include <QDBusReply>
0012 #include <QMenu>
0013 
0014 class KdeSvnActionsPlugin : public KAbstractFileItemActionPlugin
0015 {
0016     Q_OBJECT
0017 public:
0018     KdeSvnActionsPlugin(QObject *parent, const QVariantList &)
0019         : KAbstractFileItemActionPlugin(parent)
0020     {
0021     }
0022 
0023     QList<QAction *> fetchActions(const KFileItemListProperties &fileItemInfos, const QString &function, QWidget *parentWidget)
0024     {
0025         const QString url = fileItemInfos.urlList().constFirst().toString();
0026         QList<QAction *> actions;
0027         const auto createAction = [parentWidget, &actions, this](const QString &icon, const QString &text) {
0028             QAction *action = new QAction(QIcon::fromTheme(icon), text, parentWidget);
0029             connect(action, &QAction::triggered, this, [action]() {
0030                 const QString exec = action->data().toString();
0031                 auto job = new KIO::CommandLauncherJob(exec);
0032                 job->setDesktopName(QStringLiteral("org.kde.kdesvn"));
0033                 job->start();
0034             });
0035             actions << action;
0036             return action;
0037         };
0038         const auto createActionWithExec = [url, &createAction](const QString &icon, const QString &text, QLatin1String command) {
0039             auto action = createAction(icon, text);
0040             const QString fullCommand = QLatin1String("kdesvn exec ") + command + QLatin1Char(' ') + url;
0041             action->setData(fullCommand);
0042         };
0043 
0044         const QString app = QStringLiteral("org.kde.kded5");
0045         const QString object = QStringLiteral("/modules/kdesvnd");
0046         const QString interface = QStringLiteral("org.kde.kdesvnd");
0047         QDBusInterface remote(app, object, interface);
0048         if (QDBusReply<QStringList> reply = remote.call(function, QUrl::toStringList(fileItemInfos.urlList())); reply.isValid()) {
0049             const QStringList dbusActions = reply.value();
0050             if (dbusActions.contains(QLatin1String("Checkout"))) {
0051                 createActionWithExec(QStringLiteral("kdesvncheckout"), i18n("Checkout From Repository..."), QLatin1String("checkout"));
0052             }
0053             if (dbusActions.contains(QLatin1String("Export"))) {
0054                 createActionWithExec(QStringLiteral("kdesvnexport"), i18n("Export..."), QLatin1String("export"));
0055             }
0056             if (dbusActions.contains(QLatin1String("Update"))) {
0057                 createActionWithExec(QStringLiteral("kdesvnupdate"), i18n("Update (Kdesvn)"), QLatin1String("update"));
0058             }
0059             if (dbusActions.contains(QLatin1String("Commit"))) {
0060                 createActionWithExec(QStringLiteral("kdesvncommit"), i18n("Commit (Kdesvn)"), QLatin1String("commit"));
0061             }
0062             if (dbusActions.contains(QLatin1String("Log"))) {
0063                 createActionWithExec(QStringLiteral("kdesvnlog"), i18n("kdesvn log (last 100)"), QLatin1String(" -r HEAD:1 -l 100 log"));
0064             }
0065             if (dbusActions.contains(QLatin1String("Exportto"))) {
0066                 createActionWithExec(QStringLiteral("kdesvnexport"), i18n("Export from a Subversion repository..."), QLatin1String("exportto"));
0067             }
0068             if (dbusActions.contains(QLatin1String("Checkoutto"))) {
0069                 createActionWithExec(QStringLiteral("kdesvncheckout"), i18n("Checkout from a repository..."), QLatin1String("checkoutto"));
0070             }
0071 
0072             // Normal menu
0073             if (dbusActions.contains(QLatin1String("Info"))) {
0074                 createActionWithExec(QStringLiteral("kdesvninfo"), i18n("Detailed Subversion info"), QLatin1String("info"));
0075             }
0076             if (dbusActions.contains(QLatin1String("Add"))) {
0077                 createActionWithExec(QStringLiteral("kdesvnadd"), i18n("Add to Repository"), QLatin1String("add"));
0078             }
0079             if (dbusActions.contains(QLatin1String("Addnew"))) {
0080                 createActionWithExec(QStringLiteral("kdesvnaddrecursive"), i18n("Check for unversioned items"), QLatin1String("addnew"));
0081             }
0082             if (dbusActions.contains(QLatin1String("Delete"))) {
0083                 createActionWithExec(QStringLiteral("kdesvndelete"), i18n("Delete From Repository"), QLatin1String("rm"));
0084             }
0085             if (dbusActions.contains(QLatin1String("Revert"))) {
0086                 createActionWithExec(QStringLiteral("kdesvnreverse"), i18n("Revert Local Changes"), QLatin1String("revert"));
0087             }
0088             if (dbusActions.contains(QLatin1String("Rename"))) {
0089                 createActionWithExec(QStringLiteral("kdesvnmove"), i18n("Rename..."), QLatin1String("mv"));
0090             }
0091             if (dbusActions.contains(QLatin1String("Import"))) {
0092                 auto action = createAction(QStringLiteral("svn_import"), i18n("Import Repository"));
0093                 const QString exec = QLatin1String("kio_svn_helper -i ") + url;
0094                 action->setData(exec);
0095             }
0096             if (dbusActions.contains(QLatin1String("Switch"))) {
0097                 createActionWithExec(QStringLiteral("kdesvnswitch"), i18n("Switch..."), QLatin1String("switch"));
0098             }
0099             if (dbusActions.contains(QLatin1String("Merge"))) {
0100                 auto action = createAction(QStringLiteral("kdesvnmerge"), i18n("Merge..."));
0101                 const QString exec = QLatin1String("kio_svn_helper -m ") + url;
0102                 action->setData(exec);
0103             }
0104             if (dbusActions.contains(QLatin1String("Blame"))) {
0105                 createActionWithExec(QStringLiteral("kdesvnblame"), i18n("Blame..."), QLatin1String("blame"));
0106             }
0107             if (dbusActions.contains(QLatin1String("CreatePatch"))) {
0108                 auto action = createAction(QStringLiteral("kdesvn"), i18n("Create Patch..."));
0109                 const QString exec = QLatin1String("kio_svn_helper -p ") + url;
0110                 action->setData(exec);
0111             }
0112             if (dbusActions.contains(QLatin1String("Diff"))) {
0113                 createActionWithExec(QStringLiteral("kdesvndiff"), i18n("Diff (local)"), QLatin1String("diff"));
0114             }
0115             if (dbusActions.contains(QLatin1String("Tree"))) {
0116                 createActionWithExec(QStringLiteral("kdesvnlog"), i18n("Display revision tree"), QLatin1String("tree"));
0117             }
0118         } else {
0119             qWarning() << "Error when requesting kdesvn menu:" << reply.error();
0120         }
0121         return actions;
0122     }
0123 
0124     QList<QAction *> actions(const KFileItemListProperties &fileItemInfos, QWidget *parentWidget) override
0125     {
0126         QList<QAction *> actions = fetchActions(fileItemInfos, QStringLiteral("getTopLevelActionMenu"), parentWidget);
0127         auto menu = new QMenu(i18n("Subversion (kdesvn)"), parentWidget);
0128         menu->setIcon(QIcon::fromTheme(QStringLiteral("kdesvn")));
0129         auto submenuActions = fetchActions(fileItemInfos, QStringLiteral("getActionMenu"), menu);
0130         if (!submenuActions.isEmpty()) {
0131             menu->addActions(submenuActions);
0132             actions << menu->menuAction();
0133         }
0134         return actions;
0135     }
0136 };
0137 K_PLUGIN_CLASS_WITH_JSON(KdeSvnActionsPlugin, "kdesvnactionsplugin.json")
0138 
0139 #include "kdesvnactionsplugin.moc"