midx: use midx in abbreviation calculations
Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
3715a6335c
commit
8aac67a174
11
midx.c
11
midx.c
@ -203,6 +203,17 @@ int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32
|
|||||||
MIDX_HASH_LEN, result);
|
MIDX_HASH_LEN, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct object_id *nth_midxed_object_oid(struct object_id *oid,
|
||||||
|
struct multi_pack_index *m,
|
||||||
|
uint32_t n)
|
||||||
|
{
|
||||||
|
if (n >= m->num_objects)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hashcpy(oid->hash, m->chunk_oid_lookup + m->hash_len * n);
|
||||||
|
return oid;
|
||||||
|
}
|
||||||
|
|
||||||
static off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos)
|
static off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos)
|
||||||
{
|
{
|
||||||
const unsigned char *offset_data;
|
const unsigned char *offset_data;
|
||||||
|
3
midx.h
3
midx.h
@ -31,6 +31,9 @@ struct multi_pack_index {
|
|||||||
|
|
||||||
struct multi_pack_index *load_multi_pack_index(const char *object_dir);
|
struct multi_pack_index *load_multi_pack_index(const char *object_dir);
|
||||||
int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
|
int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
|
||||||
|
struct object_id *nth_midxed_object_oid(struct object_id *oid,
|
||||||
|
struct multi_pack_index *m,
|
||||||
|
uint32_t n);
|
||||||
int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct multi_pack_index *m);
|
int fill_midx_entry(const struct object_id *oid, struct pack_entry *e, struct multi_pack_index *m);
|
||||||
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir);
|
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir);
|
||||||
|
|
||||||
|
@ -961,6 +961,12 @@ struct packed_git *get_packed_git(struct repository *r)
|
|||||||
return r->objects->packed_git;
|
return r->objects->packed_git;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct multi_pack_index *get_multi_pack_index(struct repository *r)
|
||||||
|
{
|
||||||
|
prepare_packed_git(r);
|
||||||
|
return r->objects->multi_pack_index;
|
||||||
|
}
|
||||||
|
|
||||||
struct list_head *get_packed_git_mru(struct repository *r)
|
struct list_head *get_packed_git_mru(struct repository *r)
|
||||||
{
|
{
|
||||||
prepare_packed_git(r);
|
prepare_packed_git(r);
|
||||||
|
@ -45,6 +45,7 @@ extern void install_packed_git(struct repository *r, struct packed_git *pack);
|
|||||||
|
|
||||||
struct packed_git *get_packed_git(struct repository *r);
|
struct packed_git *get_packed_git(struct repository *r);
|
||||||
struct list_head *get_packed_git_mru(struct repository *r);
|
struct list_head *get_packed_git_mru(struct repository *r);
|
||||||
|
struct multi_pack_index *get_multi_pack_index(struct repository *r);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Give a rough count of objects in the repository. This sacrifices accuracy
|
* Give a rough count of objects in the repository. This sacrifices accuracy
|
||||||
|
70
sha1-name.c
70
sha1-name.c
@ -12,6 +12,7 @@
|
|||||||
#include "packfile.h"
|
#include "packfile.h"
|
||||||
#include "object-store.h"
|
#include "object-store.h"
|
||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
|
#include "midx.h"
|
||||||
|
|
||||||
static int get_oid_oneline(const char *, struct object_id *, struct commit_list *);
|
static int get_oid_oneline(const char *, struct object_id *, struct commit_list *);
|
||||||
|
|
||||||
@ -149,6 +150,32 @@ static int match_sha(unsigned len, const unsigned char *a, const unsigned char *
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void unique_in_midx(struct multi_pack_index *m,
|
||||||
|
struct disambiguate_state *ds)
|
||||||
|
{
|
||||||
|
uint32_t num, i, first = 0;
|
||||||
|
const struct object_id *current = NULL;
|
||||||
|
num = m->num_objects;
|
||||||
|
|
||||||
|
if (!num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bsearch_midx(&ds->bin_pfx, m, &first);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At this point, "first" is the location of the lowest object
|
||||||
|
* with an object name that could match "bin_pfx". See if we have
|
||||||
|
* 0, 1 or more objects that actually match(es).
|
||||||
|
*/
|
||||||
|
for (i = first; i < num && !ds->ambiguous; i++) {
|
||||||
|
struct object_id oid;
|
||||||
|
current = nth_midxed_object_oid(&oid, m, i);
|
||||||
|
if (!match_sha(ds->len, ds->bin_pfx.hash, current->hash))
|
||||||
|
break;
|
||||||
|
update_candidates(ds, current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void unique_in_pack(struct packed_git *p,
|
static void unique_in_pack(struct packed_git *p,
|
||||||
struct disambiguate_state *ds)
|
struct disambiguate_state *ds)
|
||||||
{
|
{
|
||||||
@ -177,8 +204,12 @@ static void unique_in_pack(struct packed_git *p,
|
|||||||
|
|
||||||
static void find_short_packed_object(struct disambiguate_state *ds)
|
static void find_short_packed_object(struct disambiguate_state *ds)
|
||||||
{
|
{
|
||||||
|
struct multi_pack_index *m;
|
||||||
struct packed_git *p;
|
struct packed_git *p;
|
||||||
|
|
||||||
|
for (m = get_multi_pack_index(the_repository); m && !ds->ambiguous;
|
||||||
|
m = m->next)
|
||||||
|
unique_in_midx(m, ds);
|
||||||
for (p = get_packed_git(the_repository); p && !ds->ambiguous;
|
for (p = get_packed_git(the_repository); p && !ds->ambiguous;
|
||||||
p = p->next)
|
p = p->next)
|
||||||
unique_in_pack(p, ds);
|
unique_in_pack(p, ds);
|
||||||
@ -527,6 +558,42 @@ static int extend_abbrev_len(const struct object_id *oid, void *cb_data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void find_abbrev_len_for_midx(struct multi_pack_index *m,
|
||||||
|
struct min_abbrev_data *mad)
|
||||||
|
{
|
||||||
|
int match = 0;
|
||||||
|
uint32_t num, first = 0;
|
||||||
|
struct object_id oid;
|
||||||
|
const struct object_id *mad_oid;
|
||||||
|
|
||||||
|
if (!m->num_objects)
|
||||||
|
return;
|
||||||
|
|
||||||
|
num = m->num_objects;
|
||||||
|
mad_oid = mad->oid;
|
||||||
|
match = bsearch_midx(mad_oid, m, &first);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* first is now the position in the packfile where we would insert
|
||||||
|
* mad->hash if it does not exist (or the position of mad->hash if
|
||||||
|
* it does exist). Hence, we consider a maximum of two objects
|
||||||
|
* nearby for the abbreviation length.
|
||||||
|
*/
|
||||||
|
mad->init_len = 0;
|
||||||
|
if (!match) {
|
||||||
|
if (nth_midxed_object_oid(&oid, m, first))
|
||||||
|
extend_abbrev_len(&oid, mad);
|
||||||
|
} else if (first < num - 1) {
|
||||||
|
if (nth_midxed_object_oid(&oid, m, first + 1))
|
||||||
|
extend_abbrev_len(&oid, mad);
|
||||||
|
}
|
||||||
|
if (first > 0) {
|
||||||
|
if (nth_midxed_object_oid(&oid, m, first - 1))
|
||||||
|
extend_abbrev_len(&oid, mad);
|
||||||
|
}
|
||||||
|
mad->init_len = mad->cur_len;
|
||||||
|
}
|
||||||
|
|
||||||
static void find_abbrev_len_for_pack(struct packed_git *p,
|
static void find_abbrev_len_for_pack(struct packed_git *p,
|
||||||
struct min_abbrev_data *mad)
|
struct min_abbrev_data *mad)
|
||||||
{
|
{
|
||||||
@ -565,8 +632,11 @@ static void find_abbrev_len_for_pack(struct packed_git *p,
|
|||||||
|
|
||||||
static void find_abbrev_len_packed(struct min_abbrev_data *mad)
|
static void find_abbrev_len_packed(struct min_abbrev_data *mad)
|
||||||
{
|
{
|
||||||
|
struct multi_pack_index *m;
|
||||||
struct packed_git *p;
|
struct packed_git *p;
|
||||||
|
|
||||||
|
for (m = get_multi_pack_index(the_repository); m; m = m->next)
|
||||||
|
find_abbrev_len_for_midx(m, mad);
|
||||||
for (p = get_packed_git(the_repository); p; p = p->next)
|
for (p = get_packed_git(the_repository); p; p = p->next)
|
||||||
find_abbrev_len_for_pack(p, mad);
|
find_abbrev_len_for_pack(p, mad);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user