@@ -57,15 +57,15 @@ const unsigned char *get_midx_checksum(struct multi_pack_index *m)
5757 return m -> data + m -> data_len - the_hash_algo -> rawsz ;
5858}
5959
60- char * get_midx_filename (const char * object_dir )
60+ void get_midx_filename (struct strbuf * out , const char * object_dir )
6161{
62- return xstrfmt ( "%s/pack/multi-pack-index" , object_dir );
62+ strbuf_addf ( out , "%s/pack/multi-pack-index" , object_dir );
6363}
6464
65- char * get_midx_rev_filename (struct multi_pack_index * m )
65+ void get_midx_rev_filename (struct strbuf * out , struct multi_pack_index * m )
6666{
67- return xstrfmt ( "%s/pack/multi-pack-index-%s.rev" ,
68- m -> object_dir , hash_to_hex (get_midx_checksum (m )));
67+ get_midx_filename ( out , m -> object_dir );
68+ strbuf_addf ( out , "-%s.rev" , hash_to_hex (get_midx_checksum (m )));
6969}
7070
7171static int midx_read_oid_fanout (const unsigned char * chunk_start ,
@@ -89,28 +89,30 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
8989 size_t midx_size ;
9090 void * midx_map = NULL ;
9191 uint32_t hash_version ;
92- char * midx_name = get_midx_filename ( object_dir ) ;
92+ struct strbuf midx_name = STRBUF_INIT ;
9393 uint32_t i ;
9494 const char * cur_pack_name ;
9595 struct chunkfile * cf = NULL ;
9696
97- fd = git_open (midx_name );
97+ get_midx_filename (& midx_name , object_dir );
98+
99+ fd = git_open (midx_name .buf );
98100
99101 if (fd < 0 )
100102 goto cleanup_fail ;
101103 if (fstat (fd , & st )) {
102- error_errno (_ ("failed to read %s" ), midx_name );
104+ error_errno (_ ("failed to read %s" ), midx_name . buf );
103105 goto cleanup_fail ;
104106 }
105107
106108 midx_size = xsize_t (st .st_size );
107109
108110 if (midx_size < MIDX_MIN_SIZE ) {
109- error (_ ("multi-pack-index file %s is too small" ), midx_name );
111+ error (_ ("multi-pack-index file %s is too small" ), midx_name . buf );
110112 goto cleanup_fail ;
111113 }
112114
113- FREE_AND_NULL ( midx_name );
115+ strbuf_release ( & midx_name );
114116
115117 midx_map = xmmap (NULL , midx_size , PROT_READ , MAP_PRIVATE , fd , 0 );
116118 close (fd );
@@ -179,12 +181,13 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
179181 trace2_data_intmax ("midx" , the_repository , "load/num_packs" , m -> num_packs );
180182 trace2_data_intmax ("midx" , the_repository , "load/num_objects" , m -> num_objects );
181183
184+ free_chunkfile (cf );
182185 return m ;
183186
184187cleanup_fail :
185188 free (m );
186- free ( midx_name );
187- free (cf );
189+ strbuf_release ( & midx_name );
190+ free_chunkfile (cf );
188191 if (midx_map )
189192 munmap (midx_map , midx_size );
190193 if (0 <= fd )
@@ -1130,7 +1133,7 @@ static int write_midx_internal(const char *object_dir,
11301133 const char * refs_snapshot ,
11311134 unsigned flags )
11321135{
1133- char * midx_name ;
1136+ struct strbuf midx_name = STRBUF_INIT ;
11341137 unsigned char midx_hash [GIT_MAX_RAWSZ ];
11351138 uint32_t i ;
11361139 struct hashfile * f = NULL ;
@@ -1141,10 +1144,10 @@ static int write_midx_internal(const char *object_dir,
11411144 int result = 0 ;
11421145 struct chunkfile * cf ;
11431146
1144- midx_name = get_midx_filename (object_dir );
1145- if (safe_create_leading_directories (midx_name ))
1147+ get_midx_filename (& midx_name , object_dir );
1148+ if (safe_create_leading_directories (midx_name . buf ))
11461149 die_errno (_ ("unable to create leading directories of %s" ),
1147- midx_name );
1150+ midx_name . buf );
11481151
11491152 if (!packs_to_include ) {
11501153 /*
@@ -1373,7 +1376,7 @@ static int write_midx_internal(const char *object_dir,
13731376 pack_name_concat_len += MIDX_CHUNK_ALIGNMENT -
13741377 (pack_name_concat_len % MIDX_CHUNK_ALIGNMENT );
13751378
1376- hold_lock_file_for_update (& lk , midx_name , LOCK_DIE_ON_ERROR );
1379+ hold_lock_file_for_update (& lk , midx_name . buf , LOCK_DIE_ON_ERROR );
13771380 f = hashfd (get_lock_file_fd (& lk ), get_lock_file_path (& lk ));
13781381
13791382 if (ctx .nr - dropped_packs == 0 ) {
@@ -1410,9 +1413,9 @@ static int write_midx_internal(const char *object_dir,
14101413 ctx .pack_order = midx_pack_order (& ctx );
14111414
14121415 if (flags & MIDX_WRITE_REV_INDEX )
1413- write_midx_reverse_index (midx_name , midx_hash , & ctx );
1416+ write_midx_reverse_index (midx_name . buf , midx_hash , & ctx );
14141417 if (flags & MIDX_WRITE_BITMAP ) {
1415- if (write_midx_bitmap (midx_name , midx_hash , & ctx ,
1418+ if (write_midx_bitmap (midx_name . buf , midx_hash , & ctx ,
14161419 refs_snapshot , flags ) < 0 ) {
14171420 error (_ ("could not write multi-pack bitmap" ));
14181421 result = 1 ;
@@ -1442,7 +1445,7 @@ static int write_midx_internal(const char *object_dir,
14421445 free (ctx .entries );
14431446 free (ctx .pack_perm );
14441447 free (ctx .pack_order );
1445- free ( midx_name );
1448+ strbuf_release ( & midx_name );
14461449
14471450 return result ;
14481451}
@@ -1506,20 +1509,22 @@ static void clear_midx_files_ext(const char *object_dir, const char *ext,
15061509
15071510void clear_midx_file (struct repository * r )
15081511{
1509- char * midx = get_midx_filename (r -> objects -> odb -> path );
1512+ struct strbuf midx = STRBUF_INIT ;
1513+
1514+ get_midx_filename (& midx , r -> objects -> odb -> path );
15101515
15111516 if (r -> objects && r -> objects -> multi_pack_index ) {
15121517 close_midx (r -> objects -> multi_pack_index );
15131518 r -> objects -> multi_pack_index = NULL ;
15141519 }
15151520
1516- if (remove_path (midx ))
1517- die (_ ("failed to clear multi-pack-index at %s" ), midx );
1521+ if (remove_path (midx . buf ))
1522+ die (_ ("failed to clear multi-pack-index at %s" ), midx . buf );
15181523
15191524 clear_midx_files_ext (r -> objects -> odb -> path , ".bitmap" , NULL );
15201525 clear_midx_files_ext (r -> objects -> odb -> path , ".rev" , NULL );
15211526
1522- free ( midx );
1527+ strbuf_release ( & midx );
15231528}
15241529
15251530static int verify_midx_error ;
@@ -1572,12 +1577,15 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
15721577 if (!m ) {
15731578 int result = 0 ;
15741579 struct stat sb ;
1575- char * filename = get_midx_filename (object_dir );
1576- if (!stat (filename , & sb )) {
1580+ struct strbuf filename = STRBUF_INIT ;
1581+
1582+ get_midx_filename (& filename , object_dir );
1583+
1584+ if (!stat (filename .buf , & sb )) {
15771585 error (_ ("multi-pack-index file exists, but failed to parse" ));
15781586 result = 1 ;
15791587 }
1580- free ( filename );
1588+ strbuf_release ( & filename );
15811589 return result ;
15821590 }
15831591
@@ -1610,7 +1618,7 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
16101618 * Remaining tests assume that we have objects, so we can
16111619 * return here.
16121620 */
1613- return verify_midx_error ;
1621+ goto cleanup ;
16141622 }
16151623
16161624 if (flags & MIDX_PROGRESS )
@@ -1688,7 +1696,9 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
16881696 }
16891697 stop_progress (& progress );
16901698
1699+ cleanup :
16911700 free (pairs );
1701+ close_midx (m );
16921702
16931703 return verify_midx_error ;
16941704}
0 commit comments