mirror of
https://github.com/git-for-windows/git.git
synced 2026-06-14 05:33:00 -05:00
The packed object source has been refactored into a proper struct odb_source. * ps/odb-source-packed: odb/source-packed: drop pointer to "files" parent source midx: refactor interfaces to work on "packed" source odb/source-packed: stub out remaining functions odb/source-packed: wire up `freshen_object()` callback odb/source-packed: wire up `find_abbrev_len()` callback odb/source-packed: wire up `count_objects()` callback odb/source-packed: wire up `for_each_object()` callback odb/source-packed: wire up `read_object_stream()` callback odb/source-packed: wire up `read_object_info()` callback packfile: use higher-level interface to implement `has_object_pack()` odb/source-packed: wire up `reprepare()` callback odb/source-packed: wire up `close()` callback odb/source-packed: start converting to a proper `struct odb_source` odb/source-packed: store pointer to "files" instead of generic source packfile: move packed source into "odb/" subsystem packfile: split out packfile list logic packfile: rename `struct packfile_store` to `odb_source_packed`
95 lines
2.7 KiB
C
95 lines
2.7 KiB
C
#ifndef ODB_SOURCE_PACKED_H
|
|
#define ODB_SOURCE_PACKED_H
|
|
|
|
#include "odb/source.h"
|
|
#include "packfile-list.h"
|
|
#include "strmap.h"
|
|
|
|
/*
|
|
* A store that manages packfiles for a given object database.
|
|
*/
|
|
struct odb_source_packed {
|
|
struct odb_source base;
|
|
|
|
/*
|
|
* The list of packfiles in the order in which they have been most
|
|
* recently used.
|
|
*/
|
|
struct packfile_list packs;
|
|
|
|
/*
|
|
* Cache of packfiles which are marked as "kept", either because there
|
|
* is an on-disk ".keep" file or because they are marked as "kept" in
|
|
* memory.
|
|
*
|
|
* Should not be accessed directly, but via
|
|
* `packfile_store_get_kept_pack_cache()`. The list of packs gets
|
|
* invalidated when the stored flags and the flags passed to
|
|
* `packfile_store_get_kept_pack_cache()` mismatch.
|
|
*/
|
|
struct {
|
|
struct packed_git **packs;
|
|
unsigned flags;
|
|
} kept_cache;
|
|
|
|
/* The multi-pack index that belongs to this specific packfile store. */
|
|
struct multi_pack_index *midx;
|
|
|
|
/*
|
|
* A map of packfile names to packed_git structs for tracking which
|
|
* packs have been loaded already.
|
|
*/
|
|
struct strmap packs_by_path;
|
|
|
|
/*
|
|
* Whether packfiles have already been populated with this store's
|
|
* packs.
|
|
*/
|
|
bool initialized;
|
|
|
|
/*
|
|
* Usually, packfiles will be reordered to the front of the `packs`
|
|
* list whenever an object is looked up via them. This has the effect
|
|
* that packs that contain a lot of accessed objects will be located
|
|
* towards the front.
|
|
*
|
|
* This is usually desirable, but there are exceptions. One exception
|
|
* is when the looking up multiple objects in a loop for each packfile.
|
|
* In that case, we may easily end up with an infinite loop as the
|
|
* packfiles get reordered to the front repeatedly.
|
|
*
|
|
* Setting this field to `true` thus disables these reorderings.
|
|
*/
|
|
bool skip_mru_updates;
|
|
};
|
|
|
|
/*
|
|
* Allocate and initialize a new empty packfile store for the given object
|
|
* database.
|
|
*/
|
|
struct odb_source_packed *odb_source_packed_new(struct object_database *odb,
|
|
const char *path,
|
|
bool local);
|
|
|
|
/*
|
|
* Cast the given object database source to the packed backend. This will cause
|
|
* a BUG in case the source doesn't use this backend.
|
|
*/
|
|
static inline struct odb_source_packed *odb_source_packed_downcast(struct odb_source *source)
|
|
{
|
|
if (source->type != ODB_SOURCE_PACKED)
|
|
BUG("trying to downcast source of type '%d' to packed", source->type);
|
|
return container_of(source, struct odb_source_packed, base);
|
|
}
|
|
|
|
/*
|
|
* Prepare the source by loading packfiles and multi-pack indices for
|
|
* all alternates. This becomes a no-op if the source is already prepared.
|
|
*
|
|
* It shouldn't typically be necessary to call this function directly, as
|
|
* functions that access the source know to prepare it.
|
|
*/
|
|
void odb_source_packed_prepare(struct odb_source_packed *source);
|
|
|
|
#endif
|