mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
odb: store locality in object database sources
Object database sources are classified either as:
- Local, which means that the source is the repository's primary
source. This is typically ".git/objects".
- Non-local, which is everything else. Most importantly this includes
alternates and quarantine directories.
This locality is often computed ad-hoc by checking whether a given
object source is the first one. This works, but it is quite roundabout.
Refactor the code so that we store locality when creating the sources in
the first place. This makes it both more accessible and robust.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
70b7b03f98
commit
595bef7180
5
midx.c
5
midx.c
@@ -723,7 +723,7 @@ int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int prepare_multi_pack_index_one(struct odb_source *source, int local)
|
||||
int prepare_multi_pack_index_one(struct odb_source *source)
|
||||
{
|
||||
struct repository *r = source->odb->repo;
|
||||
|
||||
@@ -734,7 +734,8 @@ int prepare_multi_pack_index_one(struct odb_source *source, int local)
|
||||
if (source->midx)
|
||||
return 1;
|
||||
|
||||
source->midx = load_multi_pack_index(r, source->path, local);
|
||||
source->midx = load_multi_pack_index(r, source->path,
|
||||
source->local);
|
||||
|
||||
return !!source->midx;
|
||||
}
|
||||
|
||||
2
midx.h
2
midx.h
@@ -122,7 +122,7 @@ int fill_midx_entry(struct repository *r, const struct object_id *oid, struct pa
|
||||
int midx_contains_pack(struct multi_pack_index *m,
|
||||
const char *idx_or_pack_name);
|
||||
int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id);
|
||||
int prepare_multi_pack_index_one(struct odb_source *source, int local);
|
||||
int prepare_multi_pack_index_one(struct odb_source *source);
|
||||
|
||||
/*
|
||||
* Variant of write_midx_file which writes a MIDX containing only the packs
|
||||
|
||||
1
odb.c
1
odb.c
@@ -176,6 +176,7 @@ static int link_alt_odb_entry(struct object_database *odb,
|
||||
|
||||
CALLOC_ARRAY(alternate, 1);
|
||||
alternate->odb = odb;
|
||||
alternate->local = false;
|
||||
/* pathbuf.buf is already in r->objects->source_by_path */
|
||||
alternate->path = strbuf_detach(&pathbuf, NULL);
|
||||
|
||||
|
||||
8
odb.h
8
odb.h
@@ -63,6 +63,14 @@ struct odb_source {
|
||||
*/
|
||||
struct multi_pack_index *midx;
|
||||
|
||||
/*
|
||||
* Figure out whether this is the local source of the owning
|
||||
* repository, which would typically be its ".git/objects" directory.
|
||||
* This local object directory is usually where objects would be
|
||||
* written to.
|
||||
*/
|
||||
bool local;
|
||||
|
||||
/*
|
||||
* This is a temporary object store created by the tmp_objdir
|
||||
* facility. Disable ref updates since the objects in the store
|
||||
|
||||
@@ -935,14 +935,14 @@ static void prepare_pack(const char *full_name, size_t full_name_len,
|
||||
report_garbage(PACKDIR_FILE_GARBAGE, full_name);
|
||||
}
|
||||
|
||||
static void prepare_packed_git_one(struct odb_source *source, int local)
|
||||
static void prepare_packed_git_one(struct odb_source *source)
|
||||
{
|
||||
struct string_list garbage = STRING_LIST_INIT_DUP;
|
||||
struct prepare_pack_data data = {
|
||||
.m = source->midx,
|
||||
.r = source->odb->repo,
|
||||
.garbage = &garbage,
|
||||
.local = local,
|
||||
.local = source->local,
|
||||
};
|
||||
|
||||
for_each_file_in_pack_dir(source->path, prepare_pack, &data);
|
||||
@@ -1037,9 +1037,8 @@ static void prepare_packed_git(struct repository *r)
|
||||
|
||||
odb_prepare_alternates(r->objects);
|
||||
for (source = r->objects->sources; source; source = source->next) {
|
||||
int local = (source == r->objects->sources);
|
||||
prepare_multi_pack_index_one(source, local);
|
||||
prepare_packed_git_one(source, local);
|
||||
prepare_multi_pack_index_one(source);
|
||||
prepare_packed_git_one(source);
|
||||
}
|
||||
rearrange_packed_git(r);
|
||||
|
||||
|
||||
@@ -168,6 +168,7 @@ void repo_set_gitdir(struct repository *repo,
|
||||
if (!repo->objects->sources) {
|
||||
CALLOC_ARRAY(repo->objects->sources, 1);
|
||||
repo->objects->sources->odb = repo->objects;
|
||||
repo->objects->sources->local = true;
|
||||
repo->objects->sources_tail = &repo->objects->sources->next;
|
||||
}
|
||||
expand_base_dir(&repo->objects->sources->path, o->object_dir,
|
||||
|
||||
Reference in New Issue
Block a user