mktree: do not check type of remote objects

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>

Richard Oliver committed Jun 21, 2022 at 14:59 UTC 817b0f60271086fb53fca2e56d426507b82c7dbd
1 file changed +9 -2
builtin/mktree.c
+9 -2
@@ -74,6 +74,7 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing)
74 unsigned mode;
75 enum object_type mode_type; /* object type derived from mode */
76 enum object_type obj_type; /* object type derived from sha */
77 + struct object_info oi = OBJECT_INFO_INIT;
78 char *path, *to_free = NULL;
79 struct object_id oid;
80
@@ -116,8 +117,14 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing)
117 path, ptr, type_name(mode_type));
118 }
119
119 - /* Check the type of object identified by sha1 */
120 - obj_type = oid_object_info(the_repository, &oid, NULL);
120 + /* Check the type of object identified by oid without fetching objects */
121 + oi.typep = &obj_type;
122 + if (oid_object_info_extended(the_repository, &oid, &oi,
123 + OBJECT_INFO_LOOKUP_REPLACE |
124 + OBJECT_INFO_QUICK |
125 + OBJECT_INFO_SKIP_FETCH_OBJECT) < 0)
126 + obj_type = -1;
127 +
128 if (obj_type < 0) {
129 if (allow_missing) {
130 ; /* no problem - missing objects are presumed to be of the right type */