@@ -970,11 +970,12 @@ struct unpacked {
970
970
* one.
971
971
*/
972
972
static int try_delta (struct unpacked * trg , struct unpacked * src ,
973
- struct delta_index * src_index , unsigned max_depth )
973
+ unsigned max_depth )
974
974
{
975
975
struct object_entry * trg_entry = trg -> entry ;
976
976
struct object_entry * src_entry = src -> entry ;
977
- unsigned long size , src_size , delta_size , sizediff , max_size ;
977
+ unsigned long trg_size , src_size , delta_size , sizediff , max_size , sz ;
978
+ char type [10 ];
978
979
void * delta_buf ;
979
980
980
981
/* Don't bother doing diffs between different types */
@@ -1009,19 +1010,38 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
1009
1010
return 0 ;
1010
1011
1011
1012
/* Now some size filtering heuristics. */
1012
- size = trg_entry -> size ;
1013
- max_size = size /2 - 20 ;
1013
+ trg_size = trg_entry -> size ;
1014
+ max_size = trg_size /2 - 20 ;
1014
1015
max_size = max_size * (max_depth - src_entry -> depth ) / max_depth ;
1015
1016
if (max_size == 0 )
1016
1017
return 0 ;
1017
1018
if (trg_entry -> delta && trg_entry -> delta_size <= max_size )
1018
1019
max_size = trg_entry -> delta_size - 1 ;
1019
1020
src_size = src_entry -> size ;
1020
- sizediff = src_size < size ? size - src_size : 0 ;
1021
+ sizediff = src_size < trg_size ? trg_size - src_size : 0 ;
1021
1022
if (sizediff >= max_size )
1022
1023
return 0 ;
1023
1024
1024
- delta_buf = create_delta (src_index , trg -> data , size , & delta_size , max_size );
1025
+ /* Load data if not already done */
1026
+ if (!trg -> data ) {
1027
+ trg -> data = read_sha1_file (trg_entry -> sha1 , type , & sz );
1028
+ if (sz != trg_size )
1029
+ die ("object %s inconsistent object length (%lu vs %lu)" ,
1030
+ sha1_to_hex (trg_entry -> sha1 ), sz , trg_size );
1031
+ }
1032
+ if (!src -> data ) {
1033
+ src -> data = read_sha1_file (src_entry -> sha1 , type , & sz );
1034
+ if (sz != src_size )
1035
+ die ("object %s inconsistent object length (%lu vs %lu)" ,
1036
+ sha1_to_hex (src_entry -> sha1 ), sz , src_size );
1037
+ }
1038
+ if (!src -> index ) {
1039
+ src -> index = create_delta_index (src -> data , src_size );
1040
+ if (!src -> index )
1041
+ die ("out of memory" );
1042
+ }
1043
+
1044
+ delta_buf = create_delta (src -> index , trg -> data , trg_size , & delta_size , max_size );
1025
1045
if (!delta_buf )
1026
1046
return 0 ;
1027
1047
@@ -1054,8 +1074,6 @@ static void find_deltas(struct object_entry **list, int window, int depth)
1054
1074
while (-- i >= 0 ) {
1055
1075
struct object_entry * entry = list [i ];
1056
1076
struct unpacked * n = array + idx ;
1057
- unsigned long size ;
1058
- char type [10 ];
1059
1077
int j ;
1060
1078
1061
1079
if (!entry -> preferred_base )
@@ -1082,11 +1100,8 @@ static void find_deltas(struct object_entry **list, int window, int depth)
1082
1100
free_delta_index (n -> index );
1083
1101
n -> index = NULL ;
1084
1102
free (n -> data );
1103
+ n -> data = NULL ;
1085
1104
n -> entry = entry ;
1086
- n -> data = read_sha1_file (entry -> sha1 , type , & size );
1087
- if (size != entry -> size )
1088
- die ("object %s inconsistent object length (%lu vs %lu)" ,
1089
- sha1_to_hex (entry -> sha1 ), size , entry -> size );
1090
1105
1091
1106
j = window ;
1092
1107
while (-- j > 0 ) {
@@ -1097,7 +1112,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
1097
1112
m = array + other_idx ;
1098
1113
if (!m -> entry )
1099
1114
break ;
1100
- if (try_delta (n , m , m -> index , depth ) < 0 )
1115
+ if (try_delta (n , m , depth ) < 0 )
1101
1116
break ;
1102
1117
}
1103
1118
/* if we made n a delta, and if n is already at max
@@ -1107,10 +1122,6 @@ static void find_deltas(struct object_entry **list, int window, int depth)
1107
1122
if (entry -> delta && depth <= entry -> depth )
1108
1123
continue ;
1109
1124
1110
- n -> index = create_delta_index (n -> data , size );
1111
- if (!n -> index )
1112
- die ("out of memory" );
1113
-
1114
1125
idx ++ ;
1115
1126
if (idx >= window )
1116
1127
idx = 0 ;
0 commit comments