]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mktree: do not check type of remote objects
authorRichard Oliver <roliver@roku.com>
Tue, 21 Jun 2022 13:59:39 +0000 (14:59 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 21 Jun 2022 17:12:15 +0000 (10:12 -0700)
With 31c8221a (mktree: validate entry type in input, 2009-05-14), we
called the sha1_object_info() API to obtain the type information, but
allowed the call to silently fail when the object was missing locally,
so that we can sanity-check the types opportunistically when the
object did exist.

The implementation is understandable because back then there was no
lazy/on-demand downloading of individual objects from the promisor
remotes that causes a long delay and materializes the object, hence
defeating the point of using "--missing".  The design is hurting us
now.

We could bypass the opportunistic type/mode consistency check
altogether when "--missing" is given, but instead, use the
oid_object_info_extended() API and tell it that we are only interested
in objects that locally exist and are immediately available by passing
OBJECT_INFO_SKIP_FETCH_OBJECT bit to it.  That way, we will still
retain the cheap and opportunistic sanity check for local objects.

Signed-off-by: Richard Oliver <roliver@roku.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/mktree.c

index 902edba6d2cb43d69addf875a0e5a58e3abe879d..06d81400f558152292718a57c384e12078e2b9be 100644 (file)
@@ -74,6 +74,7 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing)
        unsigned mode;
        enum object_type mode_type; /* object type derived from mode */
        enum object_type obj_type; /* object type derived from sha */
+       struct object_info oi = OBJECT_INFO_INIT;
        char *path, *to_free = NULL;
        struct object_id oid;
 
@@ -116,8 +117,14 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing)
                        path, ptr, type_name(mode_type));
        }
 
-       /* Check the type of object identified by sha1 */
-       obj_type = oid_object_info(the_repository, &oid, NULL);
+       /* Check the type of object identified by oid without fetching objects */
+       oi.typep = &obj_type;
+       if (oid_object_info_extended(the_repository, &oid, &oi,
+                                    OBJECT_INFO_LOOKUP_REPLACE |
+                                    OBJECT_INFO_QUICK |
+                                    OBJECT_INFO_SKIP_FETCH_OBJECT) < 0)
+               obj_type = -1;
+
        if (obj_type < 0) {
                if (allow_missing) {
                        ; /* no problem - missing objects are presumed to be of the right type */