midx: clear midx on repack
[git] / packfile.h
1 #ifndef PACKFILE_H
2 #define PACKFILE_H
3
4 #include "oidset.h"
5
6 /*
7  * Generate the filename to be used for a pack file with checksum "sha1" and
8  * extension "ext". The result is written into the strbuf "buf", overwriting
9  * any existing contents. A pointer to buf->buf is returned as a convenience.
10  *
11  * Example: odb_pack_name(out, sha1, "idx") => ".git/objects/pack/pack-1234..idx"
12  */
13 extern char *odb_pack_name(struct strbuf *buf, const unsigned char *sha1, const char *ext);
14
15 /*
16  * Return the name of the (local) packfile with the specified sha1 in
17  * its name.  The return value is a pointer to memory that is
18  * overwritten each time this function is called.
19  */
20 extern char *sha1_pack_name(const unsigned char *sha1);
21
22 /*
23  * Return the name of the (local) pack index file with the specified
24  * sha1 in its name.  The return value is a pointer to memory that is
25  * overwritten each time this function is called.
26  */
27 extern char *sha1_pack_index_name(const unsigned char *sha1);
28
29 extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);
30
31 typedef void each_file_in_pack_dir_fn(const char *full_path, size_t full_path_len,
32                                       const char *file_pach, void *data);
33 void for_each_file_in_pack_dir(const char *objdir,
34                                each_file_in_pack_dir_fn fn,
35                                void *data);
36
37 /* A hook to report invalid files in pack directory */
38 #define PACKDIR_FILE_PACK 1
39 #define PACKDIR_FILE_IDX 2
40 #define PACKDIR_FILE_GARBAGE 4
41 extern void (*report_garbage)(unsigned seen_bits, const char *path);
42
43 extern void reprepare_packed_git(struct repository *r);
44 extern void install_packed_git(struct repository *r, struct packed_git *pack);
45
46 struct packed_git *get_packed_git(struct repository *r);
47 struct list_head *get_packed_git_mru(struct repository *r);
48 struct multi_pack_index *get_multi_pack_index(struct repository *r);
49
50 /*
51  * Give a rough count of objects in the repository. This sacrifices accuracy
52  * for speed.
53  */
54 unsigned long approximate_object_count(void);
55
56 extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
57                                          struct packed_git *packs);
58
59 extern void pack_report(void);
60
61 /*
62  * mmap the index file for the specified packfile (if it is not
63  * already mmapped).  Return 0 on success.
64  */
65 extern int open_pack_index(struct packed_git *);
66
67 /*
68  * munmap the index file for the specified packfile (if it is
69  * currently mmapped).
70  */
71 extern void close_pack_index(struct packed_git *);
72
73 extern uint32_t get_pack_fanout(struct packed_git *p, uint32_t value);
74
75 extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *);
76 extern void close_pack_windows(struct packed_git *);
77 extern void close_pack(struct packed_git *);
78 extern void close_all_packs(struct raw_object_store *o);
79 extern void unuse_pack(struct pack_window **);
80 extern void clear_delta_base_cache(void);
81 extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
82
83 /*
84  * Make sure that a pointer access into an mmap'd index file is within bounds,
85  * and can provide at least 8 bytes of data.
86  *
87  * Note that this is only necessary for variable-length segments of the file
88  * (like the 64-bit extended offset table), as we compare the size to the
89  * fixed-length parts when we open the file.
90  */
91 extern void check_pack_index_ptr(const struct packed_git *p, const void *ptr);
92
93 /*
94  * Perform binary search on a pack-index for a given oid. Packfile is expected to
95  * have a valid pack-index.
96  *
97  * See 'bsearch_hash' for more information.
98  */
99 int bsearch_pack(const struct object_id *oid, const struct packed_git *p, uint32_t *result);
100
101 /*
102  * Return the SHA-1 of the nth object within the specified packfile.
103  * Open the index if it is not already open.  The return value points
104  * at the SHA-1 within the mmapped index.  Return NULL if there is an
105  * error.
106  */
107 extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n);
108 /*
109  * Like nth_packed_object_sha1, but write the data into the object specified by
110  * the the first argument.  Returns the first argument on success, and NULL on
111  * error.
112  */
113 extern const struct object_id *nth_packed_object_oid(struct object_id *, struct packed_git *, uint32_t n);
114
115 /*
116  * Return the offset of the nth object within the specified packfile.
117  * The index must already be opened.
118  */
119 extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t n);
120
121 /*
122  * If the object named sha1 is present in the specified packfile,
123  * return its offset within the packfile; otherwise, return 0.
124  */
125 extern off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *);
126
127 extern int is_pack_valid(struct packed_git *);
128 extern void *unpack_entry(struct repository *r, struct packed_git *, off_t, enum object_type *, unsigned long *);
129 extern unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
130 extern unsigned long get_size_from_delta(struct packed_git *, struct pack_window **, off_t);
131 extern int unpack_object_header(struct packed_git *, struct pack_window **, off_t *, unsigned long *);
132
133 extern void release_pack_memory(size_t);
134
135 /* global flag to enable extra checks when accessing packed objects */
136 extern int do_check_packed_object_crc;
137
138 extern int packed_object_info(struct repository *r,
139                               struct packed_git *pack,
140                               off_t offset, struct object_info *);
141
142 extern void mark_bad_packed_object(struct packed_git *p, const unsigned char *sha1);
143 extern const struct packed_git *has_packed_and_bad(const unsigned char *sha1);
144
145 /*
146  * Iff a pack file in the given repository contains the object named by sha1,
147  * return true and store its location to e.
148  */
149 extern int find_pack_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e);
150
151 extern int has_object_pack(const struct object_id *oid);
152
153 extern int has_pack_index(const unsigned char *sha1);
154
155 /*
156  * Only iterate over packs obtained from the promisor remote.
157  */
158 #define FOR_EACH_OBJECT_PROMISOR_ONLY 2
159
160 /*
161  * Iterate over packed objects in both the local
162  * repository and any alternates repositories (unless the
163  * FOR_EACH_OBJECT_LOCAL_ONLY flag, defined in cache.h, is set).
164  */
165 typedef int each_packed_object_fn(const struct object_id *oid,
166                                   struct packed_git *pack,
167                                   uint32_t pos,
168                                   void *data);
169 extern int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn, void *data);
170 extern int for_each_packed_object(each_packed_object_fn, void *, unsigned flags);
171
172 /*
173  * Return 1 if an object in a promisor packfile is or refers to the given
174  * object, 0 otherwise.
175  */
176 extern int is_promisor_object(const struct object_id *oid);
177
178 #endif