Guitar
GitObjectManager.h
Go to the documentation of this file.
1 #ifndef GITOBJECTMANAGER_H
2 #define GITOBJECTMANAGER_H
3 
4 #include "GitRunner.h"
5 
6 class GitPackIdxV2;
7 struct GitPackIdxItem;
8 struct GitPackObject;
9 
11  friend class GitObjectCache;
12 private:
13  struct Private;
15 
16  static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out);
17  static bool loadPackedObject(std::shared_ptr<GitPackIdxV2> const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPackObject *out);
18  bool extractObjectFromPackFile(std::shared_ptr<GitPackIdxV2> const &idx, GitPackIdxItem const *item, GitPackObject *out);
19  bool extractObjectFromPackFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type, std::mutex *mutex);
20  void loadIndexes(GitRunner g, std::mutex *mutex);
21  QString findObjectPath(GitRunner g, const GitHash &id);
22  bool loadObject(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type);
23  void init();
24 public:
25  GitObjectManager(std::mutex *mutex);
26  GitObjectManager(GitObjectManager const &other);
30  void setup();
31  bool catFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type);
32  void clearIndexes();
33 
34  static QStringList findObject(const QString &id, const QString &repo_local_dir);
35 };
36 
38 public:
39  struct Item {
41  QByteArray ba;
43  };
44 private:
45  std::mutex *mutex_ = nullptr;
47  using ItemPtr = std::shared_ptr<Item>;
48  std::vector<ItemPtr> items_;
49  std::map<QString, GitHash> rev_parse_map_;
50  size_t size() const;
51 public:
52  GitObjectCache(std::mutex *mutex = nullptr)
53  : mutex_(mutex)
54  , object_manager_(mutex)
55  {}
56  void clear();
57  GitHash revParse(GitRunner g, QString const &name);
58  GitObject catFile(GitRunner g, const GitHash &id);
59 
60  GitHash const &item_id(int i) const
61  {
62  return items_[i]->id;
63  }
64 };
65 
66 class GitCommit {
67 public:
68  QString tree_id;
69  QStringList parents;
70 
71  static bool parseCommit(GitRunner g, GitObjectCache *objcache, GitHash const &id, GitCommit *out);
72 };
73 
74 struct GitTreeItem {
75  enum Type {
80  };
82  QString name;
83  QString id;
84  QString mode;
85 
86  QString to_string_() const
87  {
88  QString t;
89  switch (type) {
90  case TREE: t = "TREE"; break;
91  case BLOB: t = "BLOB"; break;
92  }
93  return QString("GitTreeItem:{ %1 %2 %3 %4 }").arg(t).arg(id).arg(mode).arg(name);
94  }
95 };
96 
97 using GitTreeItemList = QList<GitTreeItem>;
98 
100 private:
103 
104  std::map<QString, GitTreeItem> blob_map;
105  std::map<QString, QString> tree_id_map;
106 
107  QString lookup_(GitRunner g, QString const &file, GitTreeItem *out);
108 public:
110 
111  QString lookup(GitRunner g, QString const &file);
112  bool lookup(GitRunner g, QString const &file, GitTreeItem *out);
113 
114  void parseTree(GitRunner g, QString const &tree_id);
115  QString parseCommit(GitRunner g, const GitHash &commit_id);
116 
117  GitTreeItemList const *treelist() const
118  {
119  return &root_item_list;
120  }
121 };
122 
123 void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out);
124 bool parseGitTreeObject(GitRunner g, GitObjectCache *objcache, QString const &commit_id, QString const &path_prefix, GitTreeItemList *out);
125 
126 #endif // GITOBJECTMANAGER_H
void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out)
Definition: GitObjectManager.cpp:450
QList< GitTreeItem > GitTreeItemList
Definition: GitObjectManager.h:97
Definition: GitObjectManager.h:99
GitCommitTree(GitObjectCache *objcache)
Definition: GitDiffManager.cpp:330
QString parseCommit(GitRunner g, const GitHash &commit_id)
Definition: GitDiffManager.cpp:414
GitTreeItemList const * treelist() const
Definition: GitObjectManager.h:117
std::map< QString, GitTreeItem > blob_map
Definition: GitObjectManager.h:104
GitTreeItemList root_item_list
Definition: GitObjectManager.h:102
std::map< QString, QString > tree_id_map
Definition: GitObjectManager.h:105
QString lookup_(GitRunner g, QString const &file, GitTreeItem *out)
Definition: GitDiffManager.cpp:335
void parseTree(GitRunner g, QString const &tree_id)
Definition: GitDiffManager.cpp:409
GitObjectCache * objcache
Definition: GitObjectManager.h:101
QString lookup(GitRunner g, QString const &file)
Definition: GitDiffManager.cpp:389
Definition: GitObjectManager.h:66
static bool parseCommit(GitRunner g, GitObjectCache *objcache, GitHash const &id, GitCommit *out)
Definition: GitObjectManager.cpp:420
QString tree_id
Definition: GitObjectManager.h:68
QStringList parents
Definition: GitObjectManager.h:69
Definition: GitTypes.h:32
Definition: GitObjectManager.h:37
GitObjectManager object_manager_
Definition: GitObjectManager.h:46
GitHash revParse(GitRunner g, QString const &name)
Definition: GitObjectManager.cpp:301
GitObject catFile(GitRunner g, const GitHash &id)
Definition: GitObjectManager.cpp:338
size_t size() const
Definition: GitObjectManager.cpp:285
void clear()
Definition: GitObjectManager.cpp:294
std::vector< ItemPtr > items_
Definition: GitObjectManager.h:48
std::mutex * mutex_
Definition: GitObjectManager.h:45
std::map< QString, GitHash > rev_parse_map_
Definition: GitObjectManager.h:49
GitObjectCache(std::mutex *mutex=nullptr)
Definition: GitObjectManager.h:52
GitHash const & item_id(int i) const
Definition: GitObjectManager.h:60
std::shared_ptr< Item > ItemPtr
Definition: GitObjectManager.h:47
Definition: GitObjectManager.h:10
~GitObjectManager()
Definition: GitObjectManager.cpp:35
bool catFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type)
Definition: GitObjectManager.cpp:275
static bool loadPackedObject(std::shared_ptr< GitPackIdxV2 > const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPackObject *out)
Definition: GitObjectManager.cpp:146
void loadIndexes(GitRunner g, std::mutex *mutex)
Definition: GitObjectManager.cpp:60
bool extractObjectFromPackFile(std::shared_ptr< GitPackIdxV2 > const &idx, GitPackIdxItem const *item, GitPackObject *out)
Definition: GitObjectManager.cpp:181
GitObjectManager(std::mutex *mutex)
Definition: GitObjectManager.cpp:22
bool loadObject(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type)
Definition: GitObjectManager.cpp:255
static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out)
Definition: GitObjectManager.cpp:89
void clearIndexes()
Definition: GitObjectManager.cpp:84
Private * m
Definition: GitObjectManager.h:13
void init()
Definition: GitObjectManager.cpp:49
void setup()
Definition: GitObjectManager.cpp:55
GitObjectManager(GitObjectManager &&other)=delete
QString findObjectPath(GitRunner g, const GitHash &id)
Definition: GitObjectManager.cpp:224
GitObjectManager & operator=(GitObjectManager const &other)
Definition: GitObjectManager.cpp:40
static QStringList findObject(const QString &id, const QString &repo_local_dir)
GitObjectManager::findObject.
Definition: GitObjectManager.cpp:501
Definition: GitPackIdxV2.h:20
Definition: GitRunner.h:11
Definition: GitObjectManager.h:39
QByteArray ba
Definition: GitObjectManager.h:41
GitObject::Type type
Definition: GitObjectManager.h:42
GitHash id
Definition: GitObjectManager.h:40
Definition: GitObjectManager.cpp:15
Definition: GitTypes.h:78
Type
Definition: GitTypes.h:79
Definition: GitPackIdxV2.h:10
Definition: GitPack.h:18
Definition: GitObjectManager.h:74
QString mode
Definition: GitObjectManager.h:84
Type
Definition: GitObjectManager.h:75
@ TREE
Definition: GitObjectManager.h:77
@ UNKNOWN
Definition: GitObjectManager.h:76
@ COMMIT
Definition: GitObjectManager.h:79
@ BLOB
Definition: GitObjectManager.h:78
QString name
Definition: GitObjectManager.h:82
QString id
Definition: GitObjectManager.h:83
QString to_string_() const
Definition: GitObjectManager.h:86
Type type
Definition: GitObjectManager.h:81