@@ -430,6 +430,15 @@ static int reftable_ref_record_is_deletion_void(const void *p)
430430 (const struct reftable_ref_record * )p );
431431}
432432
433+
434+ static int reftable_ref_record_equal_void (const void * a ,
435+ const void * b , int hash_size )
436+ {
437+ struct reftable_ref_record * ra = (struct reftable_ref_record * ) a ;
438+ struct reftable_ref_record * rb = (struct reftable_ref_record * ) b ;
439+ return reftable_ref_record_equal (ra , rb , hash_size );
440+ }
441+
433442static struct reftable_record_vtable reftable_ref_record_vtable = {
434443 .key = & reftable_ref_record_key ,
435444 .type = BLOCK_TYPE_REF ,
@@ -439,6 +448,7 @@ static struct reftable_record_vtable reftable_ref_record_vtable = {
439448 .decode = & reftable_ref_record_decode ,
440449 .release = & reftable_ref_record_release_void ,
441450 .is_deletion = & reftable_ref_record_is_deletion_void ,
451+ .equal = & reftable_ref_record_equal_void ,
442452};
443453
444454static void reftable_obj_record_key (const void * r , struct strbuf * dest )
@@ -572,6 +582,25 @@ static int not_a_deletion(const void *p)
572582 return 0 ;
573583}
574584
585+ static int reftable_obj_record_equal_void (const void * a , const void * b , int hash_size )
586+ {
587+ struct reftable_obj_record * ra = (struct reftable_obj_record * ) a ;
588+ struct reftable_obj_record * rb = (struct reftable_obj_record * ) b ;
589+
590+ if (ra -> hash_prefix_len != rb -> hash_prefix_len
591+ || ra -> offset_len != rb -> offset_len )
592+ return 0 ;
593+
594+ if (ra -> hash_prefix_len &&
595+ memcmp (ra -> hash_prefix , rb -> hash_prefix , ra -> hash_prefix_len ))
596+ return 0 ;
597+ if (ra -> offset_len &&
598+ memcmp (ra -> offsets , rb -> offsets , ra -> offset_len * sizeof (uint64_t )))
599+ return 0 ;
600+
601+ return 1 ;
602+ }
603+
575604static struct reftable_record_vtable reftable_obj_record_vtable = {
576605 .key = & reftable_obj_record_key ,
577606 .type = BLOCK_TYPE_OBJ ,
@@ -580,7 +609,8 @@ static struct reftable_record_vtable reftable_obj_record_vtable = {
580609 .encode = & reftable_obj_record_encode ,
581610 .decode = & reftable_obj_record_decode ,
582611 .release = & reftable_obj_record_release ,
583- .is_deletion = not_a_deletion ,
612+ .is_deletion = & not_a_deletion ,
613+ .equal = & reftable_obj_record_equal_void ,
584614};
585615
586616void reftable_log_record_print (struct reftable_log_record * log ,
@@ -881,6 +911,14 @@ static int zero_hash_eq(uint8_t *a, uint8_t *b, int sz)
881911 return !memcmp (a , b , sz );
882912}
883913
914+ static int reftable_log_record_equal_void (const void * a ,
915+ const void * b , int hash_size )
916+ {
917+ return reftable_log_record_equal ((struct reftable_log_record * ) a ,
918+ (struct reftable_log_record * ) b ,
919+ hash_size );
920+ }
921+
884922int reftable_log_record_equal (const struct reftable_log_record * a ,
885923 const struct reftable_log_record * b , int hash_size )
886924{
@@ -924,6 +962,7 @@ static struct reftable_record_vtable reftable_log_record_vtable = {
924962 .decode = & reftable_log_record_decode ,
925963 .release = & reftable_log_record_release_void ,
926964 .is_deletion = & reftable_log_record_is_deletion_void ,
965+ .equal = & reftable_log_record_equal_void
927966};
928967
929968struct reftable_record reftable_new_record (uint8_t typ )
@@ -1042,6 +1081,14 @@ static int reftable_index_record_decode(void *rec, struct strbuf key,
10421081 return start .len - in .len ;
10431082}
10441083
1084+ static int reftable_index_record_equal (const void * a , const void * b , int hash_size )
1085+ {
1086+ struct reftable_index_record * ia = (struct reftable_index_record * ) a ;
1087+ struct reftable_index_record * ib = (struct reftable_index_record * ) b ;
1088+
1089+ return ia -> offset == ib -> offset && !strbuf_cmp (& ia -> last_key , & ib -> last_key );
1090+ }
1091+
10451092static struct reftable_record_vtable reftable_index_record_vtable = {
10461093 .key = & reftable_index_record_key ,
10471094 .type = BLOCK_TYPE_INDEX ,
@@ -1051,6 +1098,7 @@ static struct reftable_record_vtable reftable_index_record_vtable = {
10511098 .decode = & reftable_index_record_decode ,
10521099 .release = & reftable_index_record_release ,
10531100 .is_deletion = & not_a_deletion ,
1101+ .equal = & reftable_index_record_equal ,
10541102};
10551103
10561104void reftable_record_key (struct reftable_record * rec , struct strbuf * dest )
@@ -1098,6 +1146,13 @@ int reftable_record_is_deletion(struct reftable_record *rec)
10981146 return rec -> ops -> is_deletion (rec -> data );
10991147}
11001148
1149+ int reftable_record_equal (struct reftable_record * a , struct reftable_record * b , int hash_size )
1150+ {
1151+ if (a -> ops != b -> ops )
1152+ return 0 ;
1153+ return a -> ops -> equal (a -> data , b -> data , hash_size );
1154+ }
1155+
11011156void reftable_record_from_ref (struct reftable_record * rec ,
11021157 struct reftable_ref_record * ref_rec )
11031158{
0 commit comments