@@ -430,6 +430,15 @@ static int reftable_ref_record_is_deletion_void(const void *p)
430
430
(const struct reftable_ref_record * )p );
431
431
}
432
432
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
+
433
442
static struct reftable_record_vtable reftable_ref_record_vtable = {
434
443
.key = & reftable_ref_record_key ,
435
444
.type = BLOCK_TYPE_REF ,
@@ -439,6 +448,7 @@ static struct reftable_record_vtable reftable_ref_record_vtable = {
439
448
.decode = & reftable_ref_record_decode ,
440
449
.release = & reftable_ref_record_release_void ,
441
450
.is_deletion = & reftable_ref_record_is_deletion_void ,
451
+ .equal = & reftable_ref_record_equal_void ,
442
452
};
443
453
444
454
static void reftable_obj_record_key (const void * r , struct strbuf * dest )
@@ -572,6 +582,25 @@ static int not_a_deletion(const void *p)
572
582
return 0 ;
573
583
}
574
584
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
+
575
604
static struct reftable_record_vtable reftable_obj_record_vtable = {
576
605
.key = & reftable_obj_record_key ,
577
606
.type = BLOCK_TYPE_OBJ ,
@@ -580,7 +609,8 @@ static struct reftable_record_vtable reftable_obj_record_vtable = {
580
609
.encode = & reftable_obj_record_encode ,
581
610
.decode = & reftable_obj_record_decode ,
582
611
.release = & reftable_obj_record_release ,
583
- .is_deletion = not_a_deletion ,
612
+ .is_deletion = & not_a_deletion ,
613
+ .equal = & reftable_obj_record_equal_void ,
584
614
};
585
615
586
616
void 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)
881
911
return !memcmp (a , b , sz );
882
912
}
883
913
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
+
884
922
int reftable_log_record_equal (const struct reftable_log_record * a ,
885
923
const struct reftable_log_record * b , int hash_size )
886
924
{
@@ -924,6 +962,7 @@ static struct reftable_record_vtable reftable_log_record_vtable = {
924
962
.decode = & reftable_log_record_decode ,
925
963
.release = & reftable_log_record_release_void ,
926
964
.is_deletion = & reftable_log_record_is_deletion_void ,
965
+ .equal = & reftable_log_record_equal_void
927
966
};
928
967
929
968
struct reftable_record reftable_new_record (uint8_t typ )
@@ -1042,6 +1081,14 @@ static int reftable_index_record_decode(void *rec, struct strbuf key,
1042
1081
return start .len - in .len ;
1043
1082
}
1044
1083
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
+
1045
1092
static struct reftable_record_vtable reftable_index_record_vtable = {
1046
1093
.key = & reftable_index_record_key ,
1047
1094
.type = BLOCK_TYPE_INDEX ,
@@ -1051,6 +1098,7 @@ static struct reftable_record_vtable reftable_index_record_vtable = {
1051
1098
.decode = & reftable_index_record_decode ,
1052
1099
.release = & reftable_index_record_release ,
1053
1100
.is_deletion = & not_a_deletion ,
1101
+ .equal = & reftable_index_record_equal ,
1054
1102
};
1055
1103
1056
1104
void reftable_record_key (struct reftable_record * rec , struct strbuf * dest )
@@ -1098,6 +1146,13 @@ int reftable_record_is_deletion(struct reftable_record *rec)
1098
1146
return rec -> ops -> is_deletion (rec -> data );
1099
1147
}
1100
1148
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
+
1101
1156
void reftable_record_from_ref (struct reftable_record * rec ,
1102
1157
struct reftable_ref_record * ref_rec )
1103
1158
{
0 commit comments