Skip to content

Commit 817b0f6

Browse files
Richard Olivergitster
authored andcommitted
mktree: do not check type of remote objects
With 31c8221 (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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent dc8c8de commit 817b0f6

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

builtin/mktree.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing)
7474
unsigned mode;
7575
enum object_type mode_type; /* object type derived from mode */
7676
enum object_type obj_type; /* object type derived from sha */
77+
struct object_info oi = OBJECT_INFO_INIT;
7778
char *path, *to_free = NULL;
7879
struct object_id oid;
7980

@@ -116,8 +117,14 @@ static void mktree_line(char *buf, int nul_term_line, int allow_missing)
116117
path, ptr, type_name(mode_type));
117118
}
118119

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+
121128
if (obj_type < 0) {
122129
if (allow_missing) {
123130
; /* no problem - missing objects are presumed to be of the right type */

0 commit comments

Comments
 (0)