]> git.scripts.mit.edu Git - git.git/commitdiff
packed_object_info: make type lookup optional
authorJeff King <peff@peff.net>
Fri, 12 Jul 2013 06:32:25 +0000 (02:32 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 12 Jul 2013 17:14:06 +0000 (10:14 -0700)
Currently, packed_object_info can save some work by not
calculating the size or disk_size of the object if the
caller is not interested. However, it always calculates the
true object type, whether the caller cares or not, and only
optionally returns the easy-to-get "representation type".

Let's swap these types. The function will now return the
representation type (or OBJ_BAD on failure), and will only
optionally fill in the true type.

There should be no behavior change yet, as the only caller,
sha1_object_info_extended, will always feed it a type
pointer.

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

index 8fb10e451cba0e07481c0c6f40ee97a7039c6360..fa2809884bfc9100bf78bec61e9ee5809a1d2abe 100644 (file)
@@ -1780,7 +1780,7 @@ static enum object_type packed_to_object_type(struct packed_git *p,
 }
 
 static int packed_object_info(struct packed_git *p, off_t obj_offset,
-                             unsigned long *sizep, int *rtype,
+                             enum object_type *typep, unsigned long *sizep,
                              unsigned long *disk_sizep)
 {
        struct pack_window *w_curs = NULL;
@@ -1788,11 +1788,12 @@ static int packed_object_info(struct packed_git *p, off_t obj_offset,
        off_t curpos = obj_offset;
        enum object_type type;
 
+       /*
+        * We always get the representation type, but only convert it to
+        * a "real" type later if the caller is interested.
+        */
        type = unpack_object_header(p, &w_curs, &curpos, &size);
 
-       if (rtype)
-               *rtype = type; /* representation type */
-
        if (sizep) {
                if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
                        off_t tmp_pos = curpos;
@@ -1817,7 +1818,13 @@ static int packed_object_info(struct packed_git *p, off_t obj_offset,
                *disk_sizep = revidx[1].offset - obj_offset;
        }
 
-       type = packed_to_object_type(p, obj_offset, type, &w_curs, curpos);
+       if (typep) {
+               *typep = packed_to_object_type(p, obj_offset, type, &w_curs, curpos);
+               if (*typep < 0) {
+                       type = OBJ_BAD;
+                       goto out;
+               }
+       }
 
 out:
        unuse_pack(&w_curs);
@@ -2452,11 +2459,11 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi)
                        return -1;
        }
 
-       type = packed_object_info(e.p, e.offset, oi->sizep, &rtype,
-                                 oi->disk_sizep);
-       if (type < 0) {
+       rtype = packed_object_info(e.p, e.offset, &type, oi->sizep,
+                                  oi->disk_sizep);
+       if (rtype < 0) {
                mark_bad_packed_object(e.p, sha1);
-               type = sha1_object_info_extended(sha1, oi);
+               return sha1_object_info_extended(sha1, oi);
        } else if (in_delta_base_cache(e.p, e.offset)) {
                oi->whence = OI_DBCACHED;
        } else {