File indexing completed on 2024-05-05 16:46:07

0001 /*
0002     SPDX-FileCopyrightText: 2010 Morten Danielsen Volden
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef KDEVPERFORCEPLUGIN_H
0008 #define KDEVPERFORCEPLUGIN_H
0009 
0010 #include <vcs/interfaces/icentralizedversioncontrol.h>
0011 #include <interfaces/iplugin.h>
0012 #include <outputview/outputjob.h>
0013 
0014 
0015 #include <QVariantList>
0016 #include <QString>
0017 
0018 #include <memory>
0019 
0020 class QFileInfo;
0021 
0022 
0023 namespace KDevelop
0024 {
0025 class VcsPluginHelper;
0026 class DVcsJob;
0027 }
0028 
0029 
0030 class PerforcePlugin : public KDevelop::IPlugin, public KDevelop::ICentralizedVersionControl
0031 {
0032     Q_OBJECT
0033     Q_INTERFACES(KDevelop::IBasicVersionControl KDevelop::ICentralizedVersionControl)
0034 
0035     friend class PerforcePluginTest;
0036 public:
0037     explicit PerforcePlugin(QObject* parent, const QVariantList & = QVariantList());
0038     ~PerforcePlugin() override;
0039 
0040     //@{
0041     /** Methods inherited from KDevelop::IBasicVersionControl */
0042     QString name() const override;
0043 
0044     KDevelop::VcsImportMetadataWidget* createImportMetadataWidget(QWidget* parent) override;
0045 
0046     bool isValidRemoteRepositoryUrl(const QUrl& remoteLocation) override;
0047     bool isVersionControlled(const QUrl& localLocation) override;
0048 
0049     KDevelop::VcsJob* repositoryLocation(const QUrl& localLocation) override;
0050 
0051     KDevelop::VcsJob* add(const QList<QUrl>& localLocations,
0052                           RecursionMode recursion = IBasicVersionControl::Recursive) override;
0053     KDevelop::VcsJob* remove(const QList<QUrl>& localLocations) override;
0054 
0055     KDevelop::VcsJob* copy(const QUrl& localLocationSrc,
0056                            const QUrl& localLocationDstn) override;
0057     KDevelop::VcsJob* move(const QUrl& localLocationSrc,
0058                            const QUrl& localLocationDst) override;
0059     KDevelop::VcsJob* status(const QList<QUrl>& localLocations,
0060                              RecursionMode recursion = IBasicVersionControl::Recursive) override;
0061 
0062     KDevelop::VcsJob* revert(const QList<QUrl>& localLocations,
0063                              RecursionMode recursion = IBasicVersionControl::Recursive) override;
0064 
0065     KDevelop::VcsJob* update(const QList<QUrl>& localLocations,
0066                              const KDevelop::VcsRevision& rev = KDevelop::VcsRevision::createSpecialRevision(KDevelop::VcsRevision::Head),
0067                              KDevelop::IBasicVersionControl::RecursionMode recursion = KDevelop::IBasicVersionControl::Recursive) override;
0068 
0069     KDevelop::VcsJob* commit(const QString& message,
0070                              const QList<QUrl>& localLocations,
0071                              KDevelop::IBasicVersionControl::RecursionMode recursion = KDevelop::IBasicVersionControl::Recursive) override;
0072 
0073     KDevelop::VcsJob* diff(const QUrl& fileOrDirectory,
0074                            const KDevelop::VcsRevision& srcRevision,
0075                            const KDevelop::VcsRevision& dstRevision,
0076                            KDevelop::IBasicVersionControl::RecursionMode recursion = KDevelop::IBasicVersionControl::Recursive) override;
0077 
0078     KDevelop::VcsJob* log(const QUrl& localLocation,
0079                           const KDevelop::VcsRevision& rev,
0080                           unsigned long limit = 0) override;
0081 
0082     KDevelop::VcsJob* log(const QUrl& localLocation,
0083                           const KDevelop::VcsRevision& rev = KDevelop::VcsRevision::createSpecialRevision(KDevelop::VcsRevision::Base),
0084                           const KDevelop::VcsRevision& limit = KDevelop::VcsRevision::createSpecialRevision(KDevelop::VcsRevision::Start)) override;
0085 
0086     KDevelop::VcsJob* annotate(const QUrl& localLocation,
0087                                const KDevelop::VcsRevision& rev = KDevelop::VcsRevision::createSpecialRevision(KDevelop::VcsRevision::Head)) override;
0088 
0089     KDevelop::VcsJob* resolve(const QList<QUrl>& localLocations,
0090                               KDevelop::IBasicVersionControl::RecursionMode recursion) override;
0091 
0092     KDevelop::VcsJob* createWorkingCopy(const  KDevelop::VcsLocation & sourceRepository,
0093                                         const QUrl & destinationDirectory,
0094                                         KDevelop::IBasicVersionControl::RecursionMode recursion = IBasicVersionControl::Recursive) override;
0095 
0096 
0097     KDevelop::VcsLocationWidget* vcsLocation(QWidget* parent) const override;
0098     //@}
0099 
0100     //@{
0101     /** Methods inherited from KDevelop::ICentralizedVersionControl  */
0102     KDevelop::VcsJob* edit(const QUrl& localLocation) override;
0103 
0104     KDevelop::VcsJob* unedit(const QUrl& localLocation) override;
0105 
0106     KDevelop::VcsJob* localRevision(const QUrl& localLocation,
0107                                     KDevelop::VcsRevision::RevisionType) override;
0108 
0109     KDevelop::VcsJob* import(const QString & commitMessage,
0110                              const QUrl & sourceDirectory,
0111                              const  KDevelop::VcsLocation & destinationRepository) override;
0112     //@}
0113 
0114     /// This plugin implements its own edit method
0115     KDevelop::VcsJob* edit(const QList<QUrl>& localLocations);
0116 
0117 
0118     KDevelop::ContextMenuExtension contextMenuExtension(KDevelop::Context* context, QWidget* parent) override;
0119 
0120 
0121 public Q_SLOTS:
0122 
0123     /// invoked by context-menu
0124     void ctxEdit();
0125 //   void ctxUnedit();
0126 //   void ctxLocalRevision();
0127 //   void ctxImport();
0128 
0129 private Q_SLOTS:
0130     void parseP4StatusOutput(KDevelop::DVcsJob* job);
0131     void parseP4DiffOutput(KDevelop::DVcsJob* job);
0132     void parseP4LogOutput(KDevelop::DVcsJob* job);
0133     void parseP4AnnotateOutput(KDevelop::DVcsJob* job);
0134 
0135 
0136 
0137 private:
0138     bool isValidDirectory(const QUrl & dirPath);
0139     KDevelop::DVcsJob* p4fstatJob(const QFileInfo& curFile,
0140                                   KDevelop::OutputJob::OutputJobVerbosity verbosity = KDevelop::OutputJob::Verbose);
0141 
0142     bool parseP4fstat(const QFileInfo& curFile,
0143                       KDevelop::OutputJob::OutputJobVerbosity verbosity = KDevelop::OutputJob::Verbose);
0144 
0145     KDevelop::VcsJob* errorsFound(const QString& error,
0146                                   KDevelop::OutputJob::OutputJobVerbosity verbosity = KDevelop::OutputJob::Verbose);
0147 
0148     QString getRepositoryName(const QFileInfo& curFile);
0149 
0150 
0151     void setEnvironmentForJob(KDevelop::DVcsJob* job, QFileInfo const& fsObject);
0152     QList<QVariant> getQvariantFromLogOutput(QStringList const& outputLines);
0153 
0154     std::unique_ptr<KDevelop::VcsPluginHelper> m_common;
0155     QString m_perforceConfigName;
0156     QString m_perforceExecutable;
0157     QAction* m_edit_action;
0158 };
0159 
0160 #endif // PERFORCEPLUGIN_H