object-store: factor out odb_loose_cache()
Add and use a function for loading the entries of a loose object subdirectory for a given object ID. It frees callers from deriving the fanout key; they can use the returned oid_array reference for lookups or forward range scans. Suggested-by: Jeff King <peff@peff.net> Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
ecbdaf0899
commit
0000d6543f
|
@ -54,6 +54,13 @@ void add_to_alternates_memory(const char *dir);
|
||||||
*/
|
*/
|
||||||
void odb_load_loose_cache(struct object_directory *odb, int subdir_nr);
|
void odb_load_loose_cache(struct object_directory *odb, int subdir_nr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Populate and return the loose object cache array corresponding to the
|
||||||
|
* given object ID.
|
||||||
|
*/
|
||||||
|
struct oid_array *odb_loose_cache(struct object_directory *odb,
|
||||||
|
const struct object_id *oid);
|
||||||
|
|
||||||
struct packed_git {
|
struct packed_git {
|
||||||
struct packed_git *next;
|
struct packed_git *next;
|
||||||
struct list_head mru;
|
struct list_head mru;
|
||||||
|
|
12
sha1-file.c
12
sha1-file.c
|
@ -924,7 +924,6 @@ static int open_sha1_file(struct repository *r,
|
||||||
static int quick_has_loose(struct repository *r,
|
static int quick_has_loose(struct repository *r,
|
||||||
const unsigned char *sha1)
|
const unsigned char *sha1)
|
||||||
{
|
{
|
||||||
int subdir_nr = sha1[0];
|
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
struct object_directory *odb;
|
struct object_directory *odb;
|
||||||
|
|
||||||
|
@ -932,8 +931,7 @@ static int quick_has_loose(struct repository *r,
|
||||||
|
|
||||||
prepare_alt_odb(r);
|
prepare_alt_odb(r);
|
||||||
for (odb = r->objects->odb; odb; odb = odb->next) {
|
for (odb = r->objects->odb; odb; odb = odb->next) {
|
||||||
odb_load_loose_cache(odb, subdir_nr);
|
if (oid_array_lookup(odb_loose_cache(odb, &oid), &oid) >= 0)
|
||||||
if (oid_array_lookup(&odb->loose_objects_cache, &oid) >= 0)
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2152,6 +2150,14 @@ static int append_loose_object(const struct object_id *oid, const char *path,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct oid_array *odb_loose_cache(struct object_directory *odb,
|
||||||
|
const struct object_id *oid)
|
||||||
|
{
|
||||||
|
int subdir_nr = oid->hash[0];
|
||||||
|
odb_load_loose_cache(odb, subdir_nr);
|
||||||
|
return &odb->loose_objects_cache;
|
||||||
|
}
|
||||||
|
|
||||||
void odb_load_loose_cache(struct object_directory *odb, int subdir_nr)
|
void odb_load_loose_cache(struct object_directory *odb, int subdir_nr)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
|
10
sha1-name.c
10
sha1-name.c
|
@ -87,21 +87,21 @@ static int match_sha(unsigned, const unsigned char *, const unsigned char *);
|
||||||
|
|
||||||
static void find_short_object_filename(struct disambiguate_state *ds)
|
static void find_short_object_filename(struct disambiguate_state *ds)
|
||||||
{
|
{
|
||||||
int subdir_nr = ds->bin_pfx.hash[0];
|
|
||||||
struct object_directory *odb;
|
struct object_directory *odb;
|
||||||
|
|
||||||
for (odb = the_repository->objects->odb;
|
for (odb = the_repository->objects->odb;
|
||||||
odb && !ds->ambiguous;
|
odb && !ds->ambiguous;
|
||||||
odb = odb->next) {
|
odb = odb->next) {
|
||||||
int pos;
|
int pos;
|
||||||
|
struct oid_array *loose_objects;
|
||||||
|
|
||||||
odb_load_loose_cache(odb, subdir_nr);
|
loose_objects = odb_loose_cache(odb, &ds->bin_pfx);
|
||||||
pos = oid_array_lookup(&odb->loose_objects_cache, &ds->bin_pfx);
|
pos = oid_array_lookup(loose_objects, &ds->bin_pfx);
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
pos = -1 - pos;
|
pos = -1 - pos;
|
||||||
while (!ds->ambiguous && pos < odb->loose_objects_cache.nr) {
|
while (!ds->ambiguous && pos < loose_objects->nr) {
|
||||||
const struct object_id *oid;
|
const struct object_id *oid;
|
||||||
oid = odb->loose_objects_cache.oid + pos;
|
oid = loose_objects->oid + pos;
|
||||||
if (!match_sha(ds->len, ds->bin_pfx.hash, oid->hash))
|
if (!match_sha(ds->len, ds->bin_pfx.hash, oid->hash))
|
||||||
break;
|
break;
|
||||||
update_candidates(ds, oid);
|
update_candidates(ds, oid);
|
||||||
|
|
Loading…
Reference in New Issue