Git fork
at reftables-rust 152 lines 4.5 kB view raw
1#ifndef PACK_H 2#define PACK_H 3 4#include "object.h" 5#include "csum-file.h" 6 7struct packed_git; 8struct pack_window; 9struct repository; 10 11/* 12 * Packed object header 13 */ 14#define PACK_SIGNATURE 0x5041434b /* "PACK" */ 15#define PACK_VERSION 2 16#define pack_version_ok(v) pack_version_ok_native(ntohl(v)) 17#define pack_version_ok_native(v) ((v) == 2 || (v) == 3) 18struct pack_header { 19 uint32_t hdr_signature; 20 uint32_t hdr_version; 21 uint32_t hdr_entries; 22}; 23 24/* 25 * The first four bytes of index formats later than version 1 should 26 * start with this signature, as all older git binaries would find this 27 * value illegal and abort reading the file. 28 * 29 * This is the case because the number of objects in a packfile 30 * cannot exceed 1,431,660,000 as every object would need at least 31 * 3 bytes of data and the overall packfile cannot exceed 4 GiB with 32 * version 1 of the index file due to the offsets limited to 32 bits. 33 * Clearly the signature exceeds this maximum. 34 * 35 * Very old git binaries will also compare the first 4 bytes to the 36 * next 4 bytes in the index and abort with a "non-monotonic index" 37 * error if the second 4 byte word is smaller than the first 4 38 * byte word. This would be true in the proposed future index 39 * format as idx_signature would be greater than idx_version. 40 */ 41#define PACK_IDX_SIGNATURE 0xff744f63 /* "\377tOc" */ 42 43struct pack_idx_option { 44 unsigned flags; 45 /* flag bits */ 46#define WRITE_IDX_VERIFY 01 /* verify only, do not write the idx file */ 47#define WRITE_IDX_STRICT 02 48#define WRITE_REV 04 49#define WRITE_REV_VERIFY 010 50#define WRITE_MTIMES 020 51 52 uint32_t version; 53 uint32_t off32_limit; 54 55 /* 56 * List of offsets that would fit within off32_limit but 57 * need to be written out as 64-bit entity for byte-for-byte 58 * verification. 59 */ 60 int anomaly_alloc, anomaly_nr; 61 uint32_t *anomaly; 62 63 size_t delta_base_cache_limit; 64}; 65 66void reset_pack_idx_option(struct pack_idx_option *); 67 68/* 69 * Packed object index header 70 */ 71struct pack_idx_header { 72 uint32_t idx_signature; 73 uint32_t idx_version; 74}; 75 76/* 77 * Common part of object structure used for write_idx_file 78 */ 79struct pack_idx_entry { 80 struct object_id oid; 81 uint32_t crc32; 82 off_t offset; 83}; 84 85 86struct progress; 87/* Note, the data argument could be NULL if object type is blob */ 88typedef int (*verify_fn)(const struct object_id *, enum object_type, unsigned long, void*, int*); 89 90const char *write_idx_file(struct repository *repo, 91 const char *index_name, 92 struct pack_idx_entry **objects, 93 int nr_objects, 94 const struct pack_idx_option *, 95 const unsigned char *sha1); 96int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr); 97int verify_pack_index(struct packed_git *); 98int verify_pack(struct repository *, struct packed_git *, verify_fn fn, struct progress *, uint32_t); 99off_t write_pack_header(struct hashfile *f, uint32_t); 100void fixup_pack_header_footer(const struct git_hash_algo *, int, 101 unsigned char *, const char *, uint32_t, 102 unsigned char *, off_t); 103char *index_pack_lockfile(struct repository *r, int fd, int *is_well_formed); 104 105struct ref; 106 107void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought); 108 109char *write_rev_file(struct repository *repo, 110 const char *rev_name, 111 struct pack_idx_entry **objects, 112 uint32_t nr_objects, 113 const unsigned char *hash, 114 unsigned flags); 115char *write_rev_file_order(struct repository *repo, 116 const char *rev_name, 117 uint32_t *pack_order, 118 uint32_t nr_objects, 119 const unsigned char *hash, 120 unsigned flags); 121 122/* 123 * The "hdr" output buffer should be at least this big, which will handle sizes 124 * up to 2^67. 125 */ 126#define MAX_PACK_OBJECT_HEADER 10 127int encode_in_pack_object_header(unsigned char *hdr, int hdr_len, 128 enum object_type, uintmax_t); 129 130#define PH_ERROR_EOF (-1) 131#define PH_ERROR_PACK_SIGNATURE (-2) 132#define PH_ERROR_PROTOCOL (-3) 133int read_pack_header(int fd, struct pack_header *); 134 135struct packing_data; 136 137struct hashfile *create_tmp_packfile(struct repository *repo, 138 char **pack_tmp_name); 139void stage_tmp_packfiles(struct repository *repo, 140 struct strbuf *name_buffer, 141 const char *pack_tmp_name, 142 struct pack_idx_entry **written_list, 143 uint32_t nr_written, 144 struct packing_data *to_pack, 145 struct pack_idx_option *pack_idx_opts, 146 unsigned char hash[], 147 char **idx_tmp_name); 148void rename_tmp_packfile_idx(struct repository *repo, 149 struct strbuf *basename, 150 char **idx_tmp_name); 151 152#endif