odb: get rid of `the_repository` in `for_each()` functions
There are a couple of iterator-style functions that execute a callback for each instance of a given set, all of which currently depend on `the_repository`. Refactor them to instead take an object database as parameter so that we can get rid of this dependency. Rename the functions accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
c44185f6c1
commit
798c661ce3
|
@ -159,7 +159,7 @@ int cmd_count_objects(int argc,
|
|||
printf("prune-packable: %lu\n", packed_loose);
|
||||
printf("garbage: %lu\n", garbage);
|
||||
printf("size-garbage: %s\n", garbage_buf.buf);
|
||||
foreach_alt_odb(print_alternate, NULL);
|
||||
odb_for_each_alternate(the_repository->objects, print_alternate, NULL);
|
||||
strbuf_release(&loose_buf);
|
||||
strbuf_release(&pack_buf);
|
||||
strbuf_release(&garbage_buf);
|
||||
|
|
|
@ -359,7 +359,8 @@ static void write_head_info(void)
|
|||
|
||||
refs_for_each_fullref_in(get_main_ref_store(the_repository), "",
|
||||
exclude_patterns, show_ref_cb, &seen);
|
||||
for_each_alternate_ref(show_one_alternate_ref, &seen);
|
||||
odb_for_each_alternate_ref(the_repository->objects,
|
||||
show_one_alternate_ref, &seen);
|
||||
|
||||
oidset_clear(&seen);
|
||||
strvec_clear(&excludes_vector);
|
||||
|
|
|
@ -1668,7 +1668,8 @@ static void prepare_possible_alternates(const char *sm_name,
|
|||
die(_("Value '%s' for submodule.alternateErrorStrategy is not recognized"), error_strategy);
|
||||
|
||||
if (!strcmp(sm_alternate, "superproject"))
|
||||
foreach_alt_odb(add_possible_reference_from_superproject, &sas);
|
||||
odb_for_each_alternate(the_repository->objects,
|
||||
add_possible_reference_from_superproject, &sas);
|
||||
else if (!strcmp(sm_alternate, "no"))
|
||||
; /* do nothing */
|
||||
else
|
||||
|
|
|
@ -229,7 +229,7 @@ int create_diagnostics_archive(struct repository *r,
|
|||
strbuf_reset(&buf);
|
||||
strbuf_addstr(&buf, "--add-virtual-file=packs-local.txt:");
|
||||
dir_file_stats(r->objects->sources, &buf);
|
||||
foreach_alt_odb(dir_file_stats, &buf);
|
||||
odb_for_each_alternate(r->objects, dir_file_stats, &buf);
|
||||
strvec_push(&archiver_args, buf.buf);
|
||||
|
||||
strbuf_reset(&buf);
|
||||
|
|
|
@ -115,7 +115,8 @@ static void for_each_cached_alternate(struct fetch_negotiator *negotiator,
|
|||
size_t i;
|
||||
|
||||
if (!initialized) {
|
||||
for_each_alternate_ref(cache_one_alternate, &cache);
|
||||
odb_for_each_alternate_ref(the_repository->objects,
|
||||
cache_one_alternate, &cache);
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
|
|
36
odb.c
36
odb.c
|
@ -494,8 +494,8 @@ static void fill_alternate_refs_command(struct child_process *cmd,
|
|||
}
|
||||
|
||||
static void read_alternate_refs(const char *path,
|
||||
alternate_ref_fn *cb,
|
||||
void *data)
|
||||
odb_for_each_alternate_ref_fn *cb,
|
||||
void *payload)
|
||||
{
|
||||
struct child_process cmd = CHILD_PROCESS_INIT;
|
||||
struct strbuf line = STRBUF_INIT;
|
||||
|
@ -517,7 +517,7 @@ static void read_alternate_refs(const char *path,
|
|||
break;
|
||||
}
|
||||
|
||||
cb(&oid, data);
|
||||
cb(&oid, payload);
|
||||
}
|
||||
|
||||
fclose(fh);
|
||||
|
@ -526,16 +526,16 @@ static void read_alternate_refs(const char *path,
|
|||
}
|
||||
|
||||
struct alternate_refs_data {
|
||||
alternate_ref_fn *fn;
|
||||
void *data;
|
||||
odb_for_each_alternate_ref_fn *fn;
|
||||
void *payload;
|
||||
};
|
||||
|
||||
static int refs_from_alternate_cb(struct odb_source *alternate,
|
||||
void *data)
|
||||
void *payload)
|
||||
{
|
||||
struct strbuf path = STRBUF_INIT;
|
||||
size_t base_len;
|
||||
struct alternate_refs_data *cb = data;
|
||||
struct alternate_refs_data *cb = payload;
|
||||
|
||||
if (!strbuf_realpath(&path, alternate->path, 0))
|
||||
goto out;
|
||||
|
@ -549,29 +549,31 @@ static int refs_from_alternate_cb(struct odb_source *alternate,
|
|||
goto out;
|
||||
strbuf_setlen(&path, base_len);
|
||||
|
||||
read_alternate_refs(path.buf, cb->fn, cb->data);
|
||||
read_alternate_refs(path.buf, cb->fn, cb->payload);
|
||||
|
||||
out:
|
||||
strbuf_release(&path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void for_each_alternate_ref(alternate_ref_fn fn, void *data)
|
||||
void odb_for_each_alternate_ref(struct object_database *odb,
|
||||
odb_for_each_alternate_ref_fn cb, void *payload)
|
||||
{
|
||||
struct alternate_refs_data cb;
|
||||
cb.fn = fn;
|
||||
cb.data = data;
|
||||
foreach_alt_odb(refs_from_alternate_cb, &cb);
|
||||
struct alternate_refs_data data;
|
||||
data.fn = cb;
|
||||
data.payload = payload;
|
||||
odb_for_each_alternate(odb, refs_from_alternate_cb, &data);
|
||||
}
|
||||
|
||||
int foreach_alt_odb(alt_odb_fn fn, void *cb)
|
||||
int odb_for_each_alternate(struct object_database *odb,
|
||||
odb_for_each_alternate_fn cb, void *payload)
|
||||
{
|
||||
struct odb_source *alternate;
|
||||
int r = 0;
|
||||
|
||||
odb_prepare_alternates(the_repository->objects);
|
||||
for (alternate = the_repository->objects->sources->next; alternate; alternate = alternate->next) {
|
||||
r = fn(alternate, cb);
|
||||
odb_prepare_alternates(odb);
|
||||
for (alternate = odb->sources->next; alternate; alternate = alternate->next) {
|
||||
r = cb(alternate, payload);
|
||||
if (r)
|
||||
break;
|
||||
}
|
||||
|
|
23
odb.h
23
odb.h
|
@ -73,11 +73,6 @@ struct odb_source {
|
|||
char *path;
|
||||
};
|
||||
|
||||
typedef int alt_odb_fn(struct odb_source *, void *);
|
||||
int foreach_alt_odb(alt_odb_fn, void*);
|
||||
typedef void alternate_ref_fn(const struct object_id *oid, void *);
|
||||
void for_each_alternate_ref(alternate_ref_fn, void *);
|
||||
|
||||
/*
|
||||
* Replace the current writable object directory with the specified temporary
|
||||
* object directory; returns the former primary object directory.
|
||||
|
@ -192,6 +187,24 @@ void odb_clear(struct object_database *o);
|
|||
*/
|
||||
struct odb_source *odb_find_source(struct object_database *odb, const char *obj_dir);
|
||||
|
||||
/*
|
||||
* Iterate through all alternates of the database and execute the provided
|
||||
* callback function for each of them. Stop iterating once the callback
|
||||
* function returns a non-zero value, in which case the value is bubbled up
|
||||
* from the callback.
|
||||
*/
|
||||
typedef int odb_for_each_alternate_fn(struct odb_source *, void *);
|
||||
int odb_for_each_alternate(struct object_database *odb,
|
||||
odb_for_each_alternate_fn cb, void *payload);
|
||||
|
||||
/*
|
||||
* Iterate through all alternates of the database and yield their respective
|
||||
* references.
|
||||
*/
|
||||
typedef void odb_for_each_alternate_ref_fn(const struct object_id *oid, void *);
|
||||
void odb_for_each_alternate_ref(struct object_database *odb,
|
||||
odb_for_each_alternate_ref_fn cb, void *payload);
|
||||
|
||||
/*
|
||||
* Create a temporary file rooted in the primary alternate's directory, or die
|
||||
* on failure. The filename is taken from "pattern", which should have the
|
||||
|
|
|
@ -1907,7 +1907,8 @@ static void add_alternate_refs_to_pending(struct rev_info *revs,
|
|||
struct add_alternate_refs_data data;
|
||||
data.revs = revs;
|
||||
data.flags = flags;
|
||||
for_each_alternate_ref(add_one_alternate_ref, &data);
|
||||
odb_for_each_alternate_ref(the_repository->objects,
|
||||
add_one_alternate_ref, &data);
|
||||
}
|
||||
|
||||
static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,
|
||||
|
|
Loading…
Reference in New Issue