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::Hash 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
std::shared_ptr< GitPackIdxV2 > GitPackIdxPtr
Definition: GitPackIdxV2.h:68
#define GIT_ID_LENGTH
Definition: Git.h:17
Definition: GitObjectManager.h:16
Definition: GitPackIdxV2.h:20
bool parse(QIODevice *in, int ids_only)
Definition: GitPackIdxV2.cpp:61
~GitPackIdxV2()
Definition: GitPackIdxV2.cpp:16
void fetch() const
Definition: GitPackIdxV2.cpp:177
const uint8_t * object(int i) const
Definition: GitPackIdxV2.cpp:56
static uint32_t read_uint32_be(void const *p)
Definition: GitPackIdxV2.cpp:45
QString pack_file_path() const
Definition: GitPackIdxV2.cpp:21
static uint32_t get_fanout(header_t const *t, int i)
Definition: GitPackIdxV2.cpp:51
void clear()
Definition: GitPackIdxV2.cpp:31
GitPackIdxV2()=default
QString pack_idx_path
Definition: GitPackIdxV2.h:23
GitPackIdxItem const * item(Git::Hash const &id) const
Definition: GitPackIdxV2.cpp:185
static QString toString(const uint8_t *p)
Definition: GitPackIdxV2.cpp:36
void each(std::function< bool(GitPackIdxItem const *)> const &fn) const
Definition: GitPackIdxV2.cpp:259
struct GitPackIdxV2::Data d
Definition: Git.h:46
Definition: GitPackIdxV2.h:10
size_t packed_size
Definition: GitPackIdxV2.h:14
size_t offset
Definition: GitPackIdxV2.h:13
static QString qid(GitPackIdxItem const &item)
Definition: GitPackIdxV2.cpp:7
Git::Object::Type type
Definition: GitPackIdxV2.h:12
size_t expanded_size
Definition: GitPackIdxV2.h:15
uint32_t checksum
Definition: GitPackIdxV2.h:16
Definition: GitPackIdxV2.h:39
std::vector< GitPackIdxItem > item_list
Definition: GitPackIdxV2.h:43
std::vector< GitPackIdxItem * > item_list_order_by_id
Definition: GitPackIdxV2.h:44
header_t header
Definition: GitPackIdxV2.h:40
std::vector< GitPackIdxItem * > item_list_order_by_offset
Definition: GitPackIdxV2.h:45
std::vector< object_id_t > objects
Definition: GitPackIdxV2.h:42
trailer_t trailer
Definition: GitPackIdxV2.h:41
Definition: GitPackIdxV2.h:25
uint8_t magic[8]
Definition: GitPackIdxV2.h:26
uint32_t fanout[256]
Definition: GitPackIdxV2.h:27
Definition: GitPackIdxV2.h:35
Definition: GitPackIdxV2.h:30
uint8_t idxfile_checksum[20]
Definition: GitPackIdxV2.h:32
uint8_t packfile_checksum[20]
Definition: GitPackIdxV2.h:31
Type
Definition: Git.h:80