]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: pass repo when peeling objects
authorPatrick Steinhardt <ps@pks.im>
Fri, 17 May 2024 08:19:04 +0000 (10:19 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 17 May 2024 17:33:39 +0000 (10:33 -0700)
Both `peel_object()` and `peel_iterated_oid()` implicitly rely on
`the_repository` to look up objects. Despite the fact that we want to
get rid of `the_repository`, it also leads to some restrictions in our
ref iterators when trying to retrieve the peeled value for a repository
other than `the_repository`.

Refactor these functions such that both take a repository as argument
and remove the now-unnecessary restrictions.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 files changed:
builtin/describe.c
builtin/gc.c
builtin/pack-objects.c
builtin/repack.c
builtin/show-ref.c
commit-graph.c
ls-refs.c
midx-write.c
object.c
object.h
ref-filter.c
refs.c
refs.h
refs/packed-backend.c
refs/ref-cache.c
refs/reftable-backend.c
t/helper/test-reach.c
tag.c
tag.h
upload-pack.c

index 82aca00c804b8ed6e752a1eef913ceb2a4d28739..e5287eddf2dbaace72f208a1a652bd298f6bc790 100644 (file)
@@ -200,7 +200,7 @@ static int get_name(const char *path, const struct object_id *oid,
        }
 
        /* Is it annotated? */
-       if (!peel_iterated_oid(oid, &peeled)) {
+       if (!peel_iterated_oid(the_repository, oid, &peeled)) {
                is_annotated = !oideq(oid, &peeled);
        } else {
                oidcpy(&peeled, oid);
index 054fca783561840d995785dcd05fc3d436eff922..72bac2554fc4b9c26140cdfc10100db6b5dd6774 100644 (file)
@@ -846,7 +846,7 @@ static int dfs_on_ref(const char *refname UNUSED,
        struct commit_list *stack = NULL;
        struct commit *commit;
 
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                oid = &peeled;
        if (oid_object_info(the_repository, oid, NULL) != OBJ_COMMIT)
                return 0;
index cd2396896dd6ed327aae06d323f992fd538a3281..62ddf41f840d22675ac85ff4a3aec3b717fc732d 100644 (file)
@@ -779,7 +779,7 @@ static int mark_tagged(const char *path UNUSED, const struct object_id *oid,
 
        if (entry)
                entry->tagged = 1;
-       if (!peel_iterated_oid(oid, &peeled)) {
+       if (!peel_iterated_oid(the_repository, oid, &peeled)) {
                entry = packlist_find(&to_pack, &peeled);
                if (entry)
                        entry->tagged = 1;
@@ -3125,7 +3125,7 @@ static int add_ref_tag(const char *tag UNUSED, const struct object_id *oid,
 {
        struct object_id peeled;
 
-       if (!peel_iterated_oid(oid, &peeled) && obj_is_packed(&peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled) && obj_is_packed(&peeled))
                add_tag_chain(oid);
        return 0;
 }
@@ -4074,7 +4074,7 @@ static int mark_bitmap_preferred_tip(const char *refname,
        struct object_id peeled;
        struct object *object;
 
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                oid = &peeled;
 
        object = parse_object_or_die(oid, refname);
index 43491a4cbfcec310e482514344a7659b0460a9fa..58ad82dd97ba13b04c1b7f79ad00c285a48f7da2 100644 (file)
@@ -673,7 +673,7 @@ static int midx_snapshot_ref_one(const char *refname UNUSED,
        struct midx_snapshot_ref_data *data = _data;
        struct object_id peeled;
 
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                oid = &peeled;
 
        if (oidset_insert(&data->seen, oid))
index 151ef3513491a5627217be82376d1ce5995d404b..3114bdc391aa925ee354d85eaf33052ef96af0b8 100644 (file)
@@ -50,7 +50,7 @@ static void show_one(const struct show_one_options *opts,
        if (!opts->deref_tags)
                return;
 
-       if (!peel_iterated_oid(oid, &peeled)) {
+       if (!peel_iterated_oid(the_repository, oid, &peeled)) {
                hex = repo_find_unique_abbrev(the_repository, &peeled, opts->abbrev);
                printf("%s %s^{}\n", hex, refname);
        }
index c4c156ff52b55b6f2281eeeb95c16a50d83dce47..e5dd3553dfe9ef273cbe7a7c29e44dba9d8afada 100644 (file)
@@ -1821,7 +1821,7 @@ static int add_ref_to_set(const char *refname UNUSED,
        struct object_id peeled;
        struct refs_cb_data *data = (struct refs_cb_data *)cb_data;
 
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                oid = &peeled;
        if (oid_object_info(the_repository, oid, NULL) == OBJ_COMMIT)
                oidset_insert(data->commits, oid);
index 8e3ffff8117461a3ed19e8bf9b14882b2331f6f8..398afe4ce3974a842e1e1fec3c4e4880c98f34c5 100644 (file)
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -110,7 +110,7 @@ static int send_ref(const char *refname, const struct object_id *oid,
 
        if (data->peel && oid) {
                struct object_id peeled;
-               if (!peel_iterated_oid(oid, &peeled))
+               if (!peel_iterated_oid(the_repository, oid, &peeled))
                        strbuf_addf(&data->buf, " peeled:%s", oid_to_hex(&peeled));
        }
 
index 9d096d5a28244716f84209f5daec7b8508bba8a1..86173abdb9e7344772973dca920cb4d2fcb2767a 100644 (file)
@@ -664,7 +664,7 @@ static int add_ref_to_pending(const char *refname,
                return 0;
        }
 
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                oid = &peeled;
 
        object = parse_object_or_die(oid, refname);
index 995041926ace7caef09a7d4928a4874bc31d9f36..93b5d97fdb2c3b1060df20bbbb854142790f69c5 100644 (file)
--- a/object.c
+++ b/object.c
@@ -207,12 +207,14 @@ struct object *lookup_object_by_type(struct repository *r,
        }
 }
 
-enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
+enum peel_status peel_object(struct repository *r,
+                            const struct object_id *name,
+                            struct object_id *oid)
 {
-       struct object *o = lookup_unknown_object(the_repository, name);
+       struct object *o = lookup_unknown_object(r, name);
 
        if (o->type == OBJ_NONE) {
-               int type = oid_object_info(the_repository, name, NULL);
+               int type = oid_object_info(r, name, NULL);
                if (type < 0 || !object_as_type(o, type, 0))
                        return PEEL_INVALID;
        }
@@ -220,7 +222,7 @@ enum peel_status peel_object(const struct object_id *name, struct object_id *oid
        if (o->type != OBJ_TAG)
                return PEEL_NON_TAG;
 
-       o = deref_tag_noverify(o);
+       o = deref_tag_noverify(r, o);
        if (!o)
                return PEEL_INVALID;
 
index 31ccd1bb10027cf922c139323d43f9d3d1d5a989..83fcc035e9fcd1eb235ffc77d826edef03614406 100644 (file)
--- a/object.h
+++ b/object.h
@@ -288,7 +288,8 @@ enum peel_status {
  * or is not valid, return PEEL_NON_TAG or PEEL_INVALID, respectively,
  * and leave oid unchanged.
  */
-enum peel_status peel_object(const struct object_id *name, struct object_id *oid);
+enum peel_status peel_object(struct repository *r,
+                            const struct object_id *name, struct object_id *oid);
 
 struct object_list *object_list_insert(struct object *item,
                                       struct object_list **list_p);
index 31cc096644699cb83adff7d05171da9cba27885b..79e7d3910d3d9459b423c1daa6ab1a261bb1d7f1 100644 (file)
@@ -2520,7 +2520,7 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
         * If it is a tag object, see if we use the peeled value. If we do,
         * grab the peeled OID.
         */
-       if (need_tagged && peel_iterated_oid(&obj->oid, &oi_deref.oid))
+       if (need_tagged && peel_iterated_oid(the_repository, &obj->oid, &oi_deref.oid))
                die("bad tag");
 
        return get_object(ref, 1, &obj, &oi_deref, err);
diff --git a/refs.c b/refs.c
index d1b530679f4fa3e66b15a69f398279bf2ce2d9cc..5f1819b33ea6ee9bcb9a300e54bba2357b54e5a2 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -2064,14 +2064,14 @@ int refs_pack_refs(struct ref_store *refs, struct pack_refs_opts *opts)
        return refs->be->pack_refs(refs, opts);
 }
 
-int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
+int peel_iterated_oid(struct repository *r, const struct object_id *base, struct object_id *peeled)
 {
        if (current_ref_iter &&
            (current_ref_iter->oid == base ||
             oideq(current_ref_iter->oid, base)))
                return ref_iterator_peel(current_ref_iter, peeled);
 
-       return peel_object(base, peeled) ? -1 : 0;
+       return peel_object(r, base, peeled) ? -1 : 0;
 }
 
 int refs_create_symref(struct ref_store *refs,
diff --git a/refs.h b/refs.h
index 56d9714293d4f304918e60c537445db69b95594f..e043b6cfa3ba5b60442d3d4f1b8cbcf130e53504 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -127,13 +127,14 @@ void ref_store_release(struct ref_store *ref_store);
  * Return the peeled value of the oid currently being iterated via
  * for_each_ref(), etc. This is equivalent to calling:
  *
- *   peel_object(oid, &peeled);
+ *   peel_object(r, oid, &peeled);
  *
  * with the "oid" value given to the each_ref_fn callback, except
  * that some ref storage may be able to answer the query without
  * actually loading the object in memory.
  */
-int peel_iterated_oid(const struct object_id *base, struct object_id *peeled);
+int peel_iterated_oid(struct repository *r,
+                     const struct object_id *base, struct object_id *peeled);
 
 /**
  * Resolve refname in the nested "gitlink" repository in the specified
index 9c98e6295ffa7d6f2cecbb9c7c8c1fff36b7d630..dfdd718eb948427fbf82cdcad4e0d63ce788450d 100644 (file)
@@ -953,16 +953,13 @@ static int packed_ref_iterator_peel(struct ref_iterator *ref_iterator,
        struct packed_ref_iterator *iter =
                (struct packed_ref_iterator *)ref_iterator;
 
-       if (iter->repo != the_repository)
-               BUG("peeling for non-the_repository is not supported");
-
        if ((iter->base.flags & REF_KNOWS_PEELED)) {
                oidcpy(peeled, &iter->peeled);
                return is_null_oid(&iter->peeled) ? -1 : 0;
        } else if ((iter->base.flags & (REF_ISBROKEN | REF_ISSYMREF))) {
                return -1;
        } else {
-               return peel_object(&iter->oid, peeled) ? -1 : 0;
+               return peel_object(iter->repo, &iter->oid, peeled) ? -1 : 0;
        }
 }
 
@@ -1421,7 +1418,8 @@ static int write_with_updates(struct packed_ref_store *refs,
                        i++;
                } else {
                        struct object_id peeled;
-                       int peel_error = peel_object(&update->new_oid,
+                       int peel_error = peel_object(refs->base.repo,
+                                                    &update->new_oid,
                                                     &peeled);
 
                        if (write_packed_entry(out, update->refname,
index 9f9797209a4545576f3ce5c9a9327c47e3319df1..b6c53fc8ed26068a96698c2b74f8651d776d2e16 100644 (file)
@@ -441,10 +441,7 @@ static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator,
 {
        struct cache_ref_iterator *iter =
                (struct cache_ref_iterator *)ref_iterator;
-
-       if (iter->repo != the_repository)
-               BUG("peeling for non-the_repository is not supported");
-       return peel_object(ref_iterator->oid, peeled) ? -1 : 0;
+       return peel_object(iter->repo, ref_iterator->oid, peeled) ? -1 : 0;
 }
 
 static int cache_ref_iterator_abort(struct ref_iterator *ref_iterator)
index 7b73f73f5913c43165457156bbfa0942078bc270..850466da4bce50cba469c9e5394ea918792cec0b 100644 (file)
@@ -1144,7 +1144,7 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
                        ref.refname = (char *)u->refname;
                        ref.update_index = ts;
 
-                       peel_error = peel_object(&u->new_oid, &peeled);
+                       peel_error = peel_object(arg->refs->base.repo, &u->new_oid, &peeled);
                        if (!peel_error) {
                                ref.value_type = REFTABLE_REF_VAL2;
                                memcpy(ref.value.val2.target_value, peeled.hash, GIT_MAX_RAWSZ);
@@ -2045,6 +2045,7 @@ static int reftable_be_delete_reflog(struct ref_store *ref_store,
 }
 
 struct reflog_expiry_arg {
+       struct reftable_ref_store *refs;
        struct reftable_stack *stack;
        struct reftable_log_record *records;
        struct object_id update_oid;
@@ -2073,7 +2074,7 @@ static int write_reflog_expiry_table(struct reftable_writer *writer, void *cb_da
                ref.refname = (char *)arg->refname;
                ref.update_index = ts;
 
-               if (!peel_object(&arg->update_oid, &peeled)) {
+               if (!peel_object(arg->refs->base.repo, &arg->update_oid, &peeled)) {
                        ref.value_type = REFTABLE_REF_VAL2;
                        memcpy(ref.value.val2.target_value, peeled.hash, GIT_MAX_RAWSZ);
                        memcpy(ref.value.val2.value, arg->update_oid.hash, GIT_MAX_RAWSZ);
@@ -2235,6 +2236,7 @@ static int reftable_be_reflog_expire(struct ref_store *ref_store,
            reftable_ref_record_val1(&ref_record))
                oidread(&arg.update_oid, last_hash);
 
+       arg.refs = refs;
        arg.records = rewritten;
        arg.len = logs_nr;
        arg.stack = stack,
index 1e3b431e3e72116df65e825bed1916d5ff7859e6..1ba226f1f9ca8ae05f0310891428e82d740cb47b 100644 (file)
@@ -62,7 +62,7 @@ int cmd__reach(int ac, const char **av)
                        die("failed to resolve %s", buf.buf + 2);
 
                orig = parse_object(r, &oid);
-               peeled = deref_tag_noverify(orig);
+               peeled = deref_tag_noverify(the_repository, orig);
 
                if (!peeled)
                        die("failed to load commit for input %s resulting in oid %s\n",
diff --git a/tag.c b/tag.c
index fc3834db467dc4e83ca0a24da61a3f39048f3ec2..52bbe508191f36ba38b2d524fba09bb36f8e7248 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -91,10 +91,10 @@ struct object *deref_tag(struct repository *r, struct object *o, const char *war
        return o;
 }
 
-struct object *deref_tag_noverify(struct object *o)
+struct object *deref_tag_noverify(struct repository *r, struct object *o)
 {
        while (o && o->type == OBJ_TAG) {
-               o = parse_object(the_repository, &o->oid);
+               o = parse_object(r, &o->oid);
                if (o && o->type == OBJ_TAG && ((struct tag *)o)->tagged)
                        o = ((struct tag *)o)->tagged;
                else
diff --git a/tag.h b/tag.h
index 3ce8e7219244e1c2ca1c6bd31496e86a1dc25339..c49d7c19ad3c9087e8a115a7a0edcd0c14062520 100644 (file)
--- a/tag.h
+++ b/tag.h
@@ -16,7 +16,7 @@ int parse_tag_buffer(struct repository *r, struct tag *item, const void *data, u
 int parse_tag(struct tag *item);
 void release_tag_memory(struct tag *t);
 struct object *deref_tag(struct repository *r, struct object *, const char *, int);
-struct object *deref_tag_noverify(struct object *);
+struct object *deref_tag_noverify(struct repository *r, struct object *);
 int gpg_verify_tag(const struct object_id *oid,
                   const char *name_to_report, unsigned flags);
 struct object_id *get_tagged_oid(struct tag *tag);
index 8fbd1385153dbfeb801210b9cf0ee970ed724b42..bbfb04c8bd88c3953a2a1fcc26bdcc6ad235bfbe 100644 (file)
@@ -1269,7 +1269,7 @@ static void write_v0_ref(struct upload_pack_data *data,
                packet_fwrite_fmt(stdout, "%s %s\n", oid_to_hex(oid), refname_nons);
        }
        capabilities = NULL;
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                packet_fwrite_fmt(stdout, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
        return;
 }