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 namespace std {
8 class mutex;
9 }
10 
11 class GitPackIdxV2;
12 struct GitPackIdxItem;
13 struct GitPackObject;
14 
16  friend class GitObjectCache;
17 private:
18  struct Private;
20 
21  static QByteArray applyDelta(QByteArray const *base, QByteArray const *delta);
22  static bool loadPackedObject(std::shared_ptr<GitPackIdxV2> const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPackObject *out);
23  bool extractObjectFromPackFile(std::shared_ptr<GitPackIdxV2> const &idx, GitPackIdxItem const *item, GitPackObject *out);
24  bool extractObjectFromPackFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type, std::mutex *mutex);
25  void loadIndexes(GitRunner g, std::mutex *mutex);
26  std::string findObjectPath(GitRunner g, const GitHash &id);
27  bool loadObject(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type);
28  void init();
29 public:
30  GitObjectManager(std::mutex *mutex);
31  GitObjectManager(GitObjectManager const &other);
35  void setup();
36  bool catFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type);
37  void clearIndexes();
38 
39  static std::vector<std::string> findObject(const std::string &id, const QString &repo_local_dir);
40 };
41 
43 public:
44  struct Item {
46  QByteArray ba;
48  };
49 private:
50  std::mutex *mutex_ = nullptr;
52  using ItemPtr = std::shared_ptr<Item>;
53  std::vector<ItemPtr> items_;
54  std::map<std::string, GitHash> rev_parse_map_;
55  size_t size() const;
56 public:
57  GitObjectCache(std::mutex *mutex = nullptr)
58  : mutex_(mutex)
59  , object_manager_(mutex)
60  {}
61  void clear();
62  GitHash rev_parse(GitRunner g, const std::string &name);
63  GitObject catFile(GitRunner g, const GitHash &id);
64 
65  GitHash const &item_id(int i) const
66  {
67  return items_[i]->id;
68  }
69 };
70 
71 class GitCommit {
72 public:
73  std::string tree_id;
74  std::vector<std::string> parents;
75 
76  static bool parseCommit(GitRunner g, GitObjectCache *objcache, GitHash const &id, GitCommit *out);
77 };
78 
79 struct GitTreeItem {
80  enum Type {
85  };
87  std::string name;
88  std::string id;
89  std::string mode;
90 
91  std::string to_string_() const;
92 };
93 
94 using GitTreeItemList = QList<GitTreeItem>;
95 
97 private:
100 
101  std::map<QString, GitTreeItem> blob_map;
102  std::map<QString, QString> tree_id_map;
103 
104  QString lookup_(GitRunner g, QString const &file, GitTreeItem *out);
105 public:
106  GitCommitTree(GitObjectCache *objcache);
107 
108  QString lookup(GitRunner g, QString const &file);
109  bool lookup(GitRunner g, QString const &file, GitTreeItem *out);
110 
111  void parseTree(GitRunner g, QString const &tree_id);
112  QString parseCommit(GitRunner g, const GitHash &commit_id);
113 
114  GitTreeItemList const *treelist() const
115  {
116  return &root_item_list_;
117  }
118 };
119 
120 GitTreeItemList parseGitTreeObject(QByteArray const &ba, std::string const &path_prefix);
121 bool parseGitTreeObject(GitRunner g, GitObjectCache *objcache, std::string const &commit_id, std::string const &path_prefix, GitTreeItemList *out);
122 
123 #endif // GITOBJECTMANAGER_H
QList< GitTreeItem > GitTreeItemList
Definition: GitObjectManager.h:94
GitTreeItemList parseGitTreeObject(QByteArray const &ba, std::string const &path_prefix)
Definition: GitObjectManager.cpp:457
Definition: GitObjectManager.h:96
GitCommitTree(GitObjectCache *objcache)
Definition: GitDiffManager.cpp:339
QString parseCommit(GitRunner g, const GitHash &commit_id)
Definition: GitDiffManager.cpp:425
GitTreeItemList const * treelist() const
Definition: GitObjectManager.h:114
GitTreeItemList root_item_list_
Definition: GitObjectManager.h:99
std::map< QString, GitTreeItem > blob_map
Definition: GitObjectManager.h:101
GitObjectCache * object_cache_
Definition: GitObjectManager.h:98
std::map< QString, QString > tree_id_map
Definition: GitObjectManager.h:102
QString lookup_(GitRunner g, QString const &file, GitTreeItem *out)
Definition: GitDiffManager.cpp:344
void parseTree(GitRunner g, QString const &tree_id)
Definition: GitDiffManager.cpp:420
QString lookup(GitRunner g, QString const &file)
Definition: GitDiffManager.cpp:400
Definition: GitObjectManager.h:71
static bool parseCommit(GitRunner g, GitObjectCache *objcache, GitHash const &id, GitCommit *out)
Definition: GitObjectManager.cpp:427
std::vector< std::string > parents
Definition: GitObjectManager.h:74
std::string tree_id
Definition: GitObjectManager.h:73
Definition: GitHash.h:9
Definition: GitObjectManager.h:42
GitObjectManager object_manager_
Definition: GitObjectManager.h:51
std::map< std::string, GitHash > rev_parse_map_
Definition: GitObjectManager.h:54
GitObject catFile(GitRunner g, const GitHash &id)
Definition: GitObjectManager.cpp:344
size_t size() const
Definition: GitObjectManager.cpp:291
GitHash rev_parse(GitRunner g, const std::string &name)
Definition: GitObjectManager.cpp:307
void clear()
Definition: GitObjectManager.cpp:300
std::vector< ItemPtr > items_
Definition: GitObjectManager.h:53
std::mutex * mutex_
Definition: GitObjectManager.h:50
GitObjectCache(std::mutex *mutex=nullptr)
Definition: GitObjectManager.h:57
GitHash const & item_id(int i) const
Definition: GitObjectManager.h:65
std::shared_ptr< Item > ItemPtr
Definition: GitObjectManager.h:52
Definition: GitObjectManager.h:15
~GitObjectManager()
Definition: GitObjectManager.cpp:40
bool catFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type)
Definition: GitObjectManager.cpp:281
static bool loadPackedObject(std::shared_ptr< GitPackIdxV2 > const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPackObject *out)
Definition: GitObjectManager.cpp:153
void loadIndexes(GitRunner g, std::mutex *mutex)
Definition: GitObjectManager.cpp:65
bool extractObjectFromPackFile(std::shared_ptr< GitPackIdxV2 > const &idx, GitPackIdxItem const *item, GitPackObject *out)
Definition: GitObjectManager.cpp:187
GitObjectManager(std::mutex *mutex)
Definition: GitObjectManager.cpp:27
bool loadObject(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type)
Definition: GitObjectManager.cpp:261
void clearIndexes()
Definition: GitObjectManager.cpp:89
Private * m
Definition: GitObjectManager.h:18
void init()
Definition: GitObjectManager.cpp:54
static QByteArray applyDelta(QByteArray const *base, QByteArray const *delta)
Definition: GitObjectManager.cpp:94
std::string findObjectPath(GitRunner g, const GitHash &id)
Definition: GitObjectManager.cpp:230
void setup()
Definition: GitObjectManager.cpp:60
GitObjectManager(GitObjectManager &&other)=delete
static std::vector< std::string > findObject(const std::string &id, const QString &repo_local_dir)
GitObjectManager::findObject.
Definition: GitObjectManager.cpp:509
GitObjectManager & operator=(GitObjectManager const &other)
Definition: GitObjectManager.cpp:45
Definition: GitPackIdxV2.h:21
Definition: GitRunner.h:21
Definition: GitObjectManager.h:7
Definition: GitObjectManager.h:44
QByteArray ba
Definition: GitObjectManager.h:46
GitObject::Type type
Definition: GitObjectManager.h:47
GitHash id
Definition: GitObjectManager.h:45
Definition: GitObjectManager.cpp:20
Definition: GitObject.h:7
Type
Definition: GitObject.h:8
Definition: GitPackIdxV2.h:11
Definition: GitPack.h:19
Definition: GitObjectManager.h:79
std::string mode
Definition: GitObjectManager.h:89
Type
Definition: GitObjectManager.h:80
@ TREE
Definition: GitObjectManager.h:82
@ UNKNOWN
Definition: GitObjectManager.h:81
@ COMMIT
Definition: GitObjectManager.h:84
@ BLOB
Definition: GitObjectManager.h:83
std::string to_string_() const
Definition: GitObjectManager.cpp:556
std::string name
Definition: GitObjectManager.h:87
std::string id
Definition: GitObjectManager.h:88
Type type
Definition: GitObjectManager.h:86