Guitar
GitPackIdxV2.h
Go to the documentation of this file.
1 #ifndef GITPACKIDXV2_H
2 #define GITPACKIDXV2_H
3 
4 #include <QIODevice>
5 #include <cstdint>
6 #include <vector>
7 #include "GitPack.h"
8 #include <memory>
9 
11  uint8_t id[GIT_ID_LENGTH / 2];
13  size_t offset = 0;
14  size_t packed_size = 0;
15  size_t expanded_size = 0;
16  uint32_t checksum;
17  static QString qid(GitPackIdxItem const &item);
18 };
19 
20 class GitPackIdxV2 {
21  friend class GitObjectManager;
22 private:
23  QString pack_idx_path; // e.g. "/path/to/pack-56430ed038c968ded87eb3756dcde85bfafc10ce.idx"
24 
25  struct header_t {
26  uint8_t magic[8];
27  uint32_t fanout[256];
28  };
29 
30  struct trailer_t {
31  uint8_t packfile_checksum[20];
32  uint8_t idxfile_checksum[20];
33  };
34 
35  struct object_id_t {
36  uint8_t id[20];
37  };
38 
39  struct Data {
42  std::vector<object_id_t> objects;
43  std::vector<GitPackIdxItem> item_list;
44  std::vector<GitPackIdxItem *> item_list_order_by_id;
45  std::vector<GitPackIdxItem *> item_list_order_by_offset;
46  } d;
47 
48 private:
49 
50  static QString toString(const uint8_t *p);
51  static inline uint32_t read_uint32_be(void const *p);
52  static inline uint32_t get_fanout(header_t const *t, int i);
53 
54  const uint8_t *object(int i) const;
55  void clear();
56  bool parse(QIODevice *in, int ids_only);
57  bool parse(QString const &idxfile, int ids_only);
58  void fetch() const;
59 public:
60  GitPackIdxV2() = default;
61  ~GitPackIdxV2();
62  QString pack_file_path() const;
63  GitPackIdxItem const *item(Git::CommitID const &id) const;
64  GitPackIdxItem const *item(size_t offset) const;
65  void each(std::function<bool(GitPackIdxItem const *)> const &fn) const;
66 };
67 
68 using GitPackIdxPtr = std::shared_ptr<GitPackIdxV2>;
69 
70 #endif // GITPACKIDXV2_H
GitPackIdxV2::d
struct GitPackIdxV2::Data d
GitPackIdxV2::Data::trailer
trailer_t trailer
Definition: GitPackIdxV2.h:41
GitPackIdxV2::clear
void clear()
Definition: GitPackIdxV2.cpp:31
GitPackIdxPtr
std::shared_ptr< GitPackIdxV2 > GitPackIdxPtr
Definition: GitPackIdxV2.h:68
GitPackIdxV2::trailer_t::idxfile_checksum
uint8_t idxfile_checksum[20]
Definition: GitPackIdxV2.h:32
GitPackIdxV2::fetch
void fetch() const
Definition: GitPackIdxV2.cpp:177
GitPackIdxV2::pack_idx_path
QString pack_idx_path
Definition: GitPackIdxV2.h:23
GitPackIdxItem::offset
size_t offset
Definition: GitPackIdxV2.h:13
GitPackIdxV2::toString
static QString toString(const uint8_t *p)
Definition: GitPackIdxV2.cpp:36
GitPackIdxV2::Data::objects
std::vector< object_id_t > objects
Definition: GitPackIdxV2.h:42
GitPackIdxItem::checksum
uint32_t checksum
Definition: GitPackIdxV2.h:16
GitPackIdxV2::object
const uint8_t * object(int i) const
Definition: GitPackIdxV2.cpp:56
Git::Object::Type::UNKNOWN
@ UNKNOWN
GitPackIdxV2::header_t::fanout
uint32_t fanout[256]
Definition: GitPackIdxV2.h:27
GitPack.h
GitPackIdxV2::Data::header
header_t header
Definition: GitPackIdxV2.h:40
GitPackIdxV2::GitPackIdxV2
GitPackIdxV2()=default
GitPackIdxV2::header_t::magic
uint8_t magic[8]
Definition: GitPackIdxV2.h:26
GitPackIdxV2::Data::item_list
std::vector< GitPackIdxItem > item_list
Definition: GitPackIdxV2.h:43
GitPackIdxV2::trailer_t
Definition: GitPackIdxV2.h:30
GitPackIdxV2::read_uint32_be
static uint32_t read_uint32_be(void const *p)
Definition: GitPackIdxV2.cpp:45
GitPackIdxV2::header_t
Definition: GitPackIdxV2.h:25
Git::CommitID
Definition: Git.h:42
GitPackIdxV2::parse
bool parse(QIODevice *in, int ids_only)
Definition: GitPackIdxV2.cpp:61
GitPackIdxItem::id
uint8_t id[GIT_ID_LENGTH/2]
Definition: GitPackIdxV2.h:11
GitPackIdxV2::~GitPackIdxV2
~GitPackIdxV2()
Definition: GitPackIdxV2.cpp:16
GitPackIdxItem::type
Git::Object::Type type
Definition: GitPackIdxV2.h:12
GitPackIdxV2
Definition: GitPackIdxV2.h:20
GitPackIdxItem
Definition: GitPackIdxV2.h:10
GitPackIdxV2::Data
Definition: GitPackIdxV2.h:39
GitObjectManager
Definition: GitObjectManager.h:16
GIT_ID_LENGTH
#define GIT_ID_LENGTH
Definition: Git.h:16
GitPackIdxItem::expanded_size
size_t expanded_size
Definition: GitPackIdxV2.h:15
GitPackIdxV2::get_fanout
static uint32_t get_fanout(header_t const *t, int i)
Definition: GitPackIdxV2.cpp:51
Git::Object::Type
Type
Definition: Git.h:73
GitPackIdxV2::item
const GitPackIdxItem * item(Git::CommitID const &id) const
Definition: GitPackIdxV2.cpp:185
GitPackIdxV2.h
GitPackIdxItem::qid
static QString qid(GitPackIdxItem const &item)
Definition: GitPackIdxV2.cpp:7
GitPackIdxV2::object_id_t
Definition: GitPackIdxV2.h:35
GitPackIdxV2::pack_file_path
QString pack_file_path() const
Definition: GitPackIdxV2.cpp:21
GitPackIdxV2::trailer_t::packfile_checksum
uint8_t packfile_checksum[20]
Definition: GitPackIdxV2.h:31
GitPackIdxV2::Data::item_list_order_by_id
std::vector< GitPackIdxItem * > item_list_order_by_id
Definition: GitPackIdxV2.h:44
GitPackIdxV2::Data::item_list_order_by_offset
std::vector< GitPackIdxItem * > item_list_order_by_offset
Definition: GitPackIdxV2.h:45
GitPackIdxItem::packed_size
size_t packed_size
Definition: GitPackIdxV2.h:14
GitPackIdxV2::each
void each(std::function< bool(GitPackIdxItem const *)> const &fn) const
Definition: GitPackIdxV2.cpp:259