Jonathan Tan | 4f39cd8 | 2017-08-18 15:20:16 -0700 | [diff] [blame] | 1 | #ifndef PACKFILE_H |
| 2 | #define PACKFILE_H |
| 3 | |
Beat Bolli | b42f98a | 2018-07-25 23:56:07 +0200 | [diff] [blame] | 4 | #include "cache.h" |
Jonathan Tan | 498f1f6 | 2017-12-05 16:58:44 +0000 | [diff] [blame] | 5 | #include "oidset.h" |
| 6 | |
Stefan Beller | cbd53a2 | 2018-05-15 16:42:15 -0700 | [diff] [blame] | 7 | /* in object-store.h */ |
| 8 | struct packed_git; |
| 9 | struct object_info; |
Stefan Beller | cbd53a2 | 2018-05-15 16:42:15 -0700 | [diff] [blame] | 10 | |
Jonathan Tan | 4f39cd8 | 2017-08-18 15:20:16 -0700 | [diff] [blame] | 11 | /* |
| 12 | * Generate the filename to be used for a pack file with checksum "sha1" and |
| 13 | * extension "ext". The result is written into the strbuf "buf", overwriting |
| 14 | * any existing contents. A pointer to buf->buf is returned as a convenience. |
| 15 | * |
| 16 | * Example: odb_pack_name(out, sha1, "idx") => ".git/objects/pack/pack-1234..idx" |
| 17 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 18 | char *odb_pack_name(struct strbuf *buf, const unsigned char *sha1, const char *ext); |
Jonathan Tan | 4f39cd8 | 2017-08-18 15:20:16 -0700 | [diff] [blame] | 19 | |
| 20 | /* |
| 21 | * Return the name of the (local) packfile with the specified sha1 in |
| 22 | * its name. The return value is a pointer to memory that is |
| 23 | * overwritten each time this function is called. |
| 24 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 25 | char *sha1_pack_name(const unsigned char *sha1); |
Jonathan Tan | 4f39cd8 | 2017-08-18 15:20:16 -0700 | [diff] [blame] | 26 | |
| 27 | /* |
| 28 | * Return the name of the (local) pack index file with the specified |
| 29 | * sha1 in its name. The return value is a pointer to memory that is |
| 30 | * overwritten each time this function is called. |
| 31 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 32 | char *sha1_pack_index_name(const unsigned char *sha1); |
Jonathan Tan | 4f39cd8 | 2017-08-18 15:20:16 -0700 | [diff] [blame] | 33 | |
Jeff King | fc78915 | 2019-04-05 14:06:22 -0400 | [diff] [blame] | 34 | /* |
| 35 | * Return the basename of the packfile, omitting any containing directory |
| 36 | * (e.g., "pack-1234abcd[...].pack"). |
| 37 | */ |
| 38 | const char *pack_basename(struct packed_git *p); |
| 39 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 40 | struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path); |
Jonathan Tan | 0317f45 | 2017-08-18 15:20:19 -0700 | [diff] [blame] | 41 | |
Derrick Stolee | 9208e31 | 2018-07-12 15:39:25 -0400 | [diff] [blame] | 42 | typedef void each_file_in_pack_dir_fn(const char *full_path, size_t full_path_len, |
| 43 | const char *file_pach, void *data); |
| 44 | void for_each_file_in_pack_dir(const char *objdir, |
| 45 | each_file_in_pack_dir_fn fn, |
| 46 | void *data); |
| 47 | |
Jonathan Tan | 0abe14f | 2017-08-18 15:20:26 -0700 | [diff] [blame] | 48 | /* A hook to report invalid files in pack directory */ |
| 49 | #define PACKDIR_FILE_PACK 1 |
| 50 | #define PACKDIR_FILE_IDX 2 |
| 51 | #define PACKDIR_FILE_GARBAGE 4 |
| 52 | extern void (*report_garbage)(unsigned seen_bits, const char *path); |
| 53 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 54 | void reprepare_packed_git(struct repository *r); |
| 55 | void install_packed_git(struct repository *r, struct packed_git *pack); |
Jonathan Tan | e65f186 | 2017-08-18 15:20:25 -0700 | [diff] [blame] | 56 | |
Stefan Beller | a80d72d | 2018-03-23 18:20:59 +0100 | [diff] [blame] | 57 | struct packed_git *get_packed_git(struct repository *r); |
| 58 | struct list_head *get_packed_git_mru(struct repository *r); |
Derrick Stolee | 8aac67a | 2018-07-12 15:39:35 -0400 | [diff] [blame] | 59 | struct multi_pack_index *get_multi_pack_index(struct repository *r); |
Taylor Blau | 59552fb | 2020-08-28 16:22:13 -0400 | [diff] [blame] | 60 | struct multi_pack_index *get_local_multi_pack_index(struct repository *r); |
Derrick Stolee | 0bff526 | 2018-08-20 16:52:02 +0000 | [diff] [blame] | 61 | struct packed_git *get_all_packs(struct repository *r); |
Stefan Beller | a80d72d | 2018-03-23 18:20:59 +0100 | [diff] [blame] | 62 | |
Jonathan Tan | 0abe14f | 2017-08-18 15:20:26 -0700 | [diff] [blame] | 63 | /* |
| 64 | * Give a rough count of objects in the repository. This sacrifices accuracy |
| 65 | * for speed. |
| 66 | */ |
Nguyễn Thái Ngọc Duy | 5038de1 | 2019-04-06 18:34:23 +0700 | [diff] [blame] | 67 | unsigned long repo_approximate_object_count(struct repository *r); |
| 68 | #define approximate_object_count() repo_approximate_object_count(the_repository) |
Jonathan Tan | 0abe14f | 2017-08-18 15:20:26 -0700 | [diff] [blame] | 69 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 70 | struct packed_git *find_sha1_pack(const unsigned char *sha1, |
| 71 | struct packed_git *packs); |
Jonathan Tan | d6fe003 | 2017-08-18 15:20:34 -0700 | [diff] [blame] | 72 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 73 | void pack_report(void); |
Jonathan Tan | 8e21176 | 2017-08-18 15:20:18 -0700 | [diff] [blame] | 74 | |
Jonathan Tan | 0317f45 | 2017-08-18 15:20:19 -0700 | [diff] [blame] | 75 | /* |
| 76 | * mmap the index file for the specified packfile (if it is not |
| 77 | * already mmapped). Return 0 on success. |
| 78 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 79 | int open_pack_index(struct packed_git *); |
Jonathan Tan | 0317f45 | 2017-08-18 15:20:19 -0700 | [diff] [blame] | 80 | |
Jonathan Tan | 3836d88 | 2017-08-18 15:20:21 -0700 | [diff] [blame] | 81 | /* |
| 82 | * munmap the index file for the specified packfile (if it is |
| 83 | * currently mmapped). |
| 84 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 85 | void close_pack_index(struct packed_git *); |
Jonathan Tan | 3836d88 | 2017-08-18 15:20:21 -0700 | [diff] [blame] | 86 | |
Jeff Hostetler | 5ae18df | 2019-03-21 12:36:15 -0700 | [diff] [blame] | 87 | int close_pack_fd(struct packed_git *p); |
| 88 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 89 | uint32_t get_pack_fanout(struct packed_git *p, uint32_t value); |
Derrick Stolee | fe1ed56 | 2018-07-12 15:39:29 -0400 | [diff] [blame] | 90 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 91 | unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *); |
| 92 | void close_pack_windows(struct packed_git *); |
| 93 | void close_pack(struct packed_git *); |
Junio C Hamano | 5cb7c73 | 2019-07-09 15:25:37 -0700 | [diff] [blame] | 94 | void close_object_store(struct raw_object_store *o); |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 95 | void unuse_pack(struct pack_window **); |
| 96 | void clear_delta_base_cache(void); |
| 97 | struct packed_git *add_packed_git(const char *path, size_t path_len, int local); |
Jonathan Tan | 3836d88 | 2017-08-18 15:20:21 -0700 | [diff] [blame] | 98 | |
Jonathan Tan | d5a1676 | 2017-08-18 15:20:31 -0700 | [diff] [blame] | 99 | /* |
Derrick Stolee | 8434e85 | 2019-06-10 16:35:22 -0700 | [diff] [blame] | 100 | * Unlink the .pack and associated extension files. |
| 101 | * Does not unlink if 'force_delete' is false and the pack-file is |
| 102 | * marked as ".keep". |
| 103 | */ |
Denton Liu | 415b770 | 2019-08-19 02:26:19 -0400 | [diff] [blame] | 104 | void unlink_pack_path(const char *pack_name, int force_delete); |
Derrick Stolee | 8434e85 | 2019-06-10 16:35:22 -0700 | [diff] [blame] | 105 | |
| 106 | /* |
Jonathan Tan | 9e0f45f | 2017-08-18 15:20:32 -0700 | [diff] [blame] | 107 | * Make sure that a pointer access into an mmap'd index file is within bounds, |
| 108 | * and can provide at least 8 bytes of data. |
| 109 | * |
| 110 | * Note that this is only necessary for variable-length segments of the file |
| 111 | * (like the 64-bit extended offset table), as we compare the size to the |
| 112 | * fixed-length parts when we open the file. |
| 113 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 114 | void check_pack_index_ptr(const struct packed_git *p, const void *ptr); |
Jonathan Tan | 9e0f45f | 2017-08-18 15:20:32 -0700 | [diff] [blame] | 115 | |
| 116 | /* |
Derrick Stolee | 3d475f4 | 2018-03-22 13:40:09 -0400 | [diff] [blame] | 117 | * Perform binary search on a pack-index for a given oid. Packfile is expected to |
| 118 | * have a valid pack-index. |
| 119 | * |
| 120 | * See 'bsearch_hash' for more information. |
| 121 | */ |
| 122 | int bsearch_pack(const struct object_id *oid, const struct packed_git *p, uint32_t *result); |
| 123 | |
| 124 | /* |
Jeff King | 2fecc48 | 2020-02-23 23:37:54 -0500 | [diff] [blame] | 125 | * Write the oid of the nth object within the specified packfile into the first |
| 126 | * parameter. Open the index if it is not already open. Returns 0 on success, |
| 127 | * negative otherwise. |
Jonathan Tan | d5a1676 | 2017-08-18 15:20:31 -0700 | [diff] [blame] | 128 | */ |
Jeff King | 0763671 | 2020-02-23 23:27:36 -0500 | [diff] [blame] | 129 | int nth_packed_object_id(struct object_id *, struct packed_git *, uint32_t n); |
Jonathan Tan | d5a1676 | 2017-08-18 15:20:31 -0700 | [diff] [blame] | 130 | |
Jonathan Tan | 9e0f45f | 2017-08-18 15:20:32 -0700 | [diff] [blame] | 131 | /* |
| 132 | * Return the offset of the nth object within the specified packfile. |
| 133 | * The index must already be opened. |
| 134 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 135 | off_t nth_packed_object_offset(const struct packed_git *, uint32_t n); |
Jonathan Tan | d5a1676 | 2017-08-18 15:20:31 -0700 | [diff] [blame] | 136 | |
Jonathan Tan | a255195 | 2017-08-18 15:20:33 -0700 | [diff] [blame] | 137 | /* |
| 138 | * If the object named sha1 is present in the specified packfile, |
| 139 | * return its offset within the packfile; otherwise, return 0. |
| 140 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 141 | off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *); |
Jonathan Tan | a255195 | 2017-08-18 15:20:33 -0700 | [diff] [blame] | 142 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 143 | int is_pack_valid(struct packed_git *); |
| 144 | void *unpack_entry(struct repository *r, struct packed_git *, off_t, enum object_type *, unsigned long *); |
| 145 | unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep); |
| 146 | unsigned long get_size_from_delta(struct packed_git *, struct pack_window **, off_t); |
| 147 | int unpack_object_header(struct packed_git *, struct pack_window **, off_t *, unsigned long *); |
Jeff King | 56d9cbe | 2019-09-13 15:02:18 +0200 | [diff] [blame] | 148 | off_t get_delta_base(struct packed_git *p, struct pack_window **w_curs, |
| 149 | off_t *curpos, enum object_type type, |
| 150 | off_t delta_obj_offset); |
Jonathan Tan | 32b42e1 | 2017-08-18 15:20:27 -0700 | [diff] [blame] | 151 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 152 | void release_pack_memory(size_t); |
Jonathan Tan | f0e17e8 | 2017-08-18 15:20:20 -0700 | [diff] [blame] | 153 | |
Jonathan Tan | f1d8130 | 2017-08-18 15:20:30 -0700 | [diff] [blame] | 154 | /* global flag to enable extra checks when accessing packed objects */ |
| 155 | extern int do_check_packed_object_crc; |
| 156 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 157 | int packed_object_info(struct repository *r, |
| 158 | struct packed_git *pack, |
| 159 | off_t offset, struct object_info *); |
Jonathan Tan | f1d8130 | 2017-08-18 15:20:30 -0700 | [diff] [blame] | 160 | |
René Scharfe | 751530d | 2021-09-11 22:40:33 +0200 | [diff] [blame] | 161 | void mark_bad_packed_object(struct packed_git *, const struct object_id *); |
René Scharfe | 7407d73 | 2021-09-11 22:42:20 +0200 | [diff] [blame] | 162 | const struct packed_git *has_packed_and_bad(struct repository *, const struct object_id *); |
Jonathan Tan | 9e0f45f | 2017-08-18 15:20:32 -0700 | [diff] [blame] | 163 | |
Taylor Blau | f62312e | 2021-02-22 21:25:03 -0500 | [diff] [blame] | 164 | #define ON_DISK_KEEP_PACKS 1 |
| 165 | #define IN_CORE_KEEP_PACKS 2 |
| 166 | |
Stefan Beller | 613b42f2 | 2018-03-23 18:45:25 +0100 | [diff] [blame] | 167 | /* |
| 168 | * Iff a pack file in the given repository contains the object named by sha1, |
| 169 | * return true and store its location to e. |
| 170 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 171 | int find_pack_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e); |
Taylor Blau | f62312e | 2021-02-22 21:25:03 -0500 | [diff] [blame] | 172 | int find_kept_pack_entry(struct repository *r, const struct object_id *oid, unsigned flags, struct pack_entry *e); |
Jonathan Tan | 1a1e5d4 | 2017-08-18 15:20:35 -0700 | [diff] [blame] | 173 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 174 | int has_object_pack(const struct object_id *oid); |
Taylor Blau | f62312e | 2021-02-22 21:25:03 -0500 | [diff] [blame] | 175 | int has_object_kept_pack(const struct object_id *oid, unsigned flags); |
Jonathan Tan | 150e300 | 2017-08-18 15:20:36 -0700 | [diff] [blame] | 176 | |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 177 | int has_pack_index(const unsigned char *sha1); |
Jonathan Tan | f9a8672 | 2017-08-18 15:20:37 -0700 | [diff] [blame] | 178 | |
Jonathan Tan | 7709f46 | 2017-08-18 15:20:38 -0700 | [diff] [blame] | 179 | /* |
Jonathan Tan | 498f1f6 | 2017-12-05 16:58:44 +0000 | [diff] [blame] | 180 | * Return 1 if an object in a promisor packfile is or refers to the given |
| 181 | * object, 0 otherwise. |
| 182 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 183 | int is_promisor_object(const struct object_id *oid); |
Jonathan Tan | 498f1f6 | 2017-12-05 16:58:44 +0000 | [diff] [blame] | 184 | |
Josh Steadmon | 1127a98 | 2018-10-12 17:58:41 -0700 | [diff] [blame] | 185 | /* |
| 186 | * Expose a function for fuzz testing. |
| 187 | * |
| 188 | * load_idx() parses a block of memory as a packfile index and puts the results |
| 189 | * into a struct packed_git. |
| 190 | * |
| 191 | * This function should not be used directly. It is exposed here only so that we |
| 192 | * have a convenient entry-point for fuzz testing. For real uses, you should |
| 193 | * probably use open_pack_index() or parse_pack_index() instead. |
| 194 | */ |
Jeff King | 336226c | 2019-04-05 14:03:41 -0400 | [diff] [blame] | 195 | int load_idx(const char *path, const unsigned int hashsz, void *idx_map, |
| 196 | size_t idx_size, struct packed_git *p); |
Josh Steadmon | 1127a98 | 2018-10-12 17:58:41 -0700 | [diff] [blame] | 197 | |
Jonathan Tan | 4f39cd8 | 2017-08-18 15:20:16 -0700 | [diff] [blame] | 198 | #endif |