]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: move object peeling into "object.c"
authorPatrick Steinhardt <ps@pks.im>
Fri, 17 May 2024 08:18:59 +0000 (10:18 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 17 May 2024 17:33:39 +0000 (10:33 -0700)
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>
object.c
object.h
refs.c
refs/refs-internal.h

index 51e384828e96efa9b3a9cbf96f5cf8b1b719856e..995041926ace7caef09a7d4928a4874bc31d9f36 100644 (file)
--- 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;
index 9293e703cccc6acf6205be9c5fae440fff441d5a..31ccd1bb10027cf922c139323d43f9d3d1d5a989 100644 (file)
--- a/object.h
+++ b/object.h
@@ -256,6 +256,40 @@ struct object *lookup_unknown_object(struct repository *r, const struct object_i
 struct object *lookup_object_by_type(struct repository *r, const struct object_id *oid,
                                     enum object_type type);
 
+enum peel_status {
+       /* object was peeled successfully: */
+       PEEL_PEELED = 0,
+
+       /*
+        * object cannot be peeled because the named object (or an
+        * object referred to by a tag in the peel chain), does not
+        * exist.
+        */
+       PEEL_INVALID = -1,
+
+       /* object cannot be peeled because it is not a tag: */
+       PEEL_NON_TAG = -2,
+
+       /* ref_entry contains no peeled value because it is a symref: */
+       PEEL_IS_SYMREF = -3,
+
+       /*
+        * ref_entry cannot be peeled because it is broken (i.e., the
+        * symbolic reference cannot even be resolved to an object
+        * name):
+        */
+       PEEL_BROKEN = -4
+};
+
+/*
+ * Peel the named object; i.e., if the object is a tag, resolve the
+ * tag recursively until a non-tag is found.  If successful, store the
+ * result to oid and return PEEL_PEELED.  If the object is not a tag
+ * 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);
+
 struct object_list *object_list_insert(struct object *item,
                                       struct object_list **list_p);
 
diff --git a/refs.c b/refs.c
index 48323dd28d871e5853187e448d2f2afe783cb06e..d1b530679f4fa3e66b15a69f398279bf2ce2d9cc 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -19,7 +19,6 @@
 #include "object-store-ll.h"
 #include "object.h"
 #include "path.h"
-#include "tag.h"
 #include "submodule.h"
 #include "worktree.h"
 #include "strvec.h"
@@ -425,27 +424,6 @@ static int for_each_filter_refs(const char *refname,
        return filter->fn(refname, oid, flags, filter->cb_data);
 }
 
-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 warn_if_dangling_data {
        struct ref_store *refs;
        FILE *fp;
index 07e24c848124f4f7d98487451afefbc5b88f2116..8d855890815d29ae9ab2c752b9e0d89621c060ac 100644 (file)
@@ -69,40 +69,6 @@ int ref_resolves_to_object(const char *refname,
                           const struct object_id *oid,
                           unsigned int flags);
 
-enum peel_status {
-       /* object was peeled successfully: */
-       PEEL_PEELED = 0,
-
-       /*
-        * object cannot be peeled because the named object (or an
-        * object referred to by a tag in the peel chain), does not
-        * exist.
-        */
-       PEEL_INVALID = -1,
-
-       /* object cannot be peeled because it is not a tag: */
-       PEEL_NON_TAG = -2,
-
-       /* ref_entry contains no peeled value because it is a symref: */
-       PEEL_IS_SYMREF = -3,
-
-       /*
-        * ref_entry cannot be peeled because it is broken (i.e., the
-        * symbolic reference cannot even be resolved to an object
-        * name):
-        */
-       PEEL_BROKEN = -4
-};
-
-/*
- * Peel the named object; i.e., if the object is a tag, resolve the
- * tag recursively until a non-tag is found.  If successful, store the
- * result to oid and return PEEL_PEELED.  If the object is not a tag
- * 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);
-
 /**
  * Information needed for a single ref update. Set new_oid to the new
  * value or to null_oid to delete the ref. To check the old value