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"