summaryrefslogtreecommitdiffstats
path: root/object.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2024-05-17 10:18:59 +0200
committerJunio C Hamano <gitster@pobox.com>2024-05-17 19:33:39 +0200
commit19c76e8235747a61a703fe3bf7a5e40caf6fa3fa (patch)
tree846d0436f27f1c9e8c228bce9a8b323293558a7a /object.c
parentrefs: pass ref store when detecting dangling symrefs (diff)
downloadgit-19c76e8235747a61a703fe3bf7a5e40caf6fa3fa.tar.xz
git-19c76e8235747a61a703fe3bf7a5e40caf6fa3fa.zip
refs: move object peeling into "object.c"
Peeling an object has nothing to do with refs, but we still have the code in "refs.c". Move it over into "object.c", which is a more natural place to put it. Ideally, we'd also move `peel_iterated_oid()` over into "object.c". But this function is tied to the refs interfaces because it uses a global ref iterator variable to optimize peeling when the iterator already has the peeled object ID readily available. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'object.c')
-rw-r--r--object.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/object.c b/object.c
index 51e384828e..995041926a 100644
--- a/object.c
+++ b/object.c
@@ -207,6 +207,27 @@ struct object *lookup_object_by_type(struct repository *r,
}
}
+enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
+{
+ struct object *o = lookup_unknown_object(the_repository, name);
+
+ if (o->type == OBJ_NONE) {
+ int type = oid_object_info(the_repository, name, NULL);
+ if (type < 0 || !object_as_type(o, type, 0))
+ return PEEL_INVALID;
+ }
+
+ if (o->type != OBJ_TAG)
+ return PEEL_NON_TAG;
+
+ o = deref_tag_noverify(o);
+ if (!o)
+ return PEEL_INVALID;
+
+ oidcpy(oid, &o->oid);
+ return PEEL_PEELED;
+}
+
struct object *parse_object_buffer(struct repository *r, const struct object_id *oid, enum object_type type, unsigned long size, void *buffer, int *eaten_p)
{
struct object *obj;