mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
Merge branch 'jk/loose-object-cache'
Code clean-up with optimization for the codepath that checks (non-)existence of loose objects. * jk/loose-object-cache: odb_load_loose_cache: fix strbuf leak fetch-pack: drop custom loose object cache sha1-file: use loose object cache for quick existence check object-store: provide helpers for loose_objects_cache sha1-file: use an object_directory for the main object dir handle alternates paths the same as the main object dir sha1_file_name(): overwrite buffer instead of appending rename "alternate_object_database" to "object_directory" submodule--helper: prefer strip_suffix() to ends_with() fsck: do not reuse child_process structs
This commit is contained in:
39
fetch-pack.c
39
fetch-pack.c
@@ -636,23 +636,6 @@ struct loose_object_iter {
|
||||
struct ref *refs;
|
||||
};
|
||||
|
||||
/*
|
||||
* If the number of refs is not larger than the number of loose objects,
|
||||
* this function stops inserting.
|
||||
*/
|
||||
static int add_loose_objects_to_set(const struct object_id *oid,
|
||||
const char *path,
|
||||
void *data)
|
||||
{
|
||||
struct loose_object_iter *iter = data;
|
||||
oidset_insert(iter->loose_object_set, oid);
|
||||
if (iter->refs == NULL)
|
||||
return 1;
|
||||
|
||||
iter->refs = iter->refs->next;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Mark recent commits available locally and reachable from a local ref as
|
||||
* COMPLETE. If args->no_dependents is false, also mark COMPLETE remote refs as
|
||||
@@ -670,30 +653,14 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
|
||||
struct ref *ref;
|
||||
int old_save_commit_buffer = save_commit_buffer;
|
||||
timestamp_t cutoff = 0;
|
||||
struct oidset loose_oid_set = OIDSET_INIT;
|
||||
int use_oidset = 0;
|
||||
struct loose_object_iter iter = {&loose_oid_set, *refs};
|
||||
|
||||
/* Enumerate all loose objects or know refs are not so many. */
|
||||
use_oidset = !for_each_loose_object(add_loose_objects_to_set,
|
||||
&iter, 0);
|
||||
|
||||
save_commit_buffer = 0;
|
||||
|
||||
for (ref = *refs; ref; ref = ref->next) {
|
||||
struct object *o;
|
||||
unsigned int flags = OBJECT_INFO_QUICK;
|
||||
|
||||
if (use_oidset &&
|
||||
!oidset_contains(&loose_oid_set, &ref->old_oid)) {
|
||||
/*
|
||||
* I know this does not exist in the loose form,
|
||||
* so check if it exists in a non-loose form.
|
||||
*/
|
||||
flags |= OBJECT_INFO_IGNORE_LOOSE;
|
||||
}
|
||||
|
||||
if (!has_object_file_with_flags(&ref->old_oid, flags))
|
||||
if (!has_object_file_with_flags(&ref->old_oid,
|
||||
OBJECT_INFO_QUICK))
|
||||
continue;
|
||||
o = parse_object(the_repository, &ref->old_oid);
|
||||
if (!o)
|
||||
@@ -710,8 +677,6 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
|
||||
}
|
||||
}
|
||||
|
||||
oidset_clear(&loose_oid_set);
|
||||
|
||||
if (!args->deepen) {
|
||||
for_each_ref(mark_complete_oid, NULL);
|
||||
for_each_cached_alternate(NULL, mark_alternate_complete);
|
||||
|
||||
Reference in New Issue
Block a user