/* Copyright 2018-2019 WobLight * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ADDON_H #define ADDON_H #include #include #include #include #include #include #include #include "utils.h" #include #include class git_repository; class git_reference; using repo_p = std::unique_ptr; class QThreadPool; class Addon : public QObject { Q_OBJECT using TaskQueue = QQueue>>; TaskQueue m_tasks; QString m_name; repo_p m_repo; QStringList m_branches; QString m_currentBranch; QString m_remote; QStringList m_remotes; int m_progress; int m_total; QString m_path; QMutex m_mutex; QWaitCondition m_wait; void *m_result; bool m_lock = false; public: Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QStringList branches READ branches WRITE setBranches NOTIFY branchesChanged) Q_PROPERTY(QString currentBranch READ currentBranch WRITE setCurrentBranch NOTIFY currentBranchChanged) Q_PROPERTY(QString remote READ remote WRITE setRemote NOTIFY remoteChanged) Q_PROPERTY(QStringList remotes READ remotes WRITE setRemotes NOTIFY remotesChanged) Q_PROPERTY(int progress READ progress WRITE setProgress NOTIFY progressChanged) Q_PROPERTY(int total READ total WRITE setTotal NOTIFY totalChanged) Q_PROPERTY(QStringList subfolders READ subfolders WRITE setSubfolders NOTIFY subfoldersChanged) Q_PROPERTY(QString filesToRemove READ filesToRemove WRITE setFilesToRemove NOTIFY filesToRemoveChanged) Q_PROPERTY(QString readme READ readme WRITE setReadme NOTIFY readmeChanged) Q_PROPERTY(QString path READ path) enum class Status { Error = -1, Ready, Busy }; Q_ENUM(Status) Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged) enum GitStatusFlag { Error = 0x1, UpToDate = 0x2, Ahead = 0x4, Behind = 0x8, Diverged = 0x10, FastForward = 0x20, Merge = 0x40, Conflict = 0x80, MergeStatusMask = 0x0C00 }; Q_ENUM(GitStatusFlag) Q_DECLARE_FLAGS(GitStatus, GitStatusFlag) Q_PROPERTY(GitStatus gitStatus READ gitStatus WRITE setGitStatus NOTIFY gitStatusChanged) Q_FLAGS(GitStatus) explicit Addon(QString name, git_repository *repo, QString path, QObject *parent = nullptr); QString name() const; QStringList branches() const; QString currentBranch() const; QString remote() const; QStringList remotes() const; int progress() const; int total() const; Status status() const; GitStatus gitStatus() const; QStringList subfolders() const; QString filesToRemove() const; QString readme() const; QString path() const; Q_INVOKABLE QUrl getUrl(QString name = QString()) const; private: Status m_status; GitStatus m_gitStatus; QStringList m_subfolders; void closeRepo(); void openRepo(); AutoPtr remoteRefForBranch(QString name); AutoPtr branchRef(QString name); void delegate(QString taskname, auto work, auto callback, bool force); void delegate(QString taskname, auto work, bool force); void delegate(QString taskname, auto work, auto callback); void delegate(QString taskname, auto work); QThreadPool *m_pool; bool removeFolders(QStringList paths, bool ask = true); bool removeFolder(QString path, bool ask = true); QString m_filesToRemove; QString m_readme; signals: void nameChanged(QString name); void branchesChanged(QStringList branches); void currentBranchChanged(QString currentBranch); void remoteChanged(QString remote); void remotesChanged(QStringList remotes); void progressChanged(int progress); void totalChanged(int total); void statusChanged(Status status); void gitStatusChanged(GitStatus gitStatus); void subfoldersChanged(QStringList subfolders); void filesToRemoveChanged(QString filesToRemove); void readmeChanged(QString readme); void pathChanged(QString path); public slots: void setName(QString name); void setRemoteUrl(QString newUrl); void update(); void scanBranches(); void scanSubfolders(); void setBranches(QStringList branches); void setCurrentBranch(QString currentBranch); void setRemote(QString remote); void setRemotes(QStringList remotes); void fetchRemote(QString remote); void setProgress(int progress); void setTotal(int total); void setStatus(Status status); void setGitStatus(GitStatus gitStatus); void updateGitStatus(); void uninstall(); void setSubfolders(QStringList subfolders); void removeSubfolders(); void unpackSubfolders(); void setFilesToRemove(QString filesToRemove); void confirmFileRemove(bool confirmed); void reset(); void reclone(); void loadReadme(); void setReadme(QString readme); QFuture updateIfBehind(); }; Q_DECLARE_OPERATORS_FOR_FLAGS(Addon::GitStatus) #endif // ADDON_H