File indexing completed on 2024-05-19 04:47:12

0001 #pragma once
0002 #include <QObject>
0003 #include <QUrl>
0004 
0005 #include <QFutureWatcher>
0006 #include <libkommit/filestatus.h>
0007 
0008 #include <libkommit/commands/commandswitchbranch.h>
0009 
0010 #include <libkommit/commands/commandpull.h>
0011 
0012 class QFileSystemWatcher;
0013 class QTimer;
0014 
0015 namespace Git
0016 {
0017 class Manager;
0018 class LogsModel;
0019 class RemotesModel;
0020 }
0021 
0022 class StatusMessage : public QObject
0023 {
0024     Q_OBJECT
0025     Q_PROPERTY(StatusCode code MEMBER code CONSTANT FINAL)
0026     Q_PROPERTY(QString message MEMBER message CONSTANT FINAL)
0027 public:
0028     explicit StatusMessage(QObject *parent = nullptr);
0029 
0030     enum StatusCode
0031     {
0032         Loading,
0033         Ready,
0034         Error
0035     };  Q_ENUM(StatusCode)
0036 
0037     StatusCode code = StatusCode::Ready;
0038     QString message;
0039 };
0040 
0041 
0042 class Project : public QObject
0043 {
0044     Q_OBJECT
0045     Q_DISABLE_COPY(Project)
0046 
0047     Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged)
0048 
0049     Q_PROPERTY(StatusMessage* status READ status NOTIFY statusChanged FINAL)
0050 
0051     Q_PROPERTY(QString title READ getTitle NOTIFY titleChanged)
0052     Q_PROPERTY(QUrl logo READ getLogo NOTIFY logoChanged)
0053 
0054     Q_PROPERTY(QString currentBranch READ currentBranch WRITE setCurrentBranch NOTIFY currentBranchChanged)
0055 
0056     Q_PROPERTY(QVariantMap headBranch READ getHeadBranch NOTIFY headBranchChanged)
0057 
0058     Q_PROPERTY(Git::LogsModel *commitsModel READ getCommitsModel CONSTANT FINAL)
0059     Q_PROPERTY(QStringList repoStatus READ repoStatus NOTIFY repoStatusChanged)
0060     Q_PROPERTY(QUrl readmeFile READ readmeFile NOTIFY readmeFileChanged CONSTANT)
0061     Q_PROPERTY(Git::RemotesModel *remotesModel READ remotesModel CONSTANT FINAL)
0062 
0063     Q_PROPERTY(QStringList allBranches READ allBranches NOTIFY repoChanged)
0064     Q_PROPERTY(QStringList remoteBranches READ remoteBranches NOTIFY repoChanged)
0065 
0066 public:    
0067 
0068     Q_ENUM(Git::CommandSwitchBranch::Mode)
0069 
0070     explicit Project(QObject *parent = nullptr);
0071     ~Project();
0072 
0073     QString url() const;
0074 
0075     /**
0076      * @brief setUrl
0077      * @param url
0078      */
0079     void setUrl(const QString &url);
0080 
0081     [[nodiscard]] QString getTitle() const;
0082 
0083     QUrl getLogo() const;
0084 
0085     QString currentBranch() const;
0086     void setCurrentBranch(const QString &currentBranch);
0087 
0088     Git::LogsModel * getCommitsModel();
0089 
0090     QStringList repoStatus() const;
0091     QUrl readmeFile() const;
0092 
0093     Git::RemotesModel *remotesModel() const;
0094 
0095 
0096     QVariantMap getHeadBranch() const;
0097 
0098     StatusMessage* status() const;
0099 
0100     QStringList allBranches() const;
0101 
0102     QStringList remoteBranches() const;
0103 
0104 public Q_SLOTS:
0105     QString fileStatusIcon(const QString &file);
0106 
0107     QVariantMap commitAuthor(const QString &id);
0108     QVariantMap remoteInfo(const QString &remoteName);
0109 
0110     //Actions
0111     void clone(const QString &url);
0112 
0113     void checkout(const QString &target, const QString &remote = "", bool force = false, Git::CommandSwitchBranch::Mode mode = Git::CommandSwitchBranch::ExistingBranch);
0114     void stash();
0115     void stashPop();
0116 
0117     void pull(const QString &remote, const QString &branch, Git::CommandPull::Rebase rebase = Git::CommandPull::None, Git::CommandPull::FastForward fastforward = Git::CommandPull::Unset, bool squash = false, bool noCommit = false, bool prune = false, bool tags = false);
0118 
0119 private:
0120     Git::Manager *m_manager;
0121     QFutureWatcher<void> *m_cloneWatcher;
0122     QList<Git::FileStatus> m_filesStatus;
0123     QFileSystemWatcher *m_gitDirWacther;
0124     QTimer *m_watcherTimer;
0125 
0126     QString m_url;
0127     QString m_remoteUrl;
0128 
0129     QString m_title;
0130 
0131     QUrl m_logo;
0132 
0133     QString m_currentBranch;
0134 
0135     QStringList m_repoStatus;
0136 
0137     QUrl m_readmeFile;
0138 
0139     QVariantMap m_headBranch;
0140     StatusMessage *m_status;
0141 
0142     void setData(const QString &url);
0143     bool loadData();
0144 
0145     void setCurrentBranchRemote(const QString &currentBranch);
0146     void setHeadBranch();
0147 
0148     void setStatus(StatusMessage::StatusCode code, const QString &message);
0149     QString createHashLink(const QString &hash) const;
0150 
0151 Q_SIGNALS:
0152     void titleChanged(QString title);
0153     void logoChanged(QUrl logo);
0154     void urlChanged(QString url);
0155     void error(QString message);
0156     void currentBranchChanged(QString currentBranch);
0157     void repoStatusChanged(QStringList status);
0158     void readmeFileChanged(QUrl readmeFile);
0159     void currentBranchRemoteChanged(QVariantMap currentBranchRemote);
0160     void headBranchChanged(QVariantMap headBranch);
0161     void remoteUrlChanged(QString remoteUrl);
0162     void statusChanged();
0163     void repoChanged();
0164     void modelsChanged();
0165 
0166     void actionFinished(bool ok, const QString &message);
0167 };
0168 
0169 
0170