File indexing completed on 2024-05-19 05:45:41

0001 /*
0002 SPDX-FileCopyrightText: 2021 Hamed Masafi <hamed.masfi@gmail.com>
0003 
0004 SPDX-License-Identifier: GPL-3.0-or-later
0005 */
0006 
0007 #include "dolphinplugin.h"
0008 
0009 #include <KFileItem>
0010 #include <KLocalizedString>
0011 #include <KPluginFactory>
0012 #include <KProcess>
0013 
0014 #include <QMenu>
0015 
0016 #include <git2.h>
0017 
0018 #include "statuscache.h"
0019 
0020 K_PLUGIN_CLASS_WITH_JSON(DolphinPlugin, "komitdolphinplugin.json")
0021 
0022 DolphinPlugin::DolphinPlugin(QObject *parent, const QList<QVariant> &args)
0023     : KVersionControlPlugin{parent}
0024     , mCache{new StatusCache}
0025 {
0026     Q_UNUSED(args);
0027 
0028     git_libgit2_init();
0029 
0030     mMainActionGit = new QAction;
0031     mMainActionGit->setText(i18n("Kommit"));
0032     mMainActionGit->setIcon(QIcon::fromTheme(QStringLiteral("kommit")));
0033 
0034     mMainActionNonGit = new QAction;
0035     mMainActionNonGit->setText(i18n("Kommit"));
0036     mMainActionNonGit->setIcon(QIcon::fromTheme(QStringLiteral("kommit")));
0037 
0038 #define f(name, text, args, icon)                                                                                                                              \
0039     name = new QAction{text};                                                                                                                                  \
0040     if (!icon.isEmpty())                                                                                                                                       \
0041         name->setIcon(QIcon::fromTheme(icon));                                                                                                                 \
0042     connect(name, &QAction::triggered, this, &DolphinPlugin::name##Clicked);
0043 
0044     ACTIONS_FOR_EACH(f)
0045 #undef f
0046 
0047     auto gitMenu = new QMenu;
0048     gitMenu->addAction(actionOpen);
0049     gitMenu->addAction(actionPull);
0050     gitMenu->addAction(actionPush);
0051     gitMenu->addAction(actionFetch);
0052     gitMenu->addAction(actionCreateTag);
0053     gitMenu->addSeparator();
0054     gitMenu->addAction(actionModifications);
0055     gitMenu->addAction(actionDiff);
0056     gitMenu->addAction(actionDiffBranches);
0057     gitMenu->addSeparator();
0058     gitMenu->addAction(actionMerge);
0059     gitMenu->addAction(actionSwitchCheckout);
0060     gitMenu->addSeparator();
0061     gitMenu->addAction(actionIgnoreFile);
0062     gitMenu->addAction(actionCleanup);
0063     gitMenu->addAction(actionRemove);
0064     gitMenu->addAction(actionBlame);
0065     gitMenu->addAction(actionHistory);
0066     mMainActionGit->setMenu(gitMenu);
0067 
0068     auto nonGitMenu = new QMenu;
0069     nonGitMenu->addAction(actionInit);
0070     nonGitMenu->addAction(actionClone);
0071     mMainActionNonGit->setMenu(nonGitMenu);
0072 }
0073 
0074 DolphinPlugin::~DolphinPlugin()
0075 {
0076     git_libgit2_shutdown();
0077 }
0078 
0079 #define f(name, text, args, icon)                                                                                                                              \
0080     void DolphinPlugin::name##Clicked()                                                                                                                        \
0081     {                                                                                                                                                          \
0082         KProcess::startDetached(QStringLiteral("kommit"), args);                                                                                               \
0083     }
0084 
0085 ACTIONS_FOR_EACH(f)
0086 #undef f
0087 
0088 QString DolphinPlugin::fileName() const
0089 {
0090     return QLatin1String(".git");
0091 }
0092 
0093 bool DolphinPlugin::beginRetrieval(const QString &directory)
0094 {
0095     return mCache->setPath(directory);
0096 }
0097 
0098 void DolphinPlugin::endRetrieval()
0099 {
0100 }
0101 
0102 KVersionControlPlugin::ItemVersion DolphinPlugin::itemVersion(const KFileItem &item) const
0103 {
0104     if (!item.isLocalFile())
0105         return ItemVersion::NormalVersion;
0106 
0107     return mCache->status(item.name());
0108 }
0109 
0110 QList<QAction *> DolphinPlugin::versionControlActions(const KFileItemList &items) const
0111 {
0112     const_cast<DolphinPlugin *>(this)->mPath = items[0].url().toLocalFile();
0113     return QList<QAction *>() << mMainActionGit;
0114 }
0115 
0116 QList<QAction *> DolphinPlugin::outOfVersionControlActions(const KFileItemList &items) const
0117 {
0118     const_cast<DolphinPlugin *>(this)->mPath = items[0].url().toLocalFile();
0119     return {mMainActionNonGit};
0120 }
0121 
0122 #include "dolphinplugin.moc"