Merge branch 'po/read-graft-line' into next
authorJunio C Hamano <gitster@pobox.com>
Tue, 22 Aug 2017 17:36:59 +0000 (10:36 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 22 Aug 2017 17:36:59 +0000 (10:36 -0700)
Conversion from uchar[20] to struct object_id continues; this is to
ensure that we do not assume sizeof(struct object_id) is the same
as the length of SHA-1 hash (or length of longest hash we support).

* po/read-graft-line:
commit: rewrite read_graft_line
commit: allocate array using object_id size
commit: replace the raw buffer with strbuf in read_graft_line
sha1_file: fix definition of null_sha1

1  2 
sha1_file.c
diff --combined sha1_file.c
index 189a1c3cdd14ad7a9d7e72a4577f47449e2ed5f6,f5b5bec52fd071029124dc69e6ba165b946f5a53..6da17a9c8762c7e79c1c26714722e482713a07aa
@@@ -32,7 -32,7 +32,7 @@@
  #define SZ_FMT PRIuMAX
  static inline uintmax_t sz_fmt(size_t s) { return s; }
  
- const unsigned char null_sha1[20];
+ const unsigned char null_sha1[GIT_MAX_RAWSZ];
  const struct object_id null_oid;
  const struct object_id empty_tree_oid = {
        EMPTY_TREE_SHA1_BIN_LITERAL
@@@ -347,7 -347,6 +347,7 @@@ static int alt_odb_usable(struct strbu
   * SHA1, an extra slash for the first level indirection, and the
   * terminating NUL.
   */
 +static void read_info_alternates(const char * relative_base, int depth);
  static int link_alt_odb_entry(const char *entry, const char *relative_base,
        int depth, const char *normalized_objdir)
  {
@@@ -449,7 -448,7 +449,7 @@@ static void link_alt_odb_entries(const 
        strbuf_release(&objdirbuf);
  }
  
 -void read_info_alternates(const char * relative_base, int depth)
 +static void read_info_alternates(const char * relative_base, int depth)
  {
        char *map;
        size_t mapsz;
@@@ -2445,9 -2444,6 +2445,9 @@@ int packed_object_info(struct packed_gi
                        hashclr(oi->delta_base_sha1);
        }
  
 +      oi->whence = in_delta_base_cache(p, obj_offset) ? OI_DBCACHED :
 +                                                        OI_PACKED;
 +
  out:
        unuse_pack(&w_curs);
        return type;
@@@ -2546,8 -2542,8 +2546,8 @@@ void *unpack_entry(struct packed_git *p
                                error("bad packed object CRC for %s",
                                      sha1_to_hex(sha1));
                                mark_bad_packed_object(p, sha1);
 -                              unuse_pack(&w_curs);
 -                              return NULL;
 +                              data = NULL;
 +                              goto out;
                        }
                }
  
        if (final_size)
                *final_size = size;
  
 +out:
        unuse_pack(&w_curs);
  
        if (delta_stack != small_delta_stack)
@@@ -2764,6 -2759,7 +2764,6 @@@ off_t find_pack_entry_one(const unsigne
        const uint32_t *level1_ofs = p->index_data;
        const unsigned char *index = p->index_data;
        unsigned hi, lo, stride;
 -      static int use_lookup = -1;
        static int debug_lookup = -1;
  
        if (debug_lookup < 0)
                printf("%02x%02x%02x... lo %u hi %u nr %"PRIu32"\n",
                       sha1[0], sha1[1], sha1[2], lo, hi, p->num_objects);
  
 -      if (use_lookup < 0)
 -              use_lookup = !!getenv("GIT_USE_LOOKUP");
 -      if (use_lookup) {
 -              int pos = sha1_entry_pos(index, stride, 0,
 -                                       lo, hi, p->num_objects, sha1);
 -              if (pos < 0)
 -                      return 0;
 -              return nth_packed_object_offset(p, pos);
 -      }
 -
 -      do {
 +      while (lo < hi) {
                unsigned mi = (lo + hi) / 2;
                int cmp = hashcmp(index + mi * stride, sha1);
  
                        hi = mi;
                else
                        lo = mi+1;
 -      } while (lo < hi);
 +      }
        return 0;
  }
  
@@@ -2967,7 -2973,6 +2967,7 @@@ static int sha1_loose_object_info(cons
        if (oi->sizep == &size_scratch)
                oi->sizep = NULL;
        strbuf_release(&hdrbuf);
 +      oi->whence = OI_LOOSE;
        return (status < 0) ? status : 0;
  }
  
@@@ -3005,8 -3010,10 +3005,8 @@@ int sha1_object_info_extended(const uns
  
        if (!find_pack_entry(real, &e)) {
                /* Most likely it's a loose object. */
 -              if (!sha1_loose_object_info(real, oi, flags)) {
 -                      oi->whence = OI_LOOSE;
 +              if (!sha1_loose_object_info(real, oi, flags))
                        return 0;
 -              }
  
                /* Not a loose object; someone else may have just packed it. */
                if (flags & OBJECT_INFO_QUICK) {
        if (rtype < 0) {
                mark_bad_packed_object(e.p, real);
                return sha1_object_info_extended(real, oi, 0);
 -      } else if (in_delta_base_cache(e.p, e.offset)) {
 -              oi->whence = OI_DBCACHED;
 -      } else {
 -              oi->whence = OI_PACKED;
 +      } else if (oi->whence == OI_PACKED) {
                oi->u.packed.offset = e.offset;
                oi->u.packed.pack = e.p;
                oi->u.packed.is_delta = (rtype == OBJ_REF_DELTA ||
@@@ -3053,6 -3063,30 +3053,6 @@@ int sha1_object_info(const unsigned cha
        return type;
  }
  
 -static void *read_packed_sha1(const unsigned char *sha1,
 -                            enum object_type *type, unsigned long *size)
 -{
 -      struct pack_entry e;
 -      void *data;
 -
 -      if (!find_pack_entry(sha1, &e))
 -              return NULL;
 -      data = cache_or_unpack_entry(e.p, e.offset, size, type);
 -      if (!data) {
 -              /*
 -               * We're probably in deep shit, but let's try to fetch
 -               * the required object anyway from another pack or loose.
 -               * This should happen only in the presence of a corrupted
 -               * pack, and is better than failing outright.
 -               */
 -              error("failed to read object %s at offset %"PRIuMAX" from %s",
 -                    sha1_to_hex(sha1), (uintmax_t)e.offset, e.p->pack_name);
 -              mark_bad_packed_object(e.p, sha1);
 -              data = read_object(sha1, type, size);
 -      }
 -      return data;
 -}
 -
  int pretend_sha1_file(void *buf, unsigned long len, enum object_type type,
                      unsigned char *sha1)
  {
@@@ -3435,7 -3469,7 +3435,7 @@@ int force_object_loose(const unsigned c
  
        if (has_loose_object(sha1))
                return 0;
 -      buf = read_packed_sha1(sha1, &type, &len);
 +      buf = read_object(sha1, &type, &len);
        if (!buf)
                return error("cannot read sha1_file for %s", sha1_to_hex(sha1));
        hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1;