@@ -1578,24 +1578,25 @@ static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
15781578 hashmap_add (& delta_base_cache , & ent -> ent );
15791579}
15801580
1581- int packed_object_info (struct repository * r , struct packed_git * p ,
1581+ int packed_object_info (struct packed_git * p ,
15821582 off_t obj_offset , struct object_info * oi )
15831583{
15841584 struct pack_window * w_curs = NULL ;
15851585 unsigned long size ;
15861586 off_t curpos = obj_offset ;
1587- enum object_type type ;
1587+ enum object_type type = OBJ_NONE ;
1588+ int ret ;
15881589
15891590 /*
15901591 * We always get the representation type, but only convert it to
15911592 * a "real" type later if the caller is interested.
15921593 */
15931594 if (oi -> contentp ) {
1594- * oi -> contentp = cache_or_unpack_entry (r , p , obj_offset , oi -> sizep ,
1595+ * oi -> contentp = cache_or_unpack_entry (p -> repo , p , obj_offset , oi -> sizep ,
15951596 & type );
15961597 if (!* oi -> contentp )
15971598 type = OBJ_BAD ;
1598- } else {
1599+ } else if ( oi -> sizep || oi -> typep || oi -> delta_base_oid ) {
15991600 type = unpack_object_header (p , & w_curs , & curpos , & size );
16001601 }
16011602
@@ -1605,12 +1606,12 @@ int packed_object_info(struct repository *r, struct packed_git *p,
16051606 off_t base_offset = get_delta_base (p , & w_curs , & tmp_pos ,
16061607 type , obj_offset );
16071608 if (!base_offset ) {
1608- type = OBJ_BAD ;
1609+ ret = -1 ;
16091610 goto out ;
16101611 }
16111612 * oi -> sizep = get_size_from_delta (p , & w_curs , tmp_pos );
16121613 if (* oi -> sizep == 0 ) {
1613- type = OBJ_BAD ;
1614+ ret = -1 ;
16141615 goto out ;
16151616 }
16161617 } else {
@@ -1623,7 +1624,7 @@ int packed_object_info(struct repository *r, struct packed_git *p,
16231624 if (offset_to_pack_pos (p , obj_offset , & pos ) < 0 ) {
16241625 error ("could not find object at offset %" PRIuMAX " "
16251626 "in pack %s" , (uintmax_t )obj_offset , p -> pack_name );
1626- type = OBJ_BAD ;
1627+ ret = -1 ;
16271628 goto out ;
16281629 }
16291630
@@ -1632,12 +1633,12 @@ int packed_object_info(struct repository *r, struct packed_git *p,
16321633
16331634 if (oi -> typep ) {
16341635 enum object_type ptot ;
1635- ptot = packed_to_object_type (r , p , obj_offset ,
1636+ ptot = packed_to_object_type (p -> repo , p , obj_offset ,
16361637 type , & w_curs , curpos );
16371638 if (oi -> typep )
16381639 * oi -> typep = ptot ;
16391640 if (ptot < 0 ) {
1640- type = OBJ_BAD ;
1641+ ret = -1 ;
16411642 goto out ;
16421643 }
16431644 }
@@ -1647,19 +1648,37 @@ int packed_object_info(struct repository *r, struct packed_git *p,
16471648 if (get_delta_base_oid (p , & w_curs , curpos ,
16481649 oi -> delta_base_oid ,
16491650 type , obj_offset ) < 0 ) {
1650- type = OBJ_BAD ;
1651+ ret = -1 ;
16511652 goto out ;
16521653 }
16531654 } else
16541655 oidclr (oi -> delta_base_oid , p -> repo -> hash_algo );
16551656 }
16561657
1657- oi -> whence = in_delta_base_cache (p , obj_offset ) ? OI_DBCACHED :
1658- OI_PACKED ;
1658+ oi -> whence = OI_PACKED ;
1659+ oi -> u .packed .offset = obj_offset ;
1660+ oi -> u .packed .pack = p ;
1661+
1662+ switch (type ) {
1663+ case OBJ_NONE :
1664+ oi -> u .packed .type = PACKED_OBJECT_TYPE_UNKNOWN ;
1665+ break ;
1666+ case OBJ_REF_DELTA :
1667+ oi -> u .packed .type = PACKED_OBJECT_TYPE_REF_DELTA ;
1668+ break ;
1669+ case OBJ_OFS_DELTA :
1670+ oi -> u .packed .type = PACKED_OBJECT_TYPE_OFS_DELTA ;
1671+ break ;
1672+ default :
1673+ oi -> u .packed .type = PACKED_OBJECT_TYPE_FULL ;
1674+ break ;
1675+ }
1676+
1677+ ret = 0 ;
16591678
16601679out :
16611680 unuse_pack (& w_curs );
1662- return type ;
1681+ return ret ;
16631682}
16641683
16651684static void * unpack_compressed_entry (struct packed_git * p ,
@@ -2133,7 +2152,7 @@ int packfile_store_read_object_info(struct packfile_store *store,
21332152 unsigned flags UNUSED )
21342153{
21352154 struct pack_entry e ;
2136- int rtype ;
2155+ int ret ;
21372156
21382157 if (!find_pack_entry (store , oid , & e ))
21392158 return 1 ;
@@ -2145,19 +2164,12 @@ int packfile_store_read_object_info(struct packfile_store *store,
21452164 if (!oi )
21462165 return 0 ;
21472166
2148- rtype = packed_object_info (store -> source -> odb -> repo , e .p , e .offset , oi );
2149- if (rtype < 0 ) {
2167+ ret = packed_object_info (e .p , e .offset , oi );
2168+ if (ret < 0 ) {
21502169 mark_bad_packed_object (e .p , oid );
21512170 return -1 ;
21522171 }
21532172
2154- if (oi -> whence == OI_PACKED ) {
2155- oi -> u .packed .offset = e .offset ;
2156- oi -> u .packed .pack = e .p ;
2157- oi -> u .packed .is_delta = (rtype == OBJ_REF_DELTA ||
2158- rtype == OBJ_OFS_DELTA );
2159- }
2160-
21612173 return 0 ;
21622174}
21632175
@@ -2554,7 +2566,8 @@ int packfile_store_read_object_stream(struct odb_read_stream **out,
25542566 oi .sizep = & size ;
25552567
25562568 if (packfile_store_read_object_info (store , oid , & oi , 0 ) ||
2557- oi .u .packed .is_delta ||
2569+ oi .u .packed .type == PACKED_OBJECT_TYPE_REF_DELTA ||
2570+ oi .u .packed .type == PACKED_OBJECT_TYPE_OFS_DELTA ||
25582571 repo_settings_get_big_file_threshold (store -> source -> odb -> repo ) >= size )
25592572 return -1 ;
25602573
0 commit comments