Line | Count | Source |
1 | | #ifndef ODB_H |
2 | | #define ODB_H |
3 | | |
4 | | #include "hashmap.h" |
5 | | #include "object.h" |
6 | | #include "oid-array.h" |
7 | | #include "oidset.h" |
8 | | #include "oidmap.h" |
9 | | #include "repository.h" |
10 | | #include "string-list.h" |
11 | | #include "thread-utils.h" |
12 | | |
13 | | struct cached_object_entry; |
14 | | struct list_objects_filter_options; |
15 | | struct odb_source_inmemory; |
16 | | struct odb_files_dir; |
17 | | struct packed_git; |
18 | | struct repository; |
19 | | struct strbuf; |
20 | | struct strvec; |
21 | | |
22 | | /* |
23 | | * Compute the exact path an alternate is at and returns it. In case of |
24 | | * error NULL is returned and the human readable error is added to `err` |
25 | | * `path` may be relative and should point to $GIT_DIR. |
26 | | * `err` must not be null. |
27 | | */ |
28 | | char *compute_alternate_path(const char *path, struct strbuf *err); |
29 | | |
30 | | /* |
31 | | * Parse the given URI in the format "<schema>[://<payload>]" and return the |
32 | | * object storage format identified by the schema. If `payload` is non-NULL it |
33 | | * will be set to a newly allocated copy of the payload, or NULL if the URI has |
34 | | * no or an empty payload. Returns `OBJECT_STORAGE_FORMAT_UNKNOWN` for unknown |
35 | | * schemas. |
36 | | */ |
37 | | enum object_storage_format object_storage_format_by_uri(const char *uri, char **payload); |
38 | | |
39 | | enum object_storage_format object_storage_format_by_name(const char *name); |
40 | | const char *object_storage_format_to_name(enum object_storage_format format); |
41 | | |
42 | | /* |
43 | | * The object database encapsulates access to objects in a repository. It |
44 | | * manages the object source as well as auxiliary data structures required to |
45 | | * manage objects. |
46 | | */ |
47 | | struct object_database { |
48 | | /* Repository that owns this database. */ |
49 | | struct repository *repo; |
50 | | |
51 | | /* The source backing this object database. */ |
52 | | struct odb_source *source; |
53 | | |
54 | | /* |
55 | | * State of current object database transaction. Only one |
56 | | * transaction may be pending at a time. Is NULL when no transaction is |
57 | | * configured. |
58 | | */ |
59 | | struct odb_transaction *transaction; |
60 | | |
61 | | /* |
62 | | * Objects that should be substituted by other objects |
63 | | * (see git-replace(1)). |
64 | | */ |
65 | | struct oidmap replace_map; |
66 | | unsigned replace_map_initialized : 1; |
67 | | pthread_mutex_t replace_mutex; /* protect object replace functions */ |
68 | | |
69 | | struct commit_graph *commit_graph; |
70 | | unsigned commit_graph_attempted : 1; /* if loading has been attempted */ |
71 | | |
72 | | /* |
73 | | * This is meant to hold a *small* number of objects that you would |
74 | | * want odb_read_object() to be able to return, but yet you do not want |
75 | | * to write them into the object store (e.g. a browse-only |
76 | | * application). |
77 | | */ |
78 | | struct odb_source *inmemory_objects; |
79 | | |
80 | | /* |
81 | | * A fast, rough count of the number of objects in the repository. |
82 | | * These two fields are not meant for direct access. Use |
83 | | * odb_count_objects() instead. |
84 | | */ |
85 | | unsigned long object_count; |
86 | | unsigned object_count_flags; |
87 | | unsigned object_count_valid : 1; |
88 | | }; |
89 | | |
90 | | enum odb_new_flags { |
91 | | /* |
92 | | * Honor environment variables when constructing the object database |
93 | | * sources. This makes us respect the following environment variables: |
94 | | * |
95 | | * - GIT_OBJECT_DIRECTORY to override the primary object directory. |
96 | | * |
97 | | * - GIT_ALTERNATE_OBJECT_DIRECTORIES to override alternates. |
98 | | * |
99 | | * Environment variables may be backend-specific. |
100 | | */ |
101 | | ODB_NEW_HONOR_ENV = (1 << 0), |
102 | | }; |
103 | | |
104 | | /* |
105 | | * Create a new object database for the given repository. |
106 | | * |
107 | | * If the primary source parameter is set it will override the usual primary |
108 | | * object directory derived from the repository's common directory. The |
109 | | * alternate sources are expected to be a PATH_SEP-separated list of secondary |
110 | | * sources. Note that these alternate sources will be added in addition to, not |
111 | | * instead of, the alternates identified by the primary source. |
112 | | * |
113 | | * Returns the newly created object database. |
114 | | */ |
115 | | struct object_database *odb_new(struct repository *repo, |
116 | | enum odb_new_flags flags); |
117 | | |
118 | | /* Free the object database and release all resources. */ |
119 | | void odb_free(struct object_database *o); |
120 | | |
121 | | enum odb_optimize_strategy { |
122 | | ODB_OPTIMIZE_INCREMENTAL, |
123 | | ODB_OPTIMIZE_GEOMETRIC, |
124 | | }; |
125 | | |
126 | | enum odb_optimize_flags { |
127 | | /* Enable verbose logging and progress reporting. */ |
128 | | ODB_OPTIMIZE_VERBOSE = (1 << 0), |
129 | | |
130 | | /* Perform auto-maintenance, only optimizing objects as required. */ |
131 | | ODB_OPTIMIZE_AUTO = (1 << 1), |
132 | | |
133 | | /* Recompute existing deltas. */ |
134 | | ODB_OPTIMIZE_NO_REUSE_DELTAS = (1 << 2), |
135 | | }; |
136 | | |
137 | | struct odb_optimize_options { |
138 | | enum odb_optimize_strategy strategy; |
139 | | enum odb_optimize_flags flags; |
140 | | const char *prune_expire; |
141 | | const char *expire_to; |
142 | | int depth; |
143 | | int window; |
144 | | |
145 | | /* Backend-specific options. */ |
146 | | int keep_largest_pack; |
147 | | int cruft_packs; |
148 | | unsigned long max_cruft_size; |
149 | | }; |
150 | | |
151 | | /* |
152 | | * Optimize the object database. Returns 0 on success, a negative error code |
153 | | * otherwise. |
154 | | */ |
155 | | int odb_optimize(struct object_database *odb, |
156 | | const struct odb_optimize_options *opts); |
157 | | |
158 | | /* |
159 | | * Check whether optimization of the object database is required given the |
160 | | * provided options. Returns true if optimization should be performed, false |
161 | | * otherwise. |
162 | | */ |
163 | | bool odb_optimize_required(struct object_database *odb, |
164 | | const struct odb_optimize_options *opts); |
165 | | |
166 | | /* |
167 | | * Close the object database and all of its sources so that any held resources |
168 | | * will be released. The database can still be used after closing it, in which |
169 | | * case these resources may be reallocated. |
170 | | */ |
171 | | void odb_close(struct object_database *o); |
172 | | |
173 | | enum odb_prepare_flags { |
174 | | /* |
175 | | * Flush caches, reload alternates and then re-prepare each object |
176 | | * source so that new objects may become accessible. |
177 | | */ |
178 | | ODB_PREPARE_FLUSH_CACHES = (1 << 0), |
179 | | }; |
180 | | |
181 | | /* |
182 | | * Prepare the object database for use. Calling this function is generally not |
183 | | * needed, but can be useful in case the caller wants to pre-open individual |
184 | | * sources. |
185 | | */ |
186 | | void odb_prepare(struct object_database *o, enum odb_prepare_flags flags); |
187 | | |
188 | | /* Equivalent to `odb_prepare(o, ODB_PREPARE_FLUSH_CACHES)`. */ |
189 | | void odb_reprepare(struct object_database *o); |
190 | | |
191 | | enum odb_fsck_flags { |
192 | | /* |
193 | | * If set, perform a full consistency check for the full object |
194 | | * database, including all of its sources and the contents of their |
195 | | * optimized formats. Otherwise, only check the local source, and |
196 | | * restrict checks of its optimized formats to cheap structural |
197 | | * verification of their metadata. |
198 | | */ |
199 | | ODB_FSCK_FULL = (1 << 0), |
200 | | |
201 | | /* Display a progress meter, if sensible. */ |
202 | | ODB_FSCK_PROGRESS = (1 << 1), |
203 | | |
204 | | /* Be extra verbose when checking the database. */ |
205 | | ODB_FSCK_VERBOSE = (1 << 2), |
206 | | }; |
207 | | |
208 | | /* Options that shall be passed to `odb_fsck()`. */ |
209 | | struct odb_fsck_options { |
210 | | enum odb_fsck_flags flags; |
211 | | |
212 | | int (*object_cb)(const struct object_id *oid, enum object_type type, |
213 | | unsigned long size, void *buffer, int *eaten, void *cb_data); |
214 | | void *object_payload; |
215 | | }; |
216 | | |
217 | | /* |
218 | | * Run backend-specific integrity checks on all object sources. Each source |
219 | | * performs the checks appropriate to its type. Returns 0 on success, a |
220 | | * negative error code otherwise. |
221 | | */ |
222 | | int odb_fsck(struct object_database *odb, struct odb_fsck_options *opts); |
223 | | |
224 | | /* |
225 | | * Iterate through all alternates of the database and execute the provided |
226 | | * callback function for each of them. Stop iterating once the callback |
227 | | * function returns a non-zero value, in which case the value is bubbled up |
228 | | * from the callback. |
229 | | */ |
230 | | typedef int odb_for_each_alternate_fn(struct odb_files_dir *, void *); |
231 | | int odb_for_each_alternate(struct object_database *odb, |
232 | | odb_for_each_alternate_fn cb, void *payload); |
233 | | |
234 | | /* |
235 | | * Iterate through all alternates of the database and yield their respective |
236 | | * references. |
237 | | */ |
238 | | typedef void odb_for_each_alternate_ref_fn(const struct object_id *oid, void *); |
239 | | void odb_for_each_alternate_ref(struct object_database *odb, |
240 | | odb_for_each_alternate_ref_fn cb, void *payload); |
241 | | |
242 | | /* |
243 | | * Create a temporary file rooted in the primary alternate's directory, or die |
244 | | * on failure. The filename is taken from "pattern", which should have the |
245 | | * usual "XXXXXX" trailer, and the resulting filename is written into the |
246 | | * "template" buffer. Returns the open descriptor. |
247 | | */ |
248 | | int odb_mkstemp(struct object_database *odb, |
249 | | struct strbuf *temp_filename, const char *pattern); |
250 | | |
251 | | /* |
252 | | * Check whether the object database has any alternates. The primary object |
253 | | * source does not count as alternate. |
254 | | */ |
255 | | int odb_has_alternates(struct object_database *odb); |
256 | | |
257 | | /* |
258 | | * Read an object from the database. Returns the object data and assigns object |
259 | | * type and size to the `type` and `size` pointers, if these pointers are |
260 | | * non-NULL. Returns a `NULL` pointer in case the object does not exist. |
261 | | * |
262 | | * This function dies on corrupt objects; the callers who want to deal with |
263 | | * them should arrange to call odb_read_object_info_extended() and give error |
264 | | * messages themselves. |
265 | | */ |
266 | | void *odb_read_object(struct object_database *odb, |
267 | | const struct object_id *oid, |
268 | | enum object_type *type, |
269 | | size_t *size); |
270 | | |
271 | | void *odb_read_object_peeled(struct object_database *odb, |
272 | | const struct object_id *oid, |
273 | | enum object_type required_type, |
274 | | size_t *size, |
275 | | struct object_id *oid_ret); |
276 | | |
277 | | /* |
278 | | * Add an object file to the in-memory object store, without writing it |
279 | | * to disk. |
280 | | * |
281 | | * Callers are responsible for calling write_object_file to record the |
282 | | * object in persistent storage before writing any other new objects |
283 | | * that reference it. |
284 | | */ |
285 | | int odb_pretend_object(struct object_database *odb, |
286 | | void *buf, size_t len, enum object_type type, |
287 | | struct object_id *oid); |
288 | | |
289 | | /* |
290 | | * Object database source information that can be used to uniquely identify an |
291 | | * object and learn more about how exactly it is stored. |
292 | | */ |
293 | | struct odb_source_info { |
294 | | /* The source that this object has been looked up from. */ |
295 | | struct odb_source *source; |
296 | | |
297 | | /* |
298 | | * Backend-specific information about the specific object. This can be |
299 | | * used for example to uniquely identify a given object in case it |
300 | | * exists multiple times. |
301 | | */ |
302 | | union { |
303 | | /* |
304 | | * struct { |
305 | | * ... Nothing to expose in this case |
306 | | * } cached; |
307 | | * struct { |
308 | | * ... Nothing to expose in this case |
309 | | * } loose; |
310 | | */ |
311 | | struct { |
312 | | struct packed_git *pack; |
313 | | off_t offset; |
314 | | enum packed_object_type { |
315 | | PACKED_OBJECT_TYPE_UNKNOWN, |
316 | | PACKED_OBJECT_TYPE_FULL, |
317 | | PACKED_OBJECT_TYPE_OFS_DELTA, |
318 | | PACKED_OBJECT_TYPE_REF_DELTA, |
319 | | } type; |
320 | | } packed; |
321 | | } u; |
322 | | }; |
323 | | |
324 | | /* |
325 | | * The object info contains the query and response that is to be used for |
326 | | * functions that end up reading object information. Callers are expected to |
327 | | * populate pointers whose information they want to request. |
328 | | */ |
329 | | struct object_info { |
330 | | /* The object type. */ |
331 | | enum object_type *typep; |
332 | | |
333 | | /* The inflated object size in bytes. */ |
334 | | size_t *sizep; |
335 | | |
336 | | /* The object size as stored on disk. */ |
337 | | off_t *disk_sizep; |
338 | | |
339 | | /* |
340 | | * The base the object is deltified against, in case it is stored as a |
341 | | * delta. |
342 | | */ |
343 | | struct object_id *delta_base_oid; |
344 | | |
345 | | /* The object contents. Ownership of memory goes over to the caller. */ |
346 | | void **contentp; |
347 | | |
348 | | /* |
349 | | * The time the given looked-up object has been last modified. |
350 | | * |
351 | | * Note: the mtime may be ambiguous in case the object exists multiple |
352 | | * times in the object database. It is thus _not_ recommended to use |
353 | | * this field outside of contexts where you would read every instance |
354 | | * of the object, like for example with `odb_for_each_object()`. As it |
355 | | * is impossible to say at the ODB level what the intent of the caller |
356 | | * is (e.g. whether to find the oldest or newest object), it is the |
357 | | * responsibility of the caller to disambiguate the mtimes. |
358 | | */ |
359 | | time_t *mtimep; |
360 | | |
361 | | /* |
362 | | * Backend-specific information that tells the caller where exactly an |
363 | | * object was looked up from. This information should help disambiguate |
364 | | * object lookups in case the same object exists in multiple sources, |
365 | | * or multiple times in the same source. |
366 | | */ |
367 | | struct odb_source_info *source_infop; |
368 | | |
369 | | /* |
370 | | * object-info protocol specific. Set by the protocol when the remote |
371 | | * does not recognize the requested object. |
372 | | */ |
373 | | unsigned int unrecognized:1; |
374 | | }; |
375 | | |
376 | | /* |
377 | | * Initializer for a "struct object_info" that wants no items. You may |
378 | | * also memset() the memory to all-zeroes. |
379 | | */ |
380 | 0 | #define OBJECT_INFO_INIT { 0 } |
381 | | |
382 | | /* Flags that can be passed to `odb_read_object_info_extended()`. */ |
383 | | enum object_info_flags { |
384 | | /* Invoke lookup_replace_object() on the given hash. */ |
385 | | OBJECT_INFO_LOOKUP_REPLACE = (1 << 0), |
386 | | |
387 | | /* Do not reprepare object sources when the first lookup has failed. */ |
388 | | OBJECT_INFO_QUICK = (1 << 1), |
389 | | |
390 | | /* |
391 | | * Do not attempt to fetch the object if missing (even if fetch_is_missing is |
392 | | * nonzero). |
393 | | */ |
394 | | OBJECT_INFO_SKIP_FETCH_OBJECT = (1 << 2), |
395 | | |
396 | | /* Die if object corruption (not just an object being missing) was detected. */ |
397 | | OBJECT_INFO_DIE_IF_CORRUPT = (1 << 3), |
398 | | |
399 | | /* |
400 | | * This is meant for bulk prefetching of missing blobs in a partial |
401 | | * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK. |
402 | | */ |
403 | | OBJECT_INFO_FOR_PREFETCH = (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK), |
404 | | }; |
405 | | |
406 | | enum odb_read_status { |
407 | | /* The read was successful. */ |
408 | | ODB_READ_OK = 0, |
409 | | /* The read resulted in a generic error. */ |
410 | | ODB_READ_ERROR = -1, |
411 | | /* The object could not be found. */ |
412 | | ODB_READ_NOT_FOUND = -2, |
413 | | }; |
414 | | |
415 | | /* |
416 | | * Read object info from the object database and populate the `object_info` |
417 | | * structure. Returns 0 on success, a negative error code otherwise. |
418 | | */ |
419 | | enum odb_read_status odb_read_object_info_extended(struct object_database *odb, |
420 | | const struct object_id *oid, |
421 | | struct object_info *oi, |
422 | | enum object_info_flags flags); |
423 | | |
424 | | /* |
425 | | * Read a subset of object info for the given object ID. Returns an `enum |
426 | | * object_type` on success, a negative error code otherwise. If successful and |
427 | | * `sizep` is non-NULL, then the size of the object will be written to the |
428 | | * pointer. |
429 | | */ |
430 | | int odb_read_object_info(struct object_database *odb, |
431 | | const struct object_id *oid, |
432 | | size_t *sizep); |
433 | | |
434 | | enum odb_has_object_flags { |
435 | | /* Retry packed storage after checking packed and loose storage */ |
436 | | ODB_HAS_OBJECT_RECHECK_PACKED = (1 << 0), |
437 | | /* Allow fetching the object in case the repository has a promisor remote. */ |
438 | | ODB_HAS_OBJECT_FETCH_PROMISOR = (1 << 1), |
439 | | }; |
440 | | |
441 | | /* |
442 | | * Returns 1 if the object exists. This function will not lazily fetch objects |
443 | | * in a partial clone by default. |
444 | | */ |
445 | | int odb_has_object(struct object_database *odb, |
446 | | const struct object_id *oid, |
447 | | enum odb_has_object_flags flags); |
448 | | |
449 | | int odb_freshen_object(struct object_database *odb, |
450 | | const struct object_id *oid); |
451 | | |
452 | | void odb_assert_oid_type(struct object_database *odb, |
453 | | const struct object_id *oid, enum object_type expect); |
454 | | |
455 | | /* |
456 | | * Enabling the object read lock allows multiple threads to safely call the |
457 | | * following functions in parallel: odb_read_object(), |
458 | | * odb_read_object_peeled(), odb_read_object_info() and odb(). |
459 | | * |
460 | | * obj_read_lock() and obj_read_unlock() may also be used to protect other |
461 | | * section which cannot execute in parallel with object reading. Since the used |
462 | | * lock is a recursive mutex, these sections can even contain calls to object |
463 | | * reading functions. However, beware that in these cases zlib inflation won't |
464 | | * be performed in parallel, losing performance. |
465 | | * |
466 | | * TODO: odb_read_object_info_extended()'s call stack has a recursive behavior. If |
467 | | * any of its callees end up calling it, this recursive call won't benefit from |
468 | | * parallel inflation. |
469 | | */ |
470 | | void enable_obj_read_lock(void); |
471 | | void disable_obj_read_lock(void); |
472 | | |
473 | | extern int obj_read_use_lock; |
474 | | extern pthread_mutex_t obj_read_mutex; |
475 | | |
476 | | static inline void obj_read_lock(void) |
477 | 0 | { |
478 | 0 | if(obj_read_use_lock) |
479 | 0 | pthread_mutex_lock(&obj_read_mutex); |
480 | 0 | } Unexecuted instantiation: config.c:obj_read_lock Unexecuted instantiation: dir.c:obj_read_lock Unexecuted instantiation: mailmap.c:obj_read_lock Unexecuted instantiation: object-file.c:obj_read_lock Unexecuted instantiation: object-name.c:obj_read_lock Unexecuted instantiation: object.c:obj_read_lock Unexecuted instantiation: odb.c:obj_read_lock Unexecuted instantiation: source.c:obj_read_lock Unexecuted instantiation: source-files.c:obj_read_lock Unexecuted instantiation: source-inmemory.c:obj_read_lock Unexecuted instantiation: source-loose.c:obj_read_lock Unexecuted instantiation: source-packed.c:obj_read_lock Unexecuted instantiation: streaming.c:obj_read_lock Unexecuted instantiation: transaction.c:obj_read_lock Unexecuted instantiation: pack-bitmap.c:obj_read_lock Unexecuted instantiation: pack-check.c:obj_read_lock Unexecuted instantiation: pack-objects.c:obj_read_lock Unexecuted instantiation: pack-revindex.c:obj_read_lock Unexecuted instantiation: pack-write.c:obj_read_lock Unexecuted instantiation: packfile.c:obj_read_lock Unexecuted instantiation: packfile-list.c:obj_read_lock Unexecuted instantiation: path.c:obj_read_lock Unexecuted instantiation: promisor-remote.c:obj_read_lock Unexecuted instantiation: pseudo-merge.c:obj_read_lock Unexecuted instantiation: read-cache.c:obj_read_lock Unexecuted instantiation: refs.c:obj_read_lock Unexecuted instantiation: remote.c:obj_read_lock Unexecuted instantiation: repack.c:obj_read_lock Unexecuted instantiation: repack-geometry.c:obj_read_lock Unexecuted instantiation: replace-object.c:obj_read_lock Unexecuted instantiation: repo-settings.c:obj_read_lock Unexecuted instantiation: repository.c:obj_read_lock Unexecuted instantiation: revision.c:obj_read_lock Unexecuted instantiation: run-command.c:obj_read_lock Unexecuted instantiation: setup.c:obj_read_lock Unexecuted instantiation: shallow.c:obj_read_lock Unexecuted instantiation: submodule-config.c:obj_read_lock Unexecuted instantiation: submodule.c:obj_read_lock Unexecuted instantiation: tag.c:obj_read_lock Unexecuted instantiation: tmp-objdir.c:obj_read_lock Unexecuted instantiation: tree-walk.c:obj_read_lock Unexecuted instantiation: tree.c:obj_read_lock Unexecuted instantiation: attr.c:obj_read_lock Unexecuted instantiation: bisect.c:obj_read_lock Unexecuted instantiation: bloom.c:obj_read_lock Unexecuted instantiation: bundle-uri.c:obj_read_lock Unexecuted instantiation: bundle.c:obj_read_lock Unexecuted instantiation: cache-tree.c:obj_read_lock Unexecuted instantiation: combine-diff.c:obj_read_lock Unexecuted instantiation: commit-graph.c:obj_read_lock Unexecuted instantiation: commit-reach.c:obj_read_lock Unexecuted instantiation: commit.c:obj_read_lock Unexecuted instantiation: connected.c:obj_read_lock Unexecuted instantiation: convert.c:obj_read_lock Unexecuted instantiation: diff.c:obj_read_lock Unexecuted instantiation: diffcore-rename.c:obj_read_lock Unexecuted instantiation: fetch-object-info.c:obj_read_lock Unexecuted instantiation: fetch-pack.c:obj_read_lock Unexecuted instantiation: fsck.c:obj_read_lock Unexecuted instantiation: grep.c:obj_read_lock Unexecuted instantiation: list-objects.c:obj_read_lock Unexecuted instantiation: log-tree.c:obj_read_lock Unexecuted instantiation: loose.c:obj_read_lock Unexecuted instantiation: merge-ort.c:obj_read_lock Unexecuted instantiation: midx.c:obj_read_lock Unexecuted instantiation: notes-cache.c:obj_read_lock Unexecuted instantiation: notes.c:obj_read_lock Unexecuted instantiation: pack-bitmap-write.c:obj_read_lock Unexecuted instantiation: pack-mtimes.c:obj_read_lock Unexecuted instantiation: send-pack.c:obj_read_lock Unexecuted instantiation: sequencer.c:obj_read_lock Unexecuted instantiation: transport-helper.c:obj_read_lock Unexecuted instantiation: unpack-trees.c:obj_read_lock Unexecuted instantiation: xdiff-interface.c:obj_read_lock Unexecuted instantiation: apply.c:obj_read_lock Unexecuted instantiation: entry.c:obj_read_lock Unexecuted instantiation: list-objects-filter.c:obj_read_lock Unexecuted instantiation: match-trees.c:obj_read_lock Unexecuted instantiation: parallel-checkout.c:obj_read_lock Unexecuted instantiation: rerere.c:obj_read_lock |
481 | | |
482 | | static inline void obj_read_unlock(void) |
483 | 0 | { |
484 | 0 | if(obj_read_use_lock) |
485 | 0 | pthread_mutex_unlock(&obj_read_mutex); |
486 | 0 | } Unexecuted instantiation: config.c:obj_read_unlock Unexecuted instantiation: dir.c:obj_read_unlock Unexecuted instantiation: mailmap.c:obj_read_unlock Unexecuted instantiation: object-file.c:obj_read_unlock Unexecuted instantiation: object-name.c:obj_read_unlock Unexecuted instantiation: object.c:obj_read_unlock Unexecuted instantiation: odb.c:obj_read_unlock Unexecuted instantiation: source.c:obj_read_unlock Unexecuted instantiation: source-files.c:obj_read_unlock Unexecuted instantiation: source-inmemory.c:obj_read_unlock Unexecuted instantiation: source-loose.c:obj_read_unlock Unexecuted instantiation: source-packed.c:obj_read_unlock Unexecuted instantiation: streaming.c:obj_read_unlock Unexecuted instantiation: transaction.c:obj_read_unlock Unexecuted instantiation: pack-bitmap.c:obj_read_unlock Unexecuted instantiation: pack-check.c:obj_read_unlock Unexecuted instantiation: pack-objects.c:obj_read_unlock Unexecuted instantiation: pack-revindex.c:obj_read_unlock Unexecuted instantiation: pack-write.c:obj_read_unlock Unexecuted instantiation: packfile.c:obj_read_unlock Unexecuted instantiation: packfile-list.c:obj_read_unlock Unexecuted instantiation: path.c:obj_read_unlock Unexecuted instantiation: promisor-remote.c:obj_read_unlock Unexecuted instantiation: pseudo-merge.c:obj_read_unlock Unexecuted instantiation: read-cache.c:obj_read_unlock Unexecuted instantiation: refs.c:obj_read_unlock Unexecuted instantiation: remote.c:obj_read_unlock Unexecuted instantiation: repack.c:obj_read_unlock Unexecuted instantiation: repack-geometry.c:obj_read_unlock Unexecuted instantiation: replace-object.c:obj_read_unlock Unexecuted instantiation: repo-settings.c:obj_read_unlock Unexecuted instantiation: repository.c:obj_read_unlock Unexecuted instantiation: revision.c:obj_read_unlock Unexecuted instantiation: run-command.c:obj_read_unlock Unexecuted instantiation: setup.c:obj_read_unlock Unexecuted instantiation: shallow.c:obj_read_unlock Unexecuted instantiation: submodule-config.c:obj_read_unlock Unexecuted instantiation: submodule.c:obj_read_unlock Unexecuted instantiation: tag.c:obj_read_unlock Unexecuted instantiation: tmp-objdir.c:obj_read_unlock Unexecuted instantiation: tree-walk.c:obj_read_unlock Unexecuted instantiation: tree.c:obj_read_unlock Unexecuted instantiation: attr.c:obj_read_unlock Unexecuted instantiation: bisect.c:obj_read_unlock Unexecuted instantiation: bloom.c:obj_read_unlock Unexecuted instantiation: bundle-uri.c:obj_read_unlock Unexecuted instantiation: bundle.c:obj_read_unlock Unexecuted instantiation: cache-tree.c:obj_read_unlock Unexecuted instantiation: combine-diff.c:obj_read_unlock Unexecuted instantiation: commit-graph.c:obj_read_unlock Unexecuted instantiation: commit-reach.c:obj_read_unlock Unexecuted instantiation: commit.c:obj_read_unlock Unexecuted instantiation: connected.c:obj_read_unlock Unexecuted instantiation: convert.c:obj_read_unlock Unexecuted instantiation: diff.c:obj_read_unlock Unexecuted instantiation: diffcore-rename.c:obj_read_unlock Unexecuted instantiation: fetch-object-info.c:obj_read_unlock Unexecuted instantiation: fetch-pack.c:obj_read_unlock Unexecuted instantiation: fsck.c:obj_read_unlock Unexecuted instantiation: grep.c:obj_read_unlock Unexecuted instantiation: list-objects.c:obj_read_unlock Unexecuted instantiation: log-tree.c:obj_read_unlock Unexecuted instantiation: loose.c:obj_read_unlock Unexecuted instantiation: merge-ort.c:obj_read_unlock Unexecuted instantiation: midx.c:obj_read_unlock Unexecuted instantiation: notes-cache.c:obj_read_unlock Unexecuted instantiation: notes.c:obj_read_unlock Unexecuted instantiation: pack-bitmap-write.c:obj_read_unlock Unexecuted instantiation: pack-mtimes.c:obj_read_unlock Unexecuted instantiation: send-pack.c:obj_read_unlock Unexecuted instantiation: sequencer.c:obj_read_unlock Unexecuted instantiation: transport-helper.c:obj_read_unlock Unexecuted instantiation: unpack-trees.c:obj_read_unlock Unexecuted instantiation: xdiff-interface.c:obj_read_unlock Unexecuted instantiation: apply.c:obj_read_unlock Unexecuted instantiation: entry.c:obj_read_unlock Unexecuted instantiation: list-objects-filter.c:obj_read_unlock Unexecuted instantiation: match-trees.c:obj_read_unlock Unexecuted instantiation: parallel-checkout.c:obj_read_unlock Unexecuted instantiation: rerere.c:obj_read_unlock |
487 | | |
488 | | /* Flags for for_each_*_object(). */ |
489 | | enum odb_for_each_object_flags { |
490 | | /* Iterate only over local objects, not alternates. */ |
491 | | ODB_FOR_EACH_OBJECT_LOCAL_ONLY = (1<<0), |
492 | | |
493 | | /* Only iterate over packs obtained from the promisor remote. */ |
494 | | ODB_FOR_EACH_OBJECT_PROMISOR_ONLY = (1<<1), |
495 | | |
496 | | /* |
497 | | * Visit objects within a pack in packfile order rather than .idx order |
498 | | */ |
499 | | ODB_FOR_EACH_OBJECT_PACK_ORDER = (1<<2), |
500 | | |
501 | | /* Only iterate over packs that are not marked as kept in-core. */ |
502 | | ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS = (1<<3), |
503 | | |
504 | | /* Only iterate over packs that do not have .keep files. */ |
505 | | ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS = (1<<4), |
506 | | }; |
507 | | |
508 | | /* |
509 | | * A callback function that can be used to iterate through objects. If given, |
510 | | * the optional `oi` parameter will be populated the same as if you would call |
511 | | * `odb_read_object_info()`. |
512 | | * |
513 | | * Returning a non-zero error code will cause iteration to abort. The error |
514 | | * code will be propagated. |
515 | | */ |
516 | | typedef int (*odb_for_each_object_cb)(const struct object_id *oid, |
517 | | struct object_info *oi, |
518 | | void *cb_data); |
519 | | |
520 | | /* |
521 | | * Options that can be passed to `odb_for_each_object()` and its |
522 | | * backend-specific implementations. |
523 | | */ |
524 | | struct odb_for_each_object_options { |
525 | | /* A bitfield of `odb_for_each_object_flags`. */ |
526 | | enum odb_for_each_object_flags flags; |
527 | | |
528 | | /* |
529 | | * If set, only iterate through objects whose first `prefix_hex_len` |
530 | | * hex characters matches the given prefix. |
531 | | */ |
532 | | const struct object_id *prefix; |
533 | | size_t prefix_hex_len; |
534 | | |
535 | | /* |
536 | | * Optional object filter that allows backends to skip yielding |
537 | | * objects that are excluded by the filter as an optimization. The |
538 | | * filter is a best-effort hint: backends may use it to skip |
539 | | * excluded objects (e.g. by consulting a reachability bitmap), but |
540 | | * are also free to ignore it entirely and yield every object. As a |
541 | | * consequence, callers must re-apply the filter on yielded objects |
542 | | * if they require strict filtering semantics. |
543 | | */ |
544 | | const struct list_objects_filter_options *filter; |
545 | | }; |
546 | | |
547 | | /* |
548 | | * Iterate through all objects contained in the object database. Note that |
549 | | * objects may be iterated over multiple times in case they are either stored |
550 | | * in different backends or in case they are stored in multiple sources. |
551 | | * If an object info request is given, then the object info will be read and |
552 | | * passed to the callback as if `odb_read_object_info()` was called for the |
553 | | * object. |
554 | | * |
555 | | * Returning a non-zero error code from the callback function will cause |
556 | | * iteration to abort. The error code will be propagated. |
557 | | * |
558 | | * Returns 0 on success, a negative error code in case a failure occurred, or |
559 | | * an arbitrary non-zero error code returned by the callback itself. |
560 | | */ |
561 | | int odb_for_each_object_ext(struct object_database *odb, |
562 | | const struct object_info *request, |
563 | | odb_for_each_object_cb cb, |
564 | | void *cb_data, |
565 | | const struct odb_for_each_object_options *opts); |
566 | | |
567 | | /* Same as `odb_for_each_object_ext()` with `opts.flags` set to the given flags. */ |
568 | | int odb_for_each_object(struct object_database *odb, |
569 | | const struct object_info *request, |
570 | | odb_for_each_object_cb cb, |
571 | | void *cb_data, |
572 | | enum odb_for_each_object_flags flags); |
573 | | |
574 | | enum odb_count_objects_flags { |
575 | | /* |
576 | | * Instead of providing an accurate count, allow the number of objects |
577 | | * to be approximated. Details of how this approximation works are |
578 | | * subject to the specific source's implementation. |
579 | | */ |
580 | | ODB_COUNT_OBJECTS_APPROXIMATE = (1 << 0), |
581 | | }; |
582 | | |
583 | | /* |
584 | | * Count the number of objects in the given object database. This object count |
585 | | * may double-count objects that are stored in multiple backends, or which are |
586 | | * stored multiple times in a single backend. |
587 | | * |
588 | | * Returns 0 on success, a negative error code otherwise. The number of objects |
589 | | * will be assigned to the `out` pointer on success. |
590 | | */ |
591 | | int odb_count_objects(struct object_database *odb, |
592 | | enum odb_count_objects_flags flags, |
593 | | unsigned long *out); |
594 | | |
595 | | /* |
596 | | * Given an object ID, find the minimum required length required to make the |
597 | | * object ID unique across the whole object database. |
598 | | * |
599 | | * The `min_len` determines the minimum abbreviated length that'll be returned |
600 | | * by this function. If `min_len < 0`, then the function will set a sensible |
601 | | * default minimum abbreviation length. |
602 | | * |
603 | | * Returns 0 on success, a negative error code otherwise. The computed length |
604 | | * will be assigned to `*out`. |
605 | | */ |
606 | | int odb_find_abbrev_len(struct object_database *odb, |
607 | | const struct object_id *oid, |
608 | | int min_len, |
609 | | unsigned *out); |
610 | | |
611 | | enum odb_write_object_flags { |
612 | | /* |
613 | | * By default, `odb_write_object()` does not actually write anything |
614 | | * into the object store, but only computes the object ID. This flag |
615 | | * changes that so that the object will be written as a loose object |
616 | | * and persisted. |
617 | | */ |
618 | | ODB_WRITE_OBJECT_PERSIST = (1 << 0), |
619 | | |
620 | | /* |
621 | | * Do not print an error in case something goes wrong. |
622 | | */ |
623 | | ODB_WRITE_OBJECT_SILENT = (1 << 1), |
624 | | }; |
625 | | |
626 | | /* |
627 | | * Write an object into the object database. The object is being written into |
628 | | * the local alternate of the repository. If provided, the object ID of the |
629 | | * final object is written into `oid`. |
630 | | * |
631 | | * If the caller provides a `compat_oid`, then this compatibility object hash |
632 | | * will be stored instead of computing the compatibility hash ad-hoc. |
633 | | * |
634 | | * Returns 0 on success, a negative error code otherwise. |
635 | | */ |
636 | | int odb_write_object_ext(struct object_database *odb, |
637 | | const void *buf, unsigned long len, |
638 | | enum object_type type, |
639 | | struct object_id *oid, |
640 | | const struct object_id *compat_oid, |
641 | | enum odb_write_object_flags flags); |
642 | | |
643 | | static inline int odb_write_object(struct object_database *odb, |
644 | | const void *buf, unsigned long len, |
645 | | enum object_type type, |
646 | | struct object_id *oid) |
647 | 0 | { |
648 | 0 | return odb_write_object_ext(odb, buf, len, type, oid, NULL, 0); |
649 | 0 | } Unexecuted instantiation: config.c:odb_write_object Unexecuted instantiation: dir.c:odb_write_object Unexecuted instantiation: mailmap.c:odb_write_object Unexecuted instantiation: object-file.c:odb_write_object Unexecuted instantiation: object-name.c:odb_write_object Unexecuted instantiation: object.c:odb_write_object Unexecuted instantiation: odb.c:odb_write_object Unexecuted instantiation: source.c:odb_write_object Unexecuted instantiation: source-files.c:odb_write_object Unexecuted instantiation: source-inmemory.c:odb_write_object Unexecuted instantiation: source-loose.c:odb_write_object Unexecuted instantiation: source-packed.c:odb_write_object Unexecuted instantiation: streaming.c:odb_write_object Unexecuted instantiation: transaction.c:odb_write_object Unexecuted instantiation: pack-bitmap.c:odb_write_object Unexecuted instantiation: pack-check.c:odb_write_object Unexecuted instantiation: pack-objects.c:odb_write_object Unexecuted instantiation: pack-revindex.c:odb_write_object Unexecuted instantiation: pack-write.c:odb_write_object Unexecuted instantiation: packfile.c:odb_write_object Unexecuted instantiation: packfile-list.c:odb_write_object Unexecuted instantiation: path.c:odb_write_object Unexecuted instantiation: promisor-remote.c:odb_write_object Unexecuted instantiation: pseudo-merge.c:odb_write_object Unexecuted instantiation: read-cache.c:odb_write_object Unexecuted instantiation: refs.c:odb_write_object Unexecuted instantiation: remote.c:odb_write_object Unexecuted instantiation: repack.c:odb_write_object Unexecuted instantiation: repack-geometry.c:odb_write_object Unexecuted instantiation: replace-object.c:odb_write_object Unexecuted instantiation: repo-settings.c:odb_write_object Unexecuted instantiation: repository.c:odb_write_object Unexecuted instantiation: revision.c:odb_write_object Unexecuted instantiation: run-command.c:odb_write_object Unexecuted instantiation: setup.c:odb_write_object Unexecuted instantiation: shallow.c:odb_write_object Unexecuted instantiation: submodule-config.c:odb_write_object Unexecuted instantiation: submodule.c:odb_write_object Unexecuted instantiation: tag.c:odb_write_object Unexecuted instantiation: tmp-objdir.c:odb_write_object Unexecuted instantiation: tree-walk.c:odb_write_object Unexecuted instantiation: tree.c:odb_write_object Unexecuted instantiation: attr.c:odb_write_object Unexecuted instantiation: bisect.c:odb_write_object Unexecuted instantiation: bloom.c:odb_write_object Unexecuted instantiation: bundle-uri.c:odb_write_object Unexecuted instantiation: bundle.c:odb_write_object Unexecuted instantiation: cache-tree.c:odb_write_object Unexecuted instantiation: combine-diff.c:odb_write_object Unexecuted instantiation: commit-graph.c:odb_write_object Unexecuted instantiation: commit-reach.c:odb_write_object Unexecuted instantiation: commit.c:odb_write_object Unexecuted instantiation: connected.c:odb_write_object Unexecuted instantiation: convert.c:odb_write_object Unexecuted instantiation: diff.c:odb_write_object Unexecuted instantiation: diffcore-rename.c:odb_write_object Unexecuted instantiation: fetch-object-info.c:odb_write_object Unexecuted instantiation: fetch-pack.c:odb_write_object Unexecuted instantiation: fsck.c:odb_write_object Unexecuted instantiation: grep.c:odb_write_object Unexecuted instantiation: list-objects.c:odb_write_object Unexecuted instantiation: log-tree.c:odb_write_object Unexecuted instantiation: loose.c:odb_write_object Unexecuted instantiation: merge-ort.c:odb_write_object Unexecuted instantiation: midx.c:odb_write_object Unexecuted instantiation: notes-cache.c:odb_write_object Unexecuted instantiation: notes.c:odb_write_object Unexecuted instantiation: pack-bitmap-write.c:odb_write_object Unexecuted instantiation: pack-mtimes.c:odb_write_object Unexecuted instantiation: send-pack.c:odb_write_object Unexecuted instantiation: sequencer.c:odb_write_object Unexecuted instantiation: transport-helper.c:odb_write_object Unexecuted instantiation: unpack-trees.c:odb_write_object Unexecuted instantiation: xdiff-interface.c:odb_write_object Unexecuted instantiation: apply.c:odb_write_object Unexecuted instantiation: entry.c:odb_write_object Unexecuted instantiation: list-objects-filter.c:odb_write_object Unexecuted instantiation: match-trees.c:odb_write_object Unexecuted instantiation: parallel-checkout.c:odb_write_object Unexecuted instantiation: rerere.c:odb_write_object |
650 | | |
651 | | struct odb_stream; |
652 | | |
653 | | int odb_write_object_stream(struct object_database *odb, |
654 | | struct odb_stream *stream, |
655 | | struct object_id *oid); |
656 | | |
657 | | /* |
658 | | * Options for generating a packfile via `odb_generate_pack()`. |
659 | | */ |
660 | | struct odb_generate_pack_options { |
661 | | /* Tips of the object graph that shall be packed. */ |
662 | | struct oid_array wants; |
663 | | |
664 | | /* |
665 | | * Boundary of the object graph. Objects reachable from any of these |
666 | | * tips are expected to already be available to whoever consumes the |
667 | | * pack and shall thus not be packed. |
668 | | */ |
669 | | struct oid_array haves; |
670 | | |
671 | | /* |
672 | | * The shallow boundary that shall be used when computing object |
673 | | * reachability. When set, any shallow information of the repository |
674 | | * itself shall be ignored in favor of these objects. |
675 | | */ |
676 | | struct oid_array shallows; |
677 | | |
678 | | /* |
679 | | * Pre-expanded object filter specification that limits the set of |
680 | | * objects that shall be packed. May be `NULL` in case no filter shall |
681 | | * be applied. |
682 | | */ |
683 | | const char *filter_spec; |
684 | | |
685 | | /* |
686 | | * Protocols that may be used to offload objects via packfile URIs. |
687 | | * May be `NULL` in case packfile URIs shall not be used. |
688 | | */ |
689 | | const struct string_list *uri_protocols; |
690 | | |
691 | | /* |
692 | | * Hook command that shall be executed instead of the internal |
693 | | * machinery to generate the pack. It is up to the specific backend |
694 | | * whether or not this hook is supported. May be `NULL` in case no |
695 | | * hook shall be executed. |
696 | | */ |
697 | | const char *pack_objects_hook; |
698 | | |
699 | | /* |
700 | | * File descriptor that the generated pack shall be written to. If set |
701 | | * to `-1`, a pipe will be created and exposed via the pack generator's |
702 | | * `out` field. If set to `0`, the pack will be written to the standard |
703 | | * output stream. Otherwise, the provided descriptor will be written to |
704 | | * and is consumed by the generator. |
705 | | */ |
706 | | int pack_fd; |
707 | | |
708 | | /* |
709 | | * File descriptor that progress output shall be written to. The same |
710 | | * semantics as for `pack_fd` apply, except that `0` will cause the |
711 | | * generator to write to stderr instead of stdout. |
712 | | */ |
713 | | int progress_fd; |
714 | | |
715 | | /* Whether to print progress or not. */ |
716 | | enum { |
717 | | /* Don't print progress output. */ |
718 | | ODB_GENERATE_PACK_PROGRESS_NONE, |
719 | | |
720 | | /* |
721 | | * Print progress while computing the packfile, but stop |
722 | | * printing progress once starting to write it. |
723 | | */ |
724 | | ODB_GENERATE_PACK_PROGRESS_STANDARD, |
725 | | |
726 | | /* |
727 | | * Similar to STANDARD, but also print progress when writing |
728 | | * the packfile. |
729 | | */ |
730 | | ODB_GENERATE_PACK_PROGRESS_VERBOSE, |
731 | | } progress; |
732 | | |
733 | | /* Allow the pack to contain deltas against unpacked objects. */ |
734 | | unsigned thin:1; |
735 | | |
736 | | /* Use offset deltas instead of reference deltas. */ |
737 | | unsigned ofs_delta:1; |
738 | | |
739 | | /* Include unasked-for annotated tags of packed objects. */ |
740 | | unsigned include_tag:1; |
741 | | |
742 | | /* The generated pack is destined for a shallow consumer. */ |
743 | | unsigned shallow:1; |
744 | | |
745 | | /* Allow objects that may be missing due to a promisor remote. */ |
746 | | unsigned missing_allow_promisor:1; |
747 | | |
748 | | /* Do not use bitmap indices when computing reachability. */ |
749 | | unsigned disable_bitmaps:1; |
750 | | }; |
751 | | |
752 | 0 | #define ODB_GENERATE_PACK_OPTIONS_INIT { \ |
753 | 0 | .wants = OID_ARRAY_INIT, \ |
754 | 0 | .haves = OID_ARRAY_INIT, \ |
755 | 0 | .shallows = OID_ARRAY_INIT, \ |
756 | 0 | .pack_fd = -1, \ |
757 | 0 | } |
758 | | |
759 | | /* Release resources associated with the options. */ |
760 | | void odb_generate_pack_options_release(struct odb_generate_pack_options *opts); |
761 | | |
762 | | /* |
763 | | * A handle for an ongoing packfile generation as started via |
764 | | * `odb_generate_pack()`. |
765 | | */ |
766 | | struct odb_pack_generator { |
767 | | /* |
768 | | * File descriptor from which the generated pack can be read. Only set |
769 | | * when the pack generation was started with `pack_fd == -1`. The |
770 | | * caller is responsible for closing the descriptor. |
771 | | */ |
772 | | int out; |
773 | | |
774 | | /* |
775 | | * File descriptor from which progress output can be read. Only set |
776 | | * when the pack generation was started with `progress_fd == -1`. The |
777 | | * caller is responsible for closing the descriptor. |
778 | | */ |
779 | | int err; |
780 | | |
781 | | /* |
782 | | * Callback function to finish this generator. This callback is |
783 | | * expected to wait for the packfile generation to complete and to then |
784 | | * free the generator itself. |
785 | | */ |
786 | | int (*finish)(struct odb_pack_generator *); |
787 | | }; |
788 | | |
789 | | /* |
790 | | * Start generating a packfile from the object database with the given |
791 | | * options. The pack is generated asynchronously; the caller is expected to |
792 | | * consume the file descriptors exposed via the pack generator and to then |
793 | | * wait for completion via `odb_pack_generator_finish()`. |
794 | | * |
795 | | * Returns 0 on success and populates the `out` pointer with the pack |
796 | | * generator. Returns a negative error code otherwise. |
797 | | */ |
798 | | int odb_generate_pack(struct object_database *odb, |
799 | | struct odb_pack_generator **out, |
800 | | const struct odb_generate_pack_options *opts); |
801 | | |
802 | | /* |
803 | | * Wait for the packfile generation to complete and free the pack generator. |
804 | | * Returns 0 on success, a negative error code otherwise. |
805 | | */ |
806 | | int odb_pack_generator_finish(struct odb_pack_generator *generator); |
807 | | |
808 | | #endif /* ODB_H */ |