1
- #define DISABLE_SIGN_COMPARE_WARNINGS
2
-
3
1
#include "git-compat-util.h"
4
2
#include "abspath.h"
5
3
#include "config.h"
24
22
#define BITMAP_POS_UNKNOWN (~((uint32_t)0))
25
23
#define MIDX_CHUNK_FANOUT_SIZE (sizeof(uint32_t) * 256)
26
24
#define MIDX_CHUNK_LARGE_OFFSET_WIDTH (sizeof(uint64_t))
25
+ #define NO_PREFERRED_PACK (~((uint32_t)0))
27
26
28
27
extern int midx_checksum_valid (struct multi_pack_index * m );
29
28
extern void clear_midx_files_ext (const char * object_dir , const char * ext ,
@@ -104,7 +103,7 @@ struct write_midx_context {
104
103
unsigned large_offsets_needed :1 ;
105
104
uint32_t num_large_offsets ;
106
105
107
- int preferred_pack_idx ;
106
+ uint32_t preferred_pack_idx ;
108
107
109
108
int incremental ;
110
109
uint32_t num_multi_pack_indexes_before ;
@@ -260,7 +259,7 @@ static void midx_fanout_sort(struct midx_fanout *fanout)
260
259
static void midx_fanout_add_midx_fanout (struct midx_fanout * fanout ,
261
260
struct multi_pack_index * m ,
262
261
uint32_t cur_fanout ,
263
- int preferred_pack )
262
+ uint32_t preferred_pack )
264
263
{
265
264
uint32_t start = m -> num_objects_in_base , end ;
266
265
uint32_t cur_object ;
@@ -274,7 +273,7 @@ static void midx_fanout_add_midx_fanout(struct midx_fanout *fanout,
274
273
end = m -> num_objects_in_base + ntohl (m -> chunk_oid_fanout [cur_fanout ]);
275
274
276
275
for (cur_object = start ; cur_object < end ; cur_object ++ ) {
277
- if ((preferred_pack > -1 ) &&
276
+ if ((preferred_pack != NO_PREFERRED_PACK ) &&
278
277
(preferred_pack == nth_midxed_pack_int_id (m , cur_object ))) {
279
278
/*
280
279
* Objects from preferred packs are added
@@ -364,7 +363,8 @@ static void compute_sorted_entries(struct write_midx_context *ctx,
364
363
preferred , cur_fanout );
365
364
}
366
365
367
- if (-1 < ctx -> preferred_pack_idx && ctx -> preferred_pack_idx < start_pack )
366
+ if (ctx -> preferred_pack_idx != NO_PREFERRED_PACK &&
367
+ ctx -> preferred_pack_idx < start_pack )
368
368
midx_fanout_add_pack_fanout (& fanout , ctx -> info ,
369
369
ctx -> preferred_pack_idx , 1 ,
370
370
cur_fanout );
@@ -843,7 +843,7 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
843
843
uint32_t commits_nr ,
844
844
unsigned flags )
845
845
{
846
- int ret , i ;
846
+ int ret ;
847
847
uint16_t options = 0 ;
848
848
struct bitmap_writer writer ;
849
849
struct pack_idx_entry * * index ;
@@ -871,7 +871,7 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
871
871
* this order).
872
872
*/
873
873
ALLOC_ARRAY (index , pdata -> nr_objects );
874
- for (i = 0 ; i < pdata -> nr_objects ; i ++ )
874
+ for (uint32_t i = 0 ; i < pdata -> nr_objects ; i ++ )
875
875
index [i ] = & pdata -> objects [i ].idx ;
876
876
877
877
bitmap_writer_init (& writer , ctx -> repo , pdata ,
@@ -892,7 +892,7 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
892
892
* happens between bitmap_writer_build_type_index() and
893
893
* bitmap_writer_finish().
894
894
*/
895
- for (i = 0 ; i < pdata -> nr_objects ; i ++ )
895
+ for (uint32_t i = 0 ; i < pdata -> nr_objects ; i ++ )
896
896
index [ctx -> pack_order [i ]] = & pdata -> objects [i ].idx ;
897
897
898
898
bitmap_writer_select_commits (& writer , commits , commits_nr );
@@ -920,39 +920,21 @@ static struct multi_pack_index *lookup_multi_pack_index(struct repository *r,
920
920
return get_multi_pack_index (source );
921
921
}
922
922
923
- static int fill_packs_from_midx (struct write_midx_context * ctx ,
924
- const char * preferred_pack_name , uint32_t flags )
923
+ static int fill_packs_from_midx (struct write_midx_context * ctx )
925
924
{
926
925
struct multi_pack_index * m ;
927
926
928
927
for (m = ctx -> m ; m ; m = m -> base_midx ) {
929
928
uint32_t i ;
930
929
931
930
for (i = 0 ; i < m -> num_packs ; i ++ ) {
932
- ALLOC_GROW (ctx -> info , ctx -> nr + 1 , ctx -> alloc );
933
-
934
- /*
935
- * If generating a reverse index, need to have
936
- * packed_git's loaded to compare their
937
- * mtimes and object count.
938
- *
939
- * If a preferred pack is specified, need to
940
- * have packed_git's loaded to ensure the chosen
941
- * preferred pack has a non-zero object count.
942
- */
943
- if (flags & MIDX_WRITE_REV_INDEX ||
944
- preferred_pack_name ) {
945
- if (prepare_midx_pack (ctx -> repo , m ,
946
- m -> num_packs_in_base + i )) {
947
- error (_ ("could not load pack" ));
948
- return 1 ;
949
- }
950
-
951
- if (open_pack_index (m -> packs [i ]))
952
- die (_ ("could not open index for %s" ),
953
- m -> packs [i ]-> pack_name );
931
+ if (prepare_midx_pack (ctx -> repo , m ,
932
+ m -> num_packs_in_base + i )) {
933
+ error (_ ("could not load pack" ));
934
+ return 1 ;
954
935
}
955
936
937
+ ALLOC_GROW (ctx -> info , ctx -> nr + 1 , ctx -> alloc );
956
938
fill_pack_info (& ctx -> info [ctx -> nr ++ ], m -> packs [i ],
957
939
m -> pack_names [i ],
958
940
m -> num_packs_in_base + i );
@@ -1056,11 +1038,13 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1056
1038
{
1057
1039
struct strbuf midx_name = STRBUF_INIT ;
1058
1040
unsigned char midx_hash [GIT_MAX_RAWSZ ];
1059
- uint32_t i , start_pack ;
1041
+ uint32_t start_pack ;
1060
1042
struct hashfile * f = NULL ;
1061
1043
struct lock_file lk ;
1062
1044
struct tempfile * incr ;
1063
- struct write_midx_context ctx = { 0 };
1045
+ struct write_midx_context ctx = {
1046
+ .preferred_pack_idx = NO_PREFERRED_PACK ,
1047
+ };
1064
1048
int bitmapped_packs_concat_len = 0 ;
1065
1049
int pack_name_concat_len = 0 ;
1066
1050
int dropped_packs = 0 ;
@@ -1123,8 +1107,8 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1123
1107
ctx .num_multi_pack_indexes_before ++ ;
1124
1108
m = m -> base_midx ;
1125
1109
}
1126
- } else if (ctx .m && fill_packs_from_midx (& ctx , preferred_pack_name ,
1127
- flags ) < 0 ) {
1110
+ } else if (ctx .m && fill_packs_from_midx (& ctx )) {
1111
+ result = 1 ;
1128
1112
goto cleanup ;
1129
1113
}
1130
1114
@@ -1168,22 +1152,22 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1168
1152
goto cleanup ; /* nothing to do */
1169
1153
1170
1154
if (preferred_pack_name ) {
1171
- ctx .preferred_pack_idx = -1 ;
1155
+ ctx .preferred_pack_idx = NO_PREFERRED_PACK ;
1172
1156
1173
- for (i = 0 ; i < ctx .nr ; i ++ ) {
1157
+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
1174
1158
if (!cmp_idx_or_pack_name (preferred_pack_name ,
1175
1159
ctx .info [i ].pack_name )) {
1176
1160
ctx .preferred_pack_idx = i ;
1177
1161
break ;
1178
1162
}
1179
1163
}
1180
1164
1181
- if (ctx .preferred_pack_idx == -1 )
1165
+ if (ctx .preferred_pack_idx == NO_PREFERRED_PACK )
1182
1166
warning (_ ("unknown preferred pack: '%s'" ),
1183
1167
preferred_pack_name );
1184
1168
} else if (ctx .nr &&
1185
1169
(flags & (MIDX_WRITE_REV_INDEX | MIDX_WRITE_BITMAP ))) {
1186
- struct packed_git * oldest = ctx .info [ctx . preferred_pack_idx ].p ;
1170
+ struct packed_git * oldest = ctx .info [0 ].p ;
1187
1171
ctx .preferred_pack_idx = 0 ;
1188
1172
1189
1173
if (packs_to_drop && packs_to_drop -> nr )
@@ -1195,7 +1179,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1195
1179
* pack-order has all of its objects selected from that pack
1196
1180
* (and not another pack containing a duplicate)
1197
1181
*/
1198
- for (i = 1 ; i < ctx .nr ; i ++ ) {
1182
+ for (size_t i = 1 ; i < ctx .nr ; i ++ ) {
1199
1183
struct packed_git * p = ctx .info [i ].p ;
1200
1184
1201
1185
if (!oldest -> num_objects || p -> mtime < oldest -> mtime ) {
@@ -1211,18 +1195,23 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1211
1195
* objects to resolve, so the preferred value doesn't
1212
1196
* matter.
1213
1197
*/
1214
- ctx .preferred_pack_idx = -1 ;
1198
+ ctx .preferred_pack_idx = NO_PREFERRED_PACK ;
1215
1199
}
1216
1200
} else {
1217
1201
/*
1218
1202
* otherwise don't mark any pack as preferred to avoid
1219
1203
* interfering with expiration logic below
1220
1204
*/
1221
- ctx .preferred_pack_idx = -1 ;
1205
+ ctx .preferred_pack_idx = NO_PREFERRED_PACK ;
1222
1206
}
1223
1207
1224
- if (ctx .preferred_pack_idx > -1 ) {
1208
+ if (ctx .preferred_pack_idx != NO_PREFERRED_PACK ) {
1225
1209
struct packed_git * preferred = ctx .info [ctx .preferred_pack_idx ].p ;
1210
+
1211
+ if (open_pack_index (preferred ))
1212
+ die (_ ("failed to open preferred pack %s" ),
1213
+ ctx .info [ctx .preferred_pack_idx ].pack_name );
1214
+
1226
1215
if (!preferred -> num_objects ) {
1227
1216
error (_ ("cannot select preferred pack %s with no objects" ),
1228
1217
preferred -> pack_name );
@@ -1234,7 +1223,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1234
1223
compute_sorted_entries (& ctx , start_pack );
1235
1224
1236
1225
ctx .large_offsets_needed = 0 ;
1237
- for (i = 0 ; i < ctx .entries_nr ; i ++ ) {
1226
+ for (size_t i = 0 ; i < ctx .entries_nr ; i ++ ) {
1238
1227
if (ctx .entries [i ].offset > 0x7fffffff )
1239
1228
ctx .num_large_offsets ++ ;
1240
1229
if (ctx .entries [i ].offset > 0xffffffff )
@@ -1244,10 +1233,10 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1244
1233
QSORT (ctx .info , ctx .nr , pack_info_compare );
1245
1234
1246
1235
if (packs_to_drop && packs_to_drop -> nr ) {
1247
- int drop_index = 0 ;
1236
+ size_t drop_index = 0 ;
1248
1237
int missing_drops = 0 ;
1249
1238
1250
- for (i = 0 ; i < ctx .nr && drop_index < packs_to_drop -> nr ; i ++ ) {
1239
+ for (size_t i = 0 ; i < ctx .nr && drop_index < packs_to_drop -> nr ; i ++ ) {
1251
1240
int cmp = strcmp (ctx .info [i ].pack_name ,
1252
1241
packs_to_drop -> items [drop_index ].string );
1253
1242
@@ -1278,7 +1267,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1278
1267
* pack_perm[old_id] = new_id
1279
1268
*/
1280
1269
ALLOC_ARRAY (ctx .pack_perm , ctx .nr );
1281
- for (i = 0 ; i < ctx .nr ; i ++ ) {
1270
+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
1282
1271
if (ctx .info [i ].expired ) {
1283
1272
dropped_packs ++ ;
1284
1273
ctx .pack_perm [ctx .info [i ].orig_pack_int_id ] = PACK_EXPIRED ;
@@ -1287,7 +1276,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1287
1276
}
1288
1277
}
1289
1278
1290
- for (i = 0 ; i < ctx .nr ; i ++ ) {
1279
+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
1291
1280
if (ctx .info [i ].expired )
1292
1281
continue ;
1293
1282
pack_name_concat_len += strlen (ctx .info [i ].pack_name ) + 1 ;
@@ -1334,13 +1323,15 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1334
1323
incr = mks_tempfile_m (midx_name .buf , 0444 );
1335
1324
if (!incr ) {
1336
1325
error (_ ("unable to create temporary MIDX layer" ));
1337
- return -1 ;
1326
+ result = -1 ;
1327
+ goto cleanup ;
1338
1328
}
1339
1329
1340
1330
if (adjust_shared_perm (r , get_tempfile_path (incr ))) {
1341
1331
error (_ ("unable to adjust shared permissions for '%s'" ),
1342
1332
get_tempfile_path (incr ));
1343
- return -1 ;
1333
+ result = -1 ;
1334
+ goto cleanup ;
1344
1335
}
1345
1336
1346
1337
f = hashfd (r -> hash_algo , get_tempfile_fd (incr ),
@@ -1431,6 +1422,9 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1431
1422
* have been freed in the previous if block.
1432
1423
*/
1433
1424
1425
+ if (ctx .num_multi_pack_indexes_before == UINT32_MAX )
1426
+ die ("too many multi-pack-indexes" );
1427
+
1434
1428
CALLOC_ARRAY (keep_hashes , ctx .num_multi_pack_indexes_before + 1 );
1435
1429
1436
1430
if (ctx .incremental ) {
@@ -1440,34 +1434,38 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1440
1434
1441
1435
if (!chainf ) {
1442
1436
error_errno (_ ("unable to open multi-pack-index chain file" ));
1443
- return -1 ;
1437
+ result = -1 ;
1438
+ goto cleanup ;
1444
1439
}
1445
1440
1446
- if (link_midx_to_chain (ctx .base_midx ) < 0 )
1447
- return -1 ;
1441
+ if (link_midx_to_chain (ctx .base_midx ) < 0 ) {
1442
+ result = -1 ;
1443
+ goto cleanup ;
1444
+ }
1448
1445
1449
1446
get_split_midx_filename_ext (r -> hash_algo , & final_midx_name ,
1450
1447
object_dir , midx_hash , MIDX_EXT_MIDX );
1451
1448
1452
1449
if (rename_tempfile (& incr , final_midx_name .buf ) < 0 ) {
1453
1450
error_errno (_ ("unable to rename new multi-pack-index layer" ));
1454
- return -1 ;
1451
+ result = -1 ;
1452
+ goto cleanup ;
1455
1453
}
1456
1454
1457
1455
strbuf_release (& final_midx_name );
1458
1456
1459
1457
keep_hashes [ctx .num_multi_pack_indexes_before ] =
1460
1458
xstrdup (hash_to_hex_algop (midx_hash , r -> hash_algo ));
1461
1459
1462
- for (i = 0 ; i < ctx .num_multi_pack_indexes_before ; i ++ ) {
1460
+ for (uint32_t i = 0 ; i < ctx .num_multi_pack_indexes_before ; i ++ ) {
1463
1461
uint32_t j = ctx .num_multi_pack_indexes_before - i - 1 ;
1464
1462
1465
1463
keep_hashes [j ] = xstrdup (hash_to_hex_algop (get_midx_checksum (m ),
1466
1464
r -> hash_algo ));
1467
1465
m = m -> base_midx ;
1468
1466
}
1469
1467
1470
- for (i = 0 ; i < ctx .num_multi_pack_indexes_before + 1 ; i ++ )
1468
+ for (uint32_t i = 0 ; i <= ctx .num_multi_pack_indexes_before ; i ++ )
1471
1469
fprintf (get_lock_file_fp (& lk ), "%s\n" , keep_hashes [i ]);
1472
1470
} else {
1473
1471
keep_hashes [ctx .num_multi_pack_indexes_before ] =
@@ -1485,7 +1483,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1485
1483
ctx .incremental );
1486
1484
1487
1485
cleanup :
1488
- for (i = 0 ; i < ctx .nr ; i ++ ) {
1486
+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
1489
1487
if (ctx .info [i ].p ) {
1490
1488
close_pack (ctx .info [i ].p );
1491
1489
free (ctx .info [i ].p );
@@ -1498,7 +1496,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1498
1496
free (ctx .pack_perm );
1499
1497
free (ctx .pack_order );
1500
1498
if (keep_hashes ) {
1501
- for (i = 0 ; i < ctx .num_multi_pack_indexes_before + 1 ; i ++ )
1499
+ for (uint32_t i = 0 ; i <= ctx .num_multi_pack_indexes_before ; i ++ )
1502
1500
free ((char * )keep_hashes [i ]);
1503
1501
free (keep_hashes );
1504
1502
}
0 commit comments