1- #define DISABLE_SIGN_COMPARE_WARNINGS
2-
31#include "git-compat-util.h"
42#include "abspath.h"
53#include "config.h"
2422#define BITMAP_POS_UNKNOWN (~((uint32_t)0))
2523#define MIDX_CHUNK_FANOUT_SIZE (sizeof(uint32_t) * 256)
2624#define MIDX_CHUNK_LARGE_OFFSET_WIDTH (sizeof(uint64_t))
25+ #define NO_PREFERRED_PACK (~((uint32_t)0))
2726
2827extern int midx_checksum_valid (struct multi_pack_index * m );
2928extern void clear_midx_files_ext (const char * object_dir , const char * ext ,
@@ -104,7 +103,7 @@ struct write_midx_context {
104103 unsigned large_offsets_needed :1 ;
105104 uint32_t num_large_offsets ;
106105
107- int preferred_pack_idx ;
106+ uint32_t preferred_pack_idx ;
108107
109108 int incremental ;
110109 uint32_t num_multi_pack_indexes_before ;
@@ -260,7 +259,7 @@ static void midx_fanout_sort(struct midx_fanout *fanout)
260259static void midx_fanout_add_midx_fanout (struct midx_fanout * fanout ,
261260 struct multi_pack_index * m ,
262261 uint32_t cur_fanout ,
263- int preferred_pack )
262+ uint32_t preferred_pack )
264263{
265264 uint32_t start = m -> num_objects_in_base , end ;
266265 uint32_t cur_object ;
@@ -274,7 +273,7 @@ static void midx_fanout_add_midx_fanout(struct midx_fanout *fanout,
274273 end = m -> num_objects_in_base + ntohl (m -> chunk_oid_fanout [cur_fanout ]);
275274
276275 for (cur_object = start ; cur_object < end ; cur_object ++ ) {
277- if ((preferred_pack > -1 ) &&
276+ if ((preferred_pack != NO_PREFERRED_PACK ) &&
278277 (preferred_pack == nth_midxed_pack_int_id (m , cur_object ))) {
279278 /*
280279 * Objects from preferred packs are added
@@ -364,7 +363,8 @@ static void compute_sorted_entries(struct write_midx_context *ctx,
364363 preferred , cur_fanout );
365364 }
366365
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 )
368368 midx_fanout_add_pack_fanout (& fanout , ctx -> info ,
369369 ctx -> preferred_pack_idx , 1 ,
370370 cur_fanout );
@@ -843,7 +843,7 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
843843 uint32_t commits_nr ,
844844 unsigned flags )
845845{
846- int ret , i ;
846+ int ret ;
847847 uint16_t options = 0 ;
848848 struct bitmap_writer writer ;
849849 struct pack_idx_entry * * index ;
@@ -871,7 +871,7 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
871871 * this order).
872872 */
873873 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 ++ )
875875 index [i ] = & pdata -> objects [i ].idx ;
876876
877877 bitmap_writer_init (& writer , ctx -> repo , pdata ,
@@ -892,7 +892,7 @@ static int write_midx_bitmap(struct write_midx_context *ctx,
892892 * happens between bitmap_writer_build_type_index() and
893893 * bitmap_writer_finish().
894894 */
895- for (i = 0 ; i < pdata -> nr_objects ; i ++ )
895+ for (uint32_t i = 0 ; i < pdata -> nr_objects ; i ++ )
896896 index [ctx -> pack_order [i ]] = & pdata -> objects [i ].idx ;
897897
898898 bitmap_writer_select_commits (& writer , commits , commits_nr );
@@ -938,39 +938,21 @@ static struct multi_pack_index *lookup_multi_pack_index(struct repository *r,
938938 return result ;
939939}
940940
941- static int fill_packs_from_midx (struct write_midx_context * ctx ,
942- const char * preferred_pack_name , uint32_t flags )
941+ static int fill_packs_from_midx (struct write_midx_context * ctx )
943942{
944943 struct multi_pack_index * m ;
945944
946945 for (m = ctx -> m ; m ; m = m -> base_midx ) {
947946 uint32_t i ;
948947
949948 for (i = 0 ; i < m -> num_packs ; i ++ ) {
950- ALLOC_GROW (ctx -> info , ctx -> nr + 1 , ctx -> alloc );
951-
952- /*
953- * If generating a reverse index, need to have
954- * packed_git's loaded to compare their
955- * mtimes and object count.
956- *
957- * If a preferred pack is specified, need to
958- * have packed_git's loaded to ensure the chosen
959- * preferred pack has a non-zero object count.
960- */
961- if (flags & MIDX_WRITE_REV_INDEX ||
962- preferred_pack_name ) {
963- if (prepare_midx_pack (ctx -> repo , m ,
964- m -> num_packs_in_base + i )) {
965- error (_ ("could not load pack" ));
966- return 1 ;
967- }
968-
969- if (open_pack_index (m -> packs [i ]))
970- die (_ ("could not open index for %s" ),
971- m -> packs [i ]-> pack_name );
949+ if (prepare_midx_pack (ctx -> repo , m ,
950+ m -> num_packs_in_base + i )) {
951+ error (_ ("could not load pack" ));
952+ return 1 ;
972953 }
973954
955+ ALLOC_GROW (ctx -> info , ctx -> nr + 1 , ctx -> alloc );
974956 fill_pack_info (& ctx -> info [ctx -> nr ++ ], m -> packs [i ],
975957 m -> pack_names [i ],
976958 m -> num_packs_in_base + i );
@@ -1074,11 +1056,13 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
10741056{
10751057 struct strbuf midx_name = STRBUF_INIT ;
10761058 unsigned char midx_hash [GIT_MAX_RAWSZ ];
1077- uint32_t i , start_pack ;
1059+ uint32_t start_pack ;
10781060 struct hashfile * f = NULL ;
10791061 struct lock_file lk ;
10801062 struct tempfile * incr ;
1081- struct write_midx_context ctx = { 0 };
1063+ struct write_midx_context ctx = {
1064+ .preferred_pack_idx = NO_PREFERRED_PACK ,
1065+ };
10821066 int bitmapped_packs_concat_len = 0 ;
10831067 int pack_name_concat_len = 0 ;
10841068 int dropped_packs = 0 ;
@@ -1141,8 +1125,8 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
11411125 ctx .num_multi_pack_indexes_before ++ ;
11421126 m = m -> base_midx ;
11431127 }
1144- } else if (ctx .m && fill_packs_from_midx (& ctx , preferred_pack_name ,
1145- flags ) < 0 ) {
1128+ } else if (ctx .m && fill_packs_from_midx (& ctx )) {
1129+ result = 1 ;
11461130 goto cleanup ;
11471131 }
11481132
@@ -1186,22 +1170,22 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
11861170 goto cleanup ; /* nothing to do */
11871171
11881172 if (preferred_pack_name ) {
1189- ctx .preferred_pack_idx = -1 ;
1173+ ctx .preferred_pack_idx = NO_PREFERRED_PACK ;
11901174
1191- for (i = 0 ; i < ctx .nr ; i ++ ) {
1175+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
11921176 if (!cmp_idx_or_pack_name (preferred_pack_name ,
11931177 ctx .info [i ].pack_name )) {
11941178 ctx .preferred_pack_idx = i ;
11951179 break ;
11961180 }
11971181 }
11981182
1199- if (ctx .preferred_pack_idx == -1 )
1183+ if (ctx .preferred_pack_idx == NO_PREFERRED_PACK )
12001184 warning (_ ("unknown preferred pack: '%s'" ),
12011185 preferred_pack_name );
12021186 } else if (ctx .nr &&
12031187 (flags & (MIDX_WRITE_REV_INDEX | MIDX_WRITE_BITMAP ))) {
1204- struct packed_git * oldest = ctx .info [ctx . preferred_pack_idx ].p ;
1188+ struct packed_git * oldest = ctx .info [0 ].p ;
12051189 ctx .preferred_pack_idx = 0 ;
12061190
12071191 if (packs_to_drop && packs_to_drop -> nr )
@@ -1213,7 +1197,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
12131197 * pack-order has all of its objects selected from that pack
12141198 * (and not another pack containing a duplicate)
12151199 */
1216- for (i = 1 ; i < ctx .nr ; i ++ ) {
1200+ for (size_t i = 1 ; i < ctx .nr ; i ++ ) {
12171201 struct packed_git * p = ctx .info [i ].p ;
12181202
12191203 if (!oldest -> num_objects || p -> mtime < oldest -> mtime ) {
@@ -1229,18 +1213,23 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
12291213 * objects to resolve, so the preferred value doesn't
12301214 * matter.
12311215 */
1232- ctx .preferred_pack_idx = -1 ;
1216+ ctx .preferred_pack_idx = NO_PREFERRED_PACK ;
12331217 }
12341218 } else {
12351219 /*
12361220 * otherwise don't mark any pack as preferred to avoid
12371221 * interfering with expiration logic below
12381222 */
1239- ctx .preferred_pack_idx = -1 ;
1223+ ctx .preferred_pack_idx = NO_PREFERRED_PACK ;
12401224 }
12411225
1242- if (ctx .preferred_pack_idx > -1 ) {
1226+ if (ctx .preferred_pack_idx != NO_PREFERRED_PACK ) {
12431227 struct packed_git * preferred = ctx .info [ctx .preferred_pack_idx ].p ;
1228+
1229+ if (open_pack_index (preferred ))
1230+ die (_ ("failed to open preferred pack %s" ),
1231+ ctx .info [ctx .preferred_pack_idx ].pack_name );
1232+
12441233 if (!preferred -> num_objects ) {
12451234 error (_ ("cannot select preferred pack %s with no objects" ),
12461235 preferred -> pack_name );
@@ -1252,7 +1241,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
12521241 compute_sorted_entries (& ctx , start_pack );
12531242
12541243 ctx .large_offsets_needed = 0 ;
1255- for (i = 0 ; i < ctx .entries_nr ; i ++ ) {
1244+ for (size_t i = 0 ; i < ctx .entries_nr ; i ++ ) {
12561245 if (ctx .entries [i ].offset > 0x7fffffff )
12571246 ctx .num_large_offsets ++ ;
12581247 if (ctx .entries [i ].offset > 0xffffffff )
@@ -1262,10 +1251,10 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
12621251 QSORT (ctx .info , ctx .nr , pack_info_compare );
12631252
12641253 if (packs_to_drop && packs_to_drop -> nr ) {
1265- int drop_index = 0 ;
1254+ size_t drop_index = 0 ;
12661255 int missing_drops = 0 ;
12671256
1268- for (i = 0 ; i < ctx .nr && drop_index < packs_to_drop -> nr ; i ++ ) {
1257+ for (size_t i = 0 ; i < ctx .nr && drop_index < packs_to_drop -> nr ; i ++ ) {
12691258 int cmp = strcmp (ctx .info [i ].pack_name ,
12701259 packs_to_drop -> items [drop_index ].string );
12711260
@@ -1296,7 +1285,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
12961285 * pack_perm[old_id] = new_id
12971286 */
12981287 ALLOC_ARRAY (ctx .pack_perm , ctx .nr );
1299- for (i = 0 ; i < ctx .nr ; i ++ ) {
1288+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
13001289 if (ctx .info [i ].expired ) {
13011290 dropped_packs ++ ;
13021291 ctx .pack_perm [ctx .info [i ].orig_pack_int_id ] = PACK_EXPIRED ;
@@ -1305,7 +1294,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
13051294 }
13061295 }
13071296
1308- for (i = 0 ; i < ctx .nr ; i ++ ) {
1297+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
13091298 if (ctx .info [i ].expired )
13101299 continue ;
13111300 pack_name_concat_len += strlen (ctx .info [i ].pack_name ) + 1 ;
@@ -1352,13 +1341,15 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
13521341 incr = mks_tempfile_m (midx_name .buf , 0444 );
13531342 if (!incr ) {
13541343 error (_ ("unable to create temporary MIDX layer" ));
1355- return -1 ;
1344+ result = -1 ;
1345+ goto cleanup ;
13561346 }
13571347
13581348 if (adjust_shared_perm (r , get_tempfile_path (incr ))) {
13591349 error (_ ("unable to adjust shared permissions for '%s'" ),
13601350 get_tempfile_path (incr ));
1361- return -1 ;
1351+ result = -1 ;
1352+ goto cleanup ;
13621353 }
13631354
13641355 f = hashfd (r -> hash_algo , get_tempfile_fd (incr ),
@@ -1449,6 +1440,9 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
14491440 * have been freed in the previous if block.
14501441 */
14511442
1443+ if (ctx .num_multi_pack_indexes_before == UINT32_MAX )
1444+ die ("too many multi-pack-indexes" );
1445+
14521446 CALLOC_ARRAY (keep_hashes , ctx .num_multi_pack_indexes_before + 1 );
14531447
14541448 if (ctx .incremental ) {
@@ -1458,34 +1452,38 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
14581452
14591453 if (!chainf ) {
14601454 error_errno (_ ("unable to open multi-pack-index chain file" ));
1461- return -1 ;
1455+ result = -1 ;
1456+ goto cleanup ;
14621457 }
14631458
1464- if (link_midx_to_chain (ctx .base_midx ) < 0 )
1465- return -1 ;
1459+ if (link_midx_to_chain (ctx .base_midx ) < 0 ) {
1460+ result = -1 ;
1461+ goto cleanup ;
1462+ }
14661463
14671464 get_split_midx_filename_ext (r -> hash_algo , & final_midx_name ,
14681465 object_dir , midx_hash , MIDX_EXT_MIDX );
14691466
14701467 if (rename_tempfile (& incr , final_midx_name .buf ) < 0 ) {
14711468 error_errno (_ ("unable to rename new multi-pack-index layer" ));
1472- return -1 ;
1469+ result = -1 ;
1470+ goto cleanup ;
14731471 }
14741472
14751473 strbuf_release (& final_midx_name );
14761474
14771475 keep_hashes [ctx .num_multi_pack_indexes_before ] =
14781476 xstrdup (hash_to_hex_algop (midx_hash , r -> hash_algo ));
14791477
1480- for (i = 0 ; i < ctx .num_multi_pack_indexes_before ; i ++ ) {
1478+ for (uint32_t i = 0 ; i < ctx .num_multi_pack_indexes_before ; i ++ ) {
14811479 uint32_t j = ctx .num_multi_pack_indexes_before - i - 1 ;
14821480
14831481 keep_hashes [j ] = xstrdup (hash_to_hex_algop (get_midx_checksum (m ),
14841482 r -> hash_algo ));
14851483 m = m -> base_midx ;
14861484 }
14871485
1488- for (i = 0 ; i < ctx .num_multi_pack_indexes_before + 1 ; i ++ )
1486+ for (uint32_t i = 0 ; i <= ctx .num_multi_pack_indexes_before ; i ++ )
14891487 fprintf (get_lock_file_fp (& lk ), "%s\n" , keep_hashes [i ]);
14901488 } else {
14911489 keep_hashes [ctx .num_multi_pack_indexes_before ] =
@@ -1503,7 +1501,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
15031501 ctx .incremental );
15041502
15051503cleanup :
1506- for (i = 0 ; i < ctx .nr ; i ++ ) {
1504+ for (size_t i = 0 ; i < ctx .nr ; i ++ ) {
15071505 if (ctx .info [i ].p ) {
15081506 close_pack (ctx .info [i ].p );
15091507 free (ctx .info [i ].p );
@@ -1516,7 +1514,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
15161514 free (ctx .pack_perm );
15171515 free (ctx .pack_order );
15181516 if (keep_hashes ) {
1519- for (i = 0 ; i < ctx .num_multi_pack_indexes_before + 1 ; i ++ )
1517+ for (uint32_t i = 0 ; i <= ctx .num_multi_pack_indexes_before ; i ++ )
15201518 free ((char * )keep_hashes [i ]);
15211519 free (keep_hashes );
15221520 }
0 commit comments