mirror of
https://github.com/git/git.git
synced 2025-02-06 10:24:25 +00:00
packfile: pass down repository to for_each_packed_object
The function `for_each_packed_object` currently relies on the global variable `the_repository`. To eliminate global variable usage in `packfile.c`, we should progressively shift the dependency on the_repository to higher layers. Let's remove its usage from this function and closely related function `is_promisor_object`. Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
cc656f4eb2
commit
c87910b96b
@ -827,15 +827,16 @@ static int batch_objects(struct batch_options *opt)
|
||||
cb.seen = &seen;
|
||||
|
||||
for_each_loose_object(batch_unordered_loose, &cb, 0);
|
||||
for_each_packed_object(batch_unordered_packed, &cb,
|
||||
FOR_EACH_OBJECT_PACK_ORDER);
|
||||
for_each_packed_object(the_repository, batch_unordered_packed,
|
||||
&cb, FOR_EACH_OBJECT_PACK_ORDER);
|
||||
|
||||
oidset_clear(&seen);
|
||||
} else {
|
||||
struct oid_array sa = OID_ARRAY_INIT;
|
||||
|
||||
for_each_loose_object(collect_loose_object, &sa, 0);
|
||||
for_each_packed_object(collect_packed_object, &sa, 0);
|
||||
for_each_packed_object(the_repository, collect_packed_object,
|
||||
&sa, 0);
|
||||
|
||||
oid_array_for_each_unique(&sa, batch_object_cb, &cb);
|
||||
|
||||
|
@ -150,7 +150,7 @@ static int mark_object(struct object *obj, enum object_type type,
|
||||
return 0;
|
||||
obj->flags |= REACHABLE;
|
||||
|
||||
if (is_promisor_object(&obj->oid))
|
||||
if (is_promisor_object(the_repository, &obj->oid))
|
||||
/*
|
||||
* Further recursion does not need to be performed on this
|
||||
* object since it is a promisor object (so it does not need to
|
||||
@ -270,7 +270,7 @@ static void check_reachable_object(struct object *obj)
|
||||
* do a full fsck
|
||||
*/
|
||||
if (!(obj->flags & HAS_OBJ)) {
|
||||
if (is_promisor_object(&obj->oid))
|
||||
if (is_promisor_object(the_repository, &obj->oid))
|
||||
return;
|
||||
if (has_object_pack(the_repository, &obj->oid))
|
||||
return; /* it is in pack - forget about it */
|
||||
@ -391,7 +391,10 @@ static void check_connectivity(void)
|
||||
* traversal.
|
||||
*/
|
||||
for_each_loose_object(mark_loose_unreachable_referents, NULL, 0);
|
||||
for_each_packed_object(mark_packed_unreachable_referents, NULL, 0);
|
||||
for_each_packed_object(the_repository,
|
||||
mark_packed_unreachable_referents,
|
||||
NULL,
|
||||
0);
|
||||
}
|
||||
|
||||
/* Look up all the requirements, warn about missing objects.. */
|
||||
@ -488,7 +491,7 @@ static void fsck_handle_reflog_oid(const char *refname, struct object_id *oid,
|
||||
refname, timestamp);
|
||||
obj->flags |= USED;
|
||||
mark_object_reachable(obj);
|
||||
} else if (!is_promisor_object(oid)) {
|
||||
} else if (!is_promisor_object(the_repository, oid)) {
|
||||
error(_("%s: invalid reflog entry %s"),
|
||||
refname, oid_to_hex(oid));
|
||||
errors_found |= ERROR_REACHABLE;
|
||||
@ -531,7 +534,7 @@ static int fsck_handle_ref(const char *refname, const char *referent UNUSED, con
|
||||
|
||||
obj = parse_object(the_repository, oid);
|
||||
if (!obj) {
|
||||
if (is_promisor_object(oid)) {
|
||||
if (is_promisor_object(the_repository, oid)) {
|
||||
/*
|
||||
* Increment default_refs anyway, because this is a
|
||||
* valid ref.
|
||||
@ -966,7 +969,8 @@ int cmd_fsck(int argc,
|
||||
|
||||
if (connectivity_only) {
|
||||
for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
|
||||
for_each_packed_object(mark_packed_for_connectivity, NULL, 0);
|
||||
for_each_packed_object(the_repository,
|
||||
mark_packed_for_connectivity, NULL, 0);
|
||||
} else {
|
||||
prepare_alt_odb(the_repository);
|
||||
for (odb = the_repository->objects->odb; odb; odb = odb->next)
|
||||
@ -1011,7 +1015,7 @@ int cmd_fsck(int argc,
|
||||
&oid);
|
||||
|
||||
if (!obj || !(obj->flags & HAS_OBJ)) {
|
||||
if (is_promisor_object(&oid))
|
||||
if (is_promisor_object(the_repository, &oid))
|
||||
continue;
|
||||
error(_("%s: object missing"), oid_to_hex(&oid));
|
||||
errors_found |= ERROR_OBJECT;
|
||||
|
@ -3858,7 +3858,8 @@ static void show_object__ma_allow_promisor(struct object *obj, const char *name,
|
||||
* Quietly ignore EXPECTED missing objects. This avoids problems with
|
||||
* staging them now and getting an odd error later.
|
||||
*/
|
||||
if (!has_object(the_repository, &obj->oid, 0) && is_promisor_object(&obj->oid))
|
||||
if (!has_object(the_repository, &obj->oid, 0) &&
|
||||
is_promisor_object(to_pack.repo, &obj->oid))
|
||||
return;
|
||||
|
||||
show_object(obj, name, data);
|
||||
@ -3927,7 +3928,9 @@ static int add_object_in_unpacked_pack(const struct object_id *oid,
|
||||
|
||||
static void add_objects_in_unpacked_packs(void)
|
||||
{
|
||||
if (for_each_packed_object(add_object_in_unpacked_pack, NULL,
|
||||
if (for_each_packed_object(to_pack.repo,
|
||||
add_object_in_unpacked_pack,
|
||||
NULL,
|
||||
FOR_EACH_OBJECT_PACK_ORDER |
|
||||
FOR_EACH_OBJECT_LOCAL_ONLY |
|
||||
FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
|
||||
|
@ -404,7 +404,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
|
||||
* {type -> existing pack order} ordering when computing deltas instead
|
||||
* of a {type -> size} ordering, which may produce better deltas.
|
||||
*/
|
||||
for_each_packed_object(write_oid, &cmd,
|
||||
for_each_packed_object(the_repository, write_oid, &cmd,
|
||||
FOR_EACH_OBJECT_PROMISOR_ONLY);
|
||||
|
||||
if (cmd.in == -1) {
|
||||
|
@ -121,7 +121,7 @@ static inline void finish_object__ma(struct object *obj)
|
||||
return;
|
||||
|
||||
case MA_ALLOW_PROMISOR:
|
||||
if (is_promisor_object(&obj->oid))
|
||||
if (is_promisor_object(the_repository, &obj->oid))
|
||||
return;
|
||||
die("unexpected missing %s object '%s'",
|
||||
type_name(obj->type), oid_to_hex(&obj->oid));
|
||||
|
@ -1960,7 +1960,7 @@ static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
|
||||
ctx->progress = start_delayed_progress(
|
||||
_("Finding commits for commit graph among packed objects"),
|
||||
ctx->approx_nr_objects);
|
||||
for_each_packed_object(add_packed_commits, ctx,
|
||||
for_each_packed_object(ctx->r, add_packed_commits, ctx,
|
||||
FOR_EACH_OBJECT_PACK_ORDER);
|
||||
if (ctx->progress_done < ctx->approx_nr_objects)
|
||||
display_progress(ctx->progress, ctx->approx_nr_objects);
|
||||
|
2
fsck.c
2
fsck.c
@ -1295,7 +1295,7 @@ static int fsck_blobs(struct oidset *blobs_found, struct oidset *blobs_done,
|
||||
|
||||
buf = repo_read_object_file(the_repository, oid, &type, &size);
|
||||
if (!buf) {
|
||||
if (is_promisor_object(oid))
|
||||
if (is_promisor_object(the_repository, oid))
|
||||
continue;
|
||||
ret |= report(options,
|
||||
oid, OBJ_BLOB, msg_missing,
|
||||
|
@ -75,7 +75,7 @@ static void process_blob(struct traversal_context *ctx,
|
||||
*/
|
||||
if (ctx->revs->exclude_promisor_objects &&
|
||||
!repo_has_object_file(the_repository, &obj->oid) &&
|
||||
is_promisor_object(&obj->oid))
|
||||
is_promisor_object(ctx->revs->repo, &obj->oid))
|
||||
return;
|
||||
|
||||
pathlen = path->len;
|
||||
@ -180,7 +180,7 @@ static void process_tree(struct traversal_context *ctx,
|
||||
* an incomplete list of missing objects.
|
||||
*/
|
||||
if (revs->exclude_promisor_objects &&
|
||||
is_promisor_object(&obj->oid))
|
||||
is_promisor_object(revs->repo, &obj->oid))
|
||||
return;
|
||||
|
||||
if (!revs->do_not_die_on_missing_objects)
|
||||
|
@ -550,7 +550,7 @@ typedef int each_packed_object_fn(const struct object_id *oid,
|
||||
int for_each_object_in_pack(struct packed_git *p,
|
||||
each_packed_object_fn, void *data,
|
||||
enum for_each_object_flags flags);
|
||||
int for_each_packed_object(each_packed_object_fn, void *,
|
||||
enum for_each_object_flags flags);
|
||||
int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
|
||||
void *data, enum for_each_object_flags flags);
|
||||
|
||||
#endif /* OBJECT_STORE_LL_H */
|
||||
|
14
packfile.c
14
packfile.c
@ -2200,15 +2200,15 @@ int for_each_object_in_pack(struct packed_git *p,
|
||||
return r;
|
||||
}
|
||||
|
||||
int for_each_packed_object(each_packed_object_fn cb, void *data,
|
||||
enum for_each_object_flags flags)
|
||||
int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
|
||||
void *data, enum for_each_object_flags flags)
|
||||
{
|
||||
struct packed_git *p;
|
||||
int r = 0;
|
||||
int pack_errors = 0;
|
||||
|
||||
prepare_packed_git(the_repository);
|
||||
for (p = get_all_packs(the_repository); p; p = p->next) {
|
||||
prepare_packed_git(repo);
|
||||
for (p = get_all_packs(repo); p; p = p->next) {
|
||||
if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
|
||||
continue;
|
||||
if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
|
||||
@ -2286,14 +2286,14 @@ static int add_promisor_object(const struct object_id *oid,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_promisor_object(const struct object_id *oid)
|
||||
int is_promisor_object(struct repository *r, const struct object_id *oid)
|
||||
{
|
||||
static struct oidset promisor_objects;
|
||||
static int promisor_objects_prepared;
|
||||
|
||||
if (!promisor_objects_prepared) {
|
||||
if (repo_has_promisor_remote(the_repository)) {
|
||||
for_each_packed_object(add_promisor_object,
|
||||
if (repo_has_promisor_remote(r)) {
|
||||
for_each_packed_object(r, add_promisor_object,
|
||||
&promisor_objects,
|
||||
FOR_EACH_OBJECT_PROMISOR_ONLY |
|
||||
FOR_EACH_OBJECT_PACK_ORDER);
|
||||
|
@ -201,7 +201,7 @@ int has_object_kept_pack(struct repository *r, const struct object_id *oid,
|
||||
* Return 1 if an object in a promisor packfile is or refers to the given
|
||||
* object, 0 otherwise.
|
||||
*/
|
||||
int is_promisor_object(const struct object_id *oid);
|
||||
int is_promisor_object(struct repository *r, const struct object_id *oid);
|
||||
|
||||
/*
|
||||
* Expose a function for fuzz testing.
|
||||
|
@ -283,7 +283,7 @@ void promisor_remote_get_direct(struct repository *repo,
|
||||
}
|
||||
|
||||
for (i = 0; i < remaining_nr; i++) {
|
||||
if (is_promisor_object(&remaining_oids[i]))
|
||||
if (is_promisor_object(repo, &remaining_oids[i]))
|
||||
die(_("could not fetch %s from promisor remote"),
|
||||
oid_to_hex(&remaining_oids[i]));
|
||||
}
|
||||
|
@ -324,7 +324,7 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
|
||||
if (ignore_in_core_kept_packs)
|
||||
flags |= FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS;
|
||||
|
||||
r = for_each_packed_object(add_recent_packed, &data, flags);
|
||||
r = for_each_packed_object(revs->repo, add_recent_packed, &data, flags);
|
||||
|
||||
done:
|
||||
oidset_clear(&data.extra_recent_oids);
|
||||
|
@ -390,7 +390,8 @@ static struct object *get_reference(struct rev_info *revs, const char *name,
|
||||
if (!object) {
|
||||
if (revs->ignore_missing)
|
||||
return NULL;
|
||||
if (revs->exclude_promisor_objects && is_promisor_object(oid))
|
||||
if (revs->exclude_promisor_objects &&
|
||||
is_promisor_object(revs->repo, oid))
|
||||
return NULL;
|
||||
if (revs->do_not_die_on_missing_objects) {
|
||||
oidset_insert(&revs->missing_commits, oid);
|
||||
@ -432,7 +433,7 @@ static struct commit *handle_commit(struct rev_info *revs,
|
||||
if (revs->ignore_missing_links || (flags & UNINTERESTING))
|
||||
return NULL;
|
||||
if (revs->exclude_promisor_objects &&
|
||||
is_promisor_object(&tag->tagged->oid))
|
||||
is_promisor_object(revs->repo, &tag->tagged->oid))
|
||||
return NULL;
|
||||
if (revs->do_not_die_on_missing_objects && oid) {
|
||||
oidset_insert(&revs->missing_commits, oid);
|
||||
@ -1211,7 +1212,7 @@ static int process_parents(struct rev_info *revs, struct commit *commit,
|
||||
revs->do_not_die_on_missing_objects;
|
||||
if (repo_parse_commit_gently(revs->repo, p, gently) < 0) {
|
||||
if (revs->exclude_promisor_objects &&
|
||||
is_promisor_object(&p->object.oid)) {
|
||||
is_promisor_object(revs->repo, &p->object.oid)) {
|
||||
if (revs->first_parent_only)
|
||||
break;
|
||||
continue;
|
||||
@ -3915,7 +3916,7 @@ int prepare_revision_walk(struct rev_info *revs)
|
||||
revs->treesame.name = "treesame";
|
||||
|
||||
if (revs->exclude_promisor_objects) {
|
||||
for_each_packed_object(mark_uninteresting, revs,
|
||||
for_each_packed_object(revs->repo, mark_uninteresting, revs,
|
||||
FOR_EACH_OBJECT_PROMISOR_ONLY);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user