]> git.ipfire.org Git - thirdparty/git.git/commitdiff
oid_object_info_convert(): stop using string for object type
authorJeff King <peff@peff.net>
Fri, 16 May 2025 04:49:50 +0000 (00:49 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 May 2025 16:43:10 +0000 (09:43 -0700)
In oid_object_info_convert(), we convert objects between their sha1 and
sha256 variants. To do this, we naturally need to know the type, which
we get from oid_object_info_extended() using its type_name strbuf
option.

But getting the value as a string (versus an object_type enum) is not
helpful. Since we do not allow unknown types, the regular enum is
sufficient. And the resulting code is a bit simpler, as we no longer
have to manage the extra allocation nor convert the string to an enum
ourselves.

Note that at first glance, it might seem like we should retain the error
check for "type == -1" to catch bogus types found by the underlying
parser. But we don't need it, as an unknown type would have yielded an
error from the call to oid_object_info_extended(), which would already
have caused us to return an error.

In fact, I suspect this was always impossible to trigger. Even when we
were converting the string to a type enum ourselves, an invalid type
would never have escaped oid_object_info_extended(), since we never
passed the (now removed) OBJECT_INFO_ALLOW_UNKNOWN_TYPE option.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
object-store.c

index 2f51d0e3b037e32d5ebe9eaed14ade7a9be5e910..b8f6955ea74174352545c0d53c3c675a2c21b246 100644 (file)
@@ -727,7 +727,7 @@ static int oid_object_info_convert(struct repository *r,
 {
        const struct git_hash_algo *input_algo = &hash_algos[input_oid->algo];
        int do_die = flags & OBJECT_INFO_DIE_IF_CORRUPT;
-       struct strbuf type_name = STRBUF_INIT;
+       enum object_type type;
        struct object_id oid, delta_base_oid;
        struct object_info new_oi, *oi;
        unsigned long size;
@@ -753,7 +753,7 @@ static int oid_object_info_convert(struct repository *r,
                if (input_oi->sizep || input_oi->contentp) {
                        new_oi.contentp = &content;
                        new_oi.sizep = &size;
-                       new_oi.type_name = &type_name;
+                       new_oi.typep = &type;
                }
                oi = &new_oi;
        }
@@ -766,12 +766,7 @@ static int oid_object_info_convert(struct repository *r,
 
        if (new_oi.contentp) {
                struct strbuf outbuf = STRBUF_INIT;
-               enum object_type type;
 
-               type = type_from_string_gently(type_name.buf, type_name.len,
-                                              !do_die);
-               if (type == -1)
-                       return -1;
                if (type != OBJ_BLOB) {
                        ret = convert_object_file(the_repository, &outbuf,
                                                  the_hash_algo, input_algo,
@@ -788,10 +783,8 @@ static int oid_object_info_convert(struct repository *r,
                        *input_oi->contentp = content;
                else
                        free(content);
-               if (input_oi->type_name)
-                       *input_oi->type_name = type_name;
-               else
-                       strbuf_release(&type_name);
+               if (input_oi->typep)
+                       *input_oi->typep = type;
        }
        if (new_oi.delta_base_oid == &delta_base_oid) {
                if (repo_oid_to_algop(r, &delta_base_oid, input_algo,