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"