Guitar
GitObjectManager.h
Go to the documentation of this file.
1 #ifndef GITOBJECTMANAGER_H
2 #define GITOBJECTMANAGER_H
3 
4 #include "GitPack.h"
5 #include "GitPackIdxV2.h"
6 #include "common/joinpath.h"
7 #include <QMutex>
8 #include <QString>
9 #include <map>
10 #include <mutex>
11 
12 class GitPackIdxV2;
13 
14 class Git;
15 
17  friend class GitObjectCache;
18 private:
19  std::mutex *mutex_ = nullptr;
22  std::vector<GitPackIdxPtr> git_idx_list;
23 
24  static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out);
25  static bool loadPackedObject(GitPackIdxPtr const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPack::Object *out);
26  bool extractObjectFromPackFile(GitPackIdxPtr const &idx, GitPackIdxItem const *item, GitPack::Object *out);
27  bool extractObjectFromPackFile(GitRunner g, const Git::Hash &id, QByteArray *out, Git::Object::Type *type, std::mutex *mutex);
28  void loadIndexes(GitRunner g, std::mutex *mutex);
29  QString findObjectPath(GitRunner g, const Git::Hash &id);
30  bool loadObject(GitRunner g, const Git::Hash &id, QByteArray *out, Git::Object::Type *type);
31  void init();
32 public:
33  GitObjectManager(std::mutex *mutex);
34  void setup();
35  bool catFile(GitRunner g, const Git::Hash &id, QByteArray *out, Git::Object::Type *type);
36  void clearIndexes();
37 
38  static QStringList findObject(const QString &id, const QString &repo_local_dir);
39 };
40 
42 public:
43  struct Item {
45  QByteArray ba;
47  };
48 private:
49  std::mutex *mutex_ = nullptr;
51  using ItemPtr = std::shared_ptr<Item>;
52  std::vector<ItemPtr> items_;
53  std::map<QString, Git::Hash> rev_parse_map_;
54  size_t size() const;
55 public:
56  GitObjectCache(std::mutex *mutex = nullptr)
57  : mutex_(mutex)
58  , object_manager_(mutex)
59  {}
60  void clear();
61  Git::Hash revParse(GitRunner g, QString const &name);
62  Git::Object catFile(GitRunner g, const Git::Hash &id);
63 
64  Git::Hash const &item_id(int i) const
65  {
66  return items_[i]->id;
67  }
68 };
69 
70 class GitCommit {
71 public:
72  QString tree_id;
73  QStringList parents;
74 
75  static bool parseCommit(GitRunner g, GitObjectCache *objcache, Git::Hash const &id, GitCommit *out);
76 };
77 
78 struct GitTreeItem {
79  enum Type {
84  };
86  QString name;
87  QString id;
88  QString mode;
89 
90  QString to_string_() const
91  {
92  QString t;
93  switch (type) {
94  case TREE: t = "TREE"; break;
95  case BLOB: t = "BLOB"; break;
96  }
97  return QString("GitTreeItem:{ %1 %2 %3 %4 }").arg(t).arg(id).arg(mode).arg(name);
98  }
99 };
100 
101 using GitTreeItemList = QList<GitTreeItem>;
102 
104 private:
107 
108  std::map<QString, GitTreeItem> blob_map;
109  std::map<QString, QString> tree_id_map;
110 
111  QString lookup_(GitRunner g, QString const &file, GitTreeItem *out);
112 public:
114 
115  QString lookup(GitRunner g, QString const &file);
116  bool lookup(GitRunner g, QString const &file, GitTreeItem *out);
117 
118  void parseTree(GitRunner g, QString const &tree_id);
119  QString parseCommit(GitRunner g, const Git::Hash &commit_id);
120 
121  GitTreeItemList const *treelist() const
122  {
123  return &root_item_list;
124  }
125 };
126 
127 void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out);
128 bool parseGitTreeObject(GitRunner g, GitObjectCache *objcache, QString const &commit_id, QString const &path_prefix, GitTreeItemList *out);
129 
130 #endif // GITOBJECTMANAGER_H
void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out)
Definition: GitObjectManager.cpp:451
QList< GitTreeItem > GitTreeItemList
Definition: GitObjectManager.h:101
std::shared_ptr< GitPackIdxV2 > GitPackIdxPtr
Definition: GitPackIdxV2.h:68
Definition: GitObjectManager.h:103
GitCommitTree(GitObjectCache *objcache)
Definition: GitDiff.cpp:312
GitTreeItemList const * treelist() const
Definition: GitObjectManager.h:121
std::map< QString, GitTreeItem > blob_map
Definition: GitObjectManager.h:108
GitTreeItemList root_item_list
Definition: GitObjectManager.h:106
std::map< QString, QString > tree_id_map
Definition: GitObjectManager.h:109
QString parseCommit(GitRunner g, const Git::Hash &commit_id)
Definition: GitDiff.cpp:396
QString lookup_(GitRunner g, QString const &file, GitTreeItem *out)
Definition: GitDiff.cpp:317
void parseTree(GitRunner g, QString const &tree_id)
Definition: GitDiff.cpp:391
GitObjectCache * objcache
Definition: GitObjectManager.h:105
QString lookup(GitRunner g, QString const &file)
Definition: GitDiff.cpp:371
Definition: GitObjectManager.h:70
static bool parseCommit(GitRunner g, GitObjectCache *objcache, Git::Hash const &id, GitCommit *out)
Definition: GitObjectManager.cpp:421
QString tree_id
Definition: GitObjectManager.h:72
QStringList parents
Definition: GitObjectManager.h:73
Definition: GitObjectManager.h:41
GitObjectManager object_manager_
Definition: GitObjectManager.h:50
Git::Hash const & item_id(int i) const
Definition: GitObjectManager.h:64
size_t size() const
Definition: GitObjectManager.cpp:284
void clear()
Definition: GitObjectManager.cpp:293
std::vector< ItemPtr > items_
Definition: GitObjectManager.h:52
std::mutex * mutex_
Definition: GitObjectManager.h:49
std::map< QString, Git::Hash > rev_parse_map_
Definition: GitObjectManager.h:53
Git::Object catFile(GitRunner g, const Git::Hash &id)
Definition: GitObjectManager.cpp:339
GitObjectCache(std::mutex *mutex=nullptr)
Definition: GitObjectManager.h:56
std::shared_ptr< Item > ItemPtr
Definition: GitObjectManager.h:51
Git::Hash revParse(GitRunner g, QString const &name)
Definition: GitObjectManager.cpp:300
Definition: GitObjectManager.h:16
QString findObjectPath(GitRunner g, const Git::Hash &id)
Definition: GitObjectManager.cpp:197
void loadIndexes(GitRunner g, std::mutex *mutex)
Definition: GitObjectManager.cpp:33
QString subdir_git_objects_pack
Definition: GitObjectManager.h:21
GitObjectManager(std::mutex *mutex)
Definition: GitObjectManager.cpp:15
static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out)
Definition: GitObjectManager.cpp:62
void clearIndexes()
Definition: GitObjectManager.cpp:57
void init()
Definition: GitObjectManager.cpp:22
std::mutex * mutex_
Definition: GitObjectManager.h:19
std::vector< GitPackIdxPtr > git_idx_list
Definition: GitObjectManager.h:22
QString subdir_git_objects
Definition: GitObjectManager.h:20
static bool loadPackedObject(GitPackIdxPtr const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPack::Object *out)
Definition: GitObjectManager.cpp:119
void setup()
Definition: GitObjectManager.cpp:28
bool extractObjectFromPackFile(GitPackIdxPtr const &idx, GitPackIdxItem const *item, GitPack::Object *out)
Definition: GitObjectManager.cpp:154
bool loadObject(GitRunner g, const Git::Hash &id, QByteArray *out, Git::Object::Type *type)
Definition: GitObjectManager.cpp:241
static QStringList findObject(const QString &id, const QString &repo_local_dir)
GitObjectManager::findObject.
Definition: GitObjectManager.cpp:502
bool catFile(GitRunner g, const Git::Hash &id, QByteArray *out, Git::Object::Type *type)
Definition: GitObjectManager.cpp:274
Definition: GitPackIdxV2.h:20
Definition: Git.h:740
Definition: Git.h:43
Definition: Git.h:38
Definition: GitObjectManager.h:43
QByteArray ba
Definition: GitObjectManager.h:45
Git::Object::Type type
Definition: GitObjectManager.h:46
Git::Hash id
Definition: GitObjectManager.h:44
Definition: GitPackIdxV2.h:10
Definition: GitPack.h:19
Definition: GitObjectManager.h:78
QString mode
Definition: GitObjectManager.h:88
Type
Definition: GitObjectManager.h:79
@ TREE
Definition: GitObjectManager.h:81
@ UNKNOWN
Definition: GitObjectManager.h:80
@ COMMIT
Definition: GitObjectManager.h:83
@ BLOB
Definition: GitObjectManager.h:82
QString name
Definition: GitObjectManager.h:86
QString id
Definition: GitObjectManager.h:87
QString to_string_() const
Definition: GitObjectManager.h:90
Type type
Definition: GitObjectManager.h:85
Definition: Git.h:74
Type
Definition: Git.h:75