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