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  std::string 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 std::vector<std::string> findObject(const std::string &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<std::string, 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 rev_parse(GitRunner g, const std::string &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  std::string tree_id;
70  std::vector<std::string> 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  std::string name;
84  std::string id;
85  std::string mode;
86 
87  std::string to_string_() const;
88 };
89 
90 using GitTreeItemList = QList<GitTreeItem>;
91 
93 private:
96 
97  std::map<QString, GitTreeItem> blob_map;
98  std::map<QString, QString> tree_id_map;
99 
100  QString lookup_(GitRunner g, QString const &file, GitTreeItem *out);
101 public:
103 
104  QString lookup(GitRunner g, QString const &file);
105  bool lookup(GitRunner g, QString const &file, GitTreeItem *out);
106 
107  void parseTree(GitRunner g, QString const &tree_id);
108  QString parseCommit(GitRunner g, const GitHash &commit_id);
109 
110  GitTreeItemList const *treelist() const
111  {
112  return &root_item_list;
113  }
114 };
115 
116 void parseGitTreeObject(QByteArray const &ba, std::string const &path_prefix, GitTreeItemList *out);
117 bool parseGitTreeObject(GitRunner g, GitObjectCache *objcache, std::string const &commit_id, std::string const &path_prefix, GitTreeItemList *out);
118 
119 #endif // GITOBJECTMANAGER_H
QList< GitTreeItem > GitTreeItemList
Definition: GitObjectManager.h:90
void parseGitTreeObject(QByteArray const &ba, std::string const &path_prefix, GitTreeItemList *out)
Definition: GitObjectManager.cpp:456
Definition: GitObjectManager.h:92
GitCommitTree(GitObjectCache *objcache)
Definition: GitDiffManager.cpp:338
QString parseCommit(GitRunner g, const GitHash &commit_id)
Definition: GitDiffManager.cpp:424
GitTreeItemList const * treelist() const
Definition: GitObjectManager.h:110
std::map< QString, GitTreeItem > blob_map
Definition: GitObjectManager.h:97
GitTreeItemList root_item_list
Definition: GitObjectManager.h:95
std::map< QString, QString > tree_id_map
Definition: GitObjectManager.h:98
QString lookup_(GitRunner g, QString const &file, GitTreeItem *out)
Definition: GitDiffManager.cpp:343
void parseTree(GitRunner g, QString const &tree_id)
Definition: GitDiffManager.cpp:419
GitObjectCache * objcache
Definition: GitObjectManager.h:94
QString lookup(GitRunner g, QString const &file)
Definition: GitDiffManager.cpp:399
Definition: GitObjectManager.h:67
static bool parseCommit(GitRunner g, GitObjectCache *objcache, GitHash const &id, GitCommit *out)
Definition: GitObjectManager.cpp:426
std::vector< std::string > parents
Definition: GitObjectManager.h:70
std::string tree_id
Definition: GitObjectManager.h:69
Definition: GitTypes.h:31
Definition: GitObjectManager.h:38
GitObjectManager object_manager_
Definition: GitObjectManager.h:47
std::map< std::string, GitHash > rev_parse_map_
Definition: GitObjectManager.h:50
GitObject catFile(GitRunner g, const GitHash &id)
Definition: GitObjectManager.cpp:343
size_t size() const
Definition: GitObjectManager.cpp:290
GitHash rev_parse(GitRunner g, const std::string &name)
Definition: GitObjectManager.cpp:306
void clear()
Definition: GitObjectManager.cpp:299
std::vector< ItemPtr > items_
Definition: GitObjectManager.h:49
std::mutex * mutex_
Definition: GitObjectManager.h:46
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:40
bool catFile(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type)
Definition: GitObjectManager.cpp:280
static bool loadPackedObject(std::shared_ptr< GitPackIdxV2 > const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPackObject *out)
Definition: GitObjectManager.cpp:151
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:186
GitObjectManager(std::mutex *mutex)
Definition: GitObjectManager.cpp:27
bool loadObject(GitRunner g, const GitHash &id, QByteArray *out, GitObject::Type *type)
Definition: GitObjectManager.cpp:260
static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out)
Definition: GitObjectManager.cpp:94
void clearIndexes()
Definition: GitObjectManager.cpp:89
Private * m
Definition: GitObjectManager.h:14
void init()
Definition: GitObjectManager.cpp:54
std::string findObjectPath(GitRunner g, const GitHash &id)
Definition: GitObjectManager.cpp:229
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:507
GitObjectManager & operator=(GitObjectManager const &other)
Definition: GitObjectManager.cpp:45
Definition: GitPackIdxV2.h:20
Definition: GitRunner.h:13
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:20
Definition: GitTypes.h:84
Type
Definition: GitTypes.h:85
Definition: GitPackIdxV2.h:10
Definition: GitPack.h:18
Definition: GitObjectManager.h:75
std::string 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
std::string to_string_() const
Definition: GitObjectManager.cpp:554
std::string name
Definition: GitObjectManager.h:83
std::string id
Definition: GitObjectManager.h:84
Type type
Definition: GitObjectManager.h:82