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