Guitar
GitObjectManager.h
Go to the documentation of this file.
1 #ifndef GITOBJECTMANAGER_H
2 #define GITOBJECTMANAGER_H
3 
4 #include <QMutex>
5 #include <QString>
6 #include "GitPack.h"
7 #include "GitPackIdxV2.h"
8 #include <map>
9 #include "common/joinpath.h"
10 
11 class GitPackIdxV2;
12 
13 class Git;
14 using GitPtr = std::shared_ptr<Git>;
15 
17  friend class GitObjectCache;
18 private:
20  QMutex mutex;
23  std::vector<GitPackIdxPtr> git_idx_list;
24 
25  QString workingDir();
26 
27  static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out);
28  static bool loadPackedObject(GitPackIdxPtr const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPack::Object *out);
29  bool extractObjectFromPackFile(GitPackIdxPtr const &idx, GitPackIdxItem const *item, GitPack::Object *out);
30  bool extractObjectFromPackFile(const Git::CommitID &id, QByteArray *out, Git::Object::Type *type);
31  void loadIndexes();
32  QString findObjectPath(const Git::CommitID &id);
33  bool loadObject(const Git::CommitID &id, QByteArray *out, Git::Object::Type *type);
35  {
36  return g->dup();
37  }
38  GitPtr git(Git::SubmoduleItem const &submod)
39  {
40  GitPtr g2 = g->dup();
41  g2->setWorkingRepositoryDir(g->workingDir(), submod.path, g->sshKey());
42  return g2;
43  }
44  void init();
45 public:
48  void setup(GitPtr g);
49  bool catFile(const Git::CommitID &id, QByteArray *out, Git::Object::Type *type);
50  void clearIndexes();
51 
52  static QStringList findObject(const QString &id, const QString &repo_local_dir);
53 };
54 
56 public:
57  struct Item {
59  QByteArray ba;
61  };
62 private:
64  using ItemPtr = std::shared_ptr<Item>;
65  std::vector<ItemPtr> items;
66  std::map<QString, Git::CommitID> revparsemap;
67  size_t size() const;
68 public:
70  {
71  return object_manager.git();
72  }
73  GitPtr git(Git::SubmoduleItem const &submod)
74  {
75  return object_manager.git(submod);
76  }
77 
78  void setup(GitPtr g);
79  Git::CommitID revParse(QString const &name);
81  Git::CommitID getCommitIdFromTag(const QString &tag);
82 
83  Git::CommitID const &item_id(int i) const
84  {
85  return items[i]->id;
86  }
87 };
88 
89 class GitCommit {
90 public:
91  QString tree_id;
92  QStringList parents;
93 
94  static bool parseCommit(GitObjectCache *objcache, Git::CommitID const &id, GitCommit *out);
95 };
96 
97 struct GitTreeItem {
98  enum Type {
103  };
105  QString name;
106  QString id;
107  QString mode;
108 
109  QString to_string_() const
110  {
111  QString t;
112  switch (type) {
113  case TREE: t = "TREE"; break;
114  case BLOB: t = "BLOB"; break;
115  }
116  return QString("GitTreeItem:{ %1 %2 %3 %4 }").arg(t).arg(id).arg(mode).arg(name);
117  }
118 };
119 
120 using GitTreeItemList = QList<GitTreeItem>;
121 
123 private:
126 
127  std::map<QString, GitTreeItem> blob_map;
128  std::map<QString, QString> tree_id_map;
129 
130  GitPtr git();
131 
132  QString lookup_(QString const &file, GitTreeItem *out);
133 public:
135 
136  QString lookup(QString const &file);
137  bool lookup(QString const &file, GitTreeItem *out);
138 
139  void parseTree(QString const &tree_id);
140  QString parseCommit(QString const &commit_id);
141 
142  GitTreeItemList const *treelist() const
143  {
144  return &root_item_list;
145  }
146 };
147 
148 QString lookupFileID(GitObjectCache *objcache, QString const &commit_id, QString const &file);
149 
150 void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out);
151 bool parseGitTreeObject(GitObjectCache *objcache, QString const &commit_id, QString const &path_prefix, GitTreeItemList *out);
152 
153 
154 #endif // GITOBJECTMANAGER_H
GitObjectCache::Item::id
Git::CommitID id
Definition: GitObjectManager.h:58
GitPack::stripHeader
static Git::Object::Type stripHeader(QByteArray *out)
Definition: GitPack.cpp:52
Git::Object::type
Type type
Definition: Git.h:84
parseGitTreeObject
void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out)
Definition: GitObjectManager.cpp:407
GitPackIdxPtr
std::shared_ptr< GitPackIdxV2 > GitPackIdxPtr
Definition: GitPackIdxV2.h:68
misc::splitWords
static QStringList splitWords(QString const &text)
文字列を単語に分割する。
Definition: misc.cpp:162
GitTreeItem::Type
Type
Definition: GitObjectManager.h:98
GitPack::decodeTree
static void decodeTree(QByteArray *out)
Definition: GitPack.cpp:7
GitCommitTree::tree_id_map
std::map< QString, QString > tree_id_map
Definition: GitObjectManager.h:128
GitCommitTree::treelist
const GitTreeItemList * treelist() const
Definition: GitObjectManager.h:142
GitPtr
std::shared_ptr< Git > GitPtr
Definition: Git.h:38
GitPack::seekPackedObject
static bool seekPackedObject(QIODevice *file, GitPackIdxItem const *item, Info *out)
Definition: GitPack.cpp:152
Git::Object::Type::COMMIT
@ COMMIT
GitTreeItem
Definition: GitObjectManager.h:97
GitTreeItem::BLOB
@ BLOB
Definition: GitObjectManager.h:101
GitObjectCache::Item::ba
QByteArray ba
Definition: GitObjectManager.h:59
GitPack::Object
Definition: GitPack.h:19
GitObjectManager::catFile
bool catFile(const Git::CommitID &id, QByteArray *out, Git::Object::Type *type)
Definition: GitObjectManager.cpp:233
GitPackIdxItem::offset
size_t offset
Definition: GitPackIdxV2.h:13
GitCommitTree::root_item_list
GitTreeItemList root_item_list
Definition: GitObjectManager.h:125
misc::joinWithSlash
static QString joinWithSlash(QString const &left, QString const &right)
Definition: misc.cpp:272
GitPackIdxItem::checksum
uint32_t checksum
Definition: GitPackIdxV2.h:16
GitObjectManager::init
void init()
Definition: GitObjectManager.cpp:24
GitCommitTree::parseCommit
QString parseCommit(QString const &commit_id)
Definition: GitDiff.cpp:451
GitCommit
Definition: GitObjectManager.h:89
GitObjectCache::size
size_t size() const
Definition: GitObjectManager.cpp:243
GitObjectManager::subdir_git_objects_pack
QString subdir_git_objects_pack
Definition: GitObjectManager.h:22
parseGitTreeObject
void parseGitTreeObject(QByteArray const &ba, const QString &path_prefix, GitTreeItemList *out)
Definition: GitObjectManager.cpp:407
GitPack::Info::expanded_size
size_t expanded_size
Definition: GitPack.h:14
GitObjectManager::g
GitPtr g
Definition: GitObjectManager.h:19
GitTreeItem::UNKNOWN
@ UNKNOWN
Definition: GitObjectManager.h:99
GitCommitTree::objcache
GitObjectCache * objcache
Definition: GitObjectManager.h:124
Git::Object::Type::UNKNOWN
@ UNKNOWN
GitPack::Info::checksum
uint32_t checksum
Definition: GitPack.h:17
Git
Definition: Git.h:40
GitPack.h
GitObjectManager::findObject
static QStringList findObject(const QString &id, const QString &repo_local_dir)
GitObjectManager::findObject.
Definition: GitObjectManager.cpp:458
misc.h
GitCommitTree::lookup_
QString lookup_(QString const &file, GitTreeItem *out)
Definition: GitDiff.cpp:372
GitObjectCache::ItemPtr
std::shared_ptr< Item > ItemPtr
Definition: GitObjectManager.h:64
GitObjectCache::item_id
const Git::CommitID & item_id(int i) const
Definition: GitObjectManager.h:83
GitObjectCache
Definition: GitObjectManager.h:55
GitTreeItem::mode
QString mode
Definition: GitObjectManager.h:107
GitObjectManager::workingDir
QString workingDir()
Definition: GitObjectManager.cpp:36
Git::trimPath
static QString trimPath(QString const &s)
Definition: Git.cpp:1587
GitObjectManager::loadObject
bool loadObject(const Git::CommitID &id, QByteArray *out, Git::Object::Type *type)
Definition: GitObjectManager.cpp:215
GitPack::Info::offset
uint64_t offset
Definition: GitPack.h:15
GitObjectManager::findObjectPath
QString findObjectPath(const Git::CommitID &id)
Definition: GitObjectManager.cpp:189
GitPack::decompress
static bool decompress(QIODevice *in, size_t expanded_size, QByteArray *out, size_t *consumed=nullptr, uint32_t *crc=nullptr)
Definition: GitPack.cpp:82
Git::SubmoduleItem
Definition: Git.h:88
GitObjectCache::getCommitIdFromTag
Git::CommitID getCommitIdFromTag(const QString &tag)
Definition: GitObjectManager.cpp:343
Git::CommitID
Definition: Git.h:42
joinpath.h
GitTreeItem::id
QString id
Definition: GitObjectManager.h:106
Git::Object::content
QByteArray content
Definition: Git.h:85
misc::splitLines
static QStringList splitLines(QByteArray const &ba, std::function< QString(char const *ptr, size_t len)> const &tos)
QByteArrayの文字列を行に分割する。
Definition: misc.cpp:33
GitPackIdxV2::parse
bool parse(QIODevice *in, int ids_only)
Definition: GitPackIdxV2.cpp:61
GitObjectCache::catFile
Git::Object catFile(const Git::CommitID &id)
Definition: GitObjectManager.cpp:283
GitObjectManager::subdir_git_objects
QString subdir_git_objects
Definition: GitObjectManager.h:21
GitTreeItemList
QList< GitTreeItem > GitTreeItemList
Definition: GitObjectManager.h:120
GitPack::load
static bool load(QIODevice *file, GitPackIdxItem const *item, Object *out)
Definition: GitPack.cpp:221
Git::Object::Type::TREE
@ TREE
Git::Object::Type::OFS_DELTA
@ OFS_DELTA
Git.h
GitObjectCache::revParse
Git::CommitID revParse(QString const &name)
Definition: GitObjectManager.cpp:261
GitPackIdxV2
Definition: GitPackIdxV2.h:20
GitCommit::parseCommit
static bool parseCommit(GitObjectCache *objcache, Git::CommitID const &id, GitCommit *out)
Definition: GitObjectManager.cpp:377
GitPackIdxItem
Definition: GitPackIdxV2.h:10
GitPack::Info
Definition: GitPack.h:12
GitObjectManager::git
GitPtr git(Git::SubmoduleItem const &submod)
Definition: GitObjectManager.h:38
Git::isValidID
static bool isValidID(QString const &id)
Definition: Git.cpp:154
GitObjectCache::git
GitPtr git()
Definition: GitObjectManager.h:69
GitObjectManager
Definition: GitObjectManager.h:16
GitObjectCache::object_manager
GitObjectManager object_manager
Definition: GitObjectManager.h:63
GitTreeItem::COMMIT
@ COMMIT
Definition: GitObjectManager.h:102
GIT_ID_LENGTH
#define GIT_ID_LENGTH
Definition: Git.h:16
GitCommit::tree_id
QString tree_id
Definition: GitObjectManager.h:91
GitObjectManager::loadPackedObject
static bool loadPackedObject(GitPackIdxPtr const &idx, QIODevice *packfile, GitPackIdxItem const *item, GitPack::Object *out)
Definition: GitObjectManager.cpp:119
GitObjectCache::Item
Definition: GitObjectManager.h:57
GitObjectManager::git
GitPtr git()
Definition: GitObjectManager.h:34
GitObjectManager::applyDelta
static void applyDelta(QByteArray const *base, QByteArray const *delta, QByteArray *out)
Definition: GitObjectManager.cpp:62
GitObjectCache::setup
void setup(GitPtr g)
Definition: GitObjectManager.cpp:252
GitObjectManager.h
GitCommitTree
Definition: GitObjectManager.h:122
GitPack::Info::type
Git::Object::Type type
Definition: GitPack.h:13
GitObjectCache::items
std::vector< ItemPtr > items
Definition: GitObjectManager.h:65
GitCommitTree::blob_map
std::map< QString, GitTreeItem > blob_map
Definition: GitObjectManager.h:127
GitPack::Object::content
QByteArray content
Definition: GitPack.h:20
GitTreeItem::TREE
@ TREE
Definition: GitObjectManager.h:100
GitObjectManager::setup
void setup(GitPtr g)
Definition: GitObjectManager.cpp:30
Git::Object::Type
Type
Definition: Git.h:73
Git::SubmoduleItem::path
QString path
Definition: Git.h:91
GitPackIdxV2.h
GitPackIdxItem::qid
static QString qid(GitPackIdxItem const &item)
Definition: GitPackIdxV2.cpp:7
Git::Object
Definition: Git.h:72
GitObjectManager::extractObjectFromPackFile
bool extractObjectFromPackFile(GitPackIdxPtr const &idx, GitPackIdxItem const *item, GitPack::Object *out)
Definition: GitObjectManager.cpp:154
GitObjectCache::git
GitPtr git(Git::SubmoduleItem const &submod)
Definition: GitObjectManager.h:73
GitCommitTree::GitCommitTree
GitCommitTree(GitObjectCache *objcache)
Definition: GitDiff.cpp:362
lookupFileID
QString lookupFileID(GitObjectCache *objcache, QString const &commit_id, QString const &file)
指定されたコミットに属するファイルのIDを求める
Definition: GitDiff.cpp:468
GitTreeItem::type
Type type
Definition: GitObjectManager.h:104
GitObjectCache::Item::type
Git::Object::Type type
Definition: GitObjectManager.h:60
GitCommitTree::lookup
QString lookup(QString const &file)
Definition: GitDiff.cpp:426
GitTreeItem::name
QString name
Definition: GitObjectManager.h:105
GitCommitTree::git
GitPtr git()
Definition: GitDiff.cpp:367
Git::Object::Type::TAG
@ TAG
GitObjectManager::loadIndexes
void loadIndexes()
Definition: GitObjectManager.cpp:41
GitObjectCache::revparsemap
std::map< QString, Git::CommitID > revparsemap
Definition: GitObjectManager.h:66
toQString
QString toQString(const std::vector< char > &vec)
Definition: Win32Process.cpp:235
GitCommitTree::parseTree
void parseTree(QString const &tree_id)
Definition: GitDiff.cpp:446
GitObjectManager::clearIndexes
void clearIndexes()
Definition: GitObjectManager.cpp:57
GitObjectManager::mutex
QMutex mutex
Definition: GitObjectManager.h:20
GitPack::Info::ref_id
QString ref_id
Definition: GitPack.h:16
GitObjectManager::git_idx_list
std::vector< GitPackIdxPtr > git_idx_list
Definition: GitObjectManager.h:23
GitTreeItem::to_string_
QString to_string_() const
Definition: GitObjectManager.h:109
GitCommit::parents
QStringList parents
Definition: GitObjectManager.h:92
GitObjectManager::GitObjectManager
GitObjectManager()
Definition: GitObjectManager.cpp:13
GitPackIdxV2::each
void each(std::function< bool(GitPackIdxItem const *)> const &fn) const
Definition: GitPackIdxV2.cpp:259
Git::Object::Type::REF_DELTA
@ REF_DELTA