@@ -57,15 +57,15 @@ const unsigned char *get_midx_checksum(struct multi_pack_index *m)
57
57
return m -> data + m -> data_len - the_hash_algo -> rawsz ;
58
58
}
59
59
60
- char * get_midx_filename (const char * object_dir )
60
+ void get_midx_filename (struct strbuf * out , const char * object_dir )
61
61
{
62
- return xstrfmt ( "%s/pack/multi-pack-index" , object_dir );
62
+ strbuf_addf ( out , "%s/pack/multi-pack-index" , object_dir );
63
63
}
64
64
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 )
66
66
{
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 )));
69
69
}
70
70
71
71
static 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
89
89
size_t midx_size ;
90
90
void * midx_map = NULL ;
91
91
uint32_t hash_version ;
92
- char * midx_name = get_midx_filename ( object_dir ) ;
92
+ struct strbuf midx_name = STRBUF_INIT ;
93
93
uint32_t i ;
94
94
const char * cur_pack_name ;
95
95
struct chunkfile * cf = NULL ;
96
96
97
- fd = git_open (midx_name );
97
+ get_midx_filename (& midx_name , object_dir );
98
+
99
+ fd = git_open (midx_name .buf );
98
100
99
101
if (fd < 0 )
100
102
goto cleanup_fail ;
101
103
if (fstat (fd , & st )) {
102
- error_errno (_ ("failed to read %s" ), midx_name );
104
+ error_errno (_ ("failed to read %s" ), midx_name . buf );
103
105
goto cleanup_fail ;
104
106
}
105
107
106
108
midx_size = xsize_t (st .st_size );
107
109
108
110
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 );
110
112
goto cleanup_fail ;
111
113
}
112
114
113
- FREE_AND_NULL ( midx_name );
115
+ strbuf_release ( & midx_name );
114
116
115
117
midx_map = xmmap (NULL , midx_size , PROT_READ , MAP_PRIVATE , fd , 0 );
116
118
close (fd );
@@ -179,12 +181,13 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
179
181
trace2_data_intmax ("midx" , the_repository , "load/num_packs" , m -> num_packs );
180
182
trace2_data_intmax ("midx" , the_repository , "load/num_objects" , m -> num_objects );
181
183
184
+ free_chunkfile (cf );
182
185
return m ;
183
186
184
187
cleanup_fail :
185
188
free (m );
186
- free ( midx_name );
187
- free (cf );
189
+ strbuf_release ( & midx_name );
190
+ free_chunkfile (cf );
188
191
if (midx_map )
189
192
munmap (midx_map , midx_size );
190
193
if (0 <= fd )
@@ -1130,7 +1133,7 @@ static int write_midx_internal(const char *object_dir,
1130
1133
const char * refs_snapshot ,
1131
1134
unsigned flags )
1132
1135
{
1133
- char * midx_name ;
1136
+ struct strbuf midx_name = STRBUF_INIT ;
1134
1137
unsigned char midx_hash [GIT_MAX_RAWSZ ];
1135
1138
uint32_t i ;
1136
1139
struct hashfile * f = NULL ;
@@ -1141,10 +1144,10 @@ static int write_midx_internal(const char *object_dir,
1141
1144
int result = 0 ;
1142
1145
struct chunkfile * cf ;
1143
1146
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 ))
1146
1149
die_errno (_ ("unable to create leading directories of %s" ),
1147
- midx_name );
1150
+ midx_name . buf );
1148
1151
1149
1152
if (!packs_to_include ) {
1150
1153
/*
@@ -1373,7 +1376,7 @@ static int write_midx_internal(const char *object_dir,
1373
1376
pack_name_concat_len += MIDX_CHUNK_ALIGNMENT -
1374
1377
(pack_name_concat_len % MIDX_CHUNK_ALIGNMENT );
1375
1378
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 );
1377
1380
f = hashfd (get_lock_file_fd (& lk ), get_lock_file_path (& lk ));
1378
1381
1379
1382
if (ctx .nr - dropped_packs == 0 ) {
@@ -1410,9 +1413,9 @@ static int write_midx_internal(const char *object_dir,
1410
1413
ctx .pack_order = midx_pack_order (& ctx );
1411
1414
1412
1415
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 );
1414
1417
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 ,
1416
1419
refs_snapshot , flags ) < 0 ) {
1417
1420
error (_ ("could not write multi-pack bitmap" ));
1418
1421
result = 1 ;
@@ -1442,7 +1445,7 @@ static int write_midx_internal(const char *object_dir,
1442
1445
free (ctx .entries );
1443
1446
free (ctx .pack_perm );
1444
1447
free (ctx .pack_order );
1445
- free ( midx_name );
1448
+ strbuf_release ( & midx_name );
1446
1449
1447
1450
return result ;
1448
1451
}
@@ -1506,20 +1509,22 @@ static void clear_midx_files_ext(const char *object_dir, const char *ext,
1506
1509
1507
1510
void clear_midx_file (struct repository * r )
1508
1511
{
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 );
1510
1515
1511
1516
if (r -> objects && r -> objects -> multi_pack_index ) {
1512
1517
close_midx (r -> objects -> multi_pack_index );
1513
1518
r -> objects -> multi_pack_index = NULL ;
1514
1519
}
1515
1520
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 );
1518
1523
1519
1524
clear_midx_files_ext (r -> objects -> odb -> path , ".bitmap" , NULL );
1520
1525
clear_midx_files_ext (r -> objects -> odb -> path , ".rev" , NULL );
1521
1526
1522
- free ( midx );
1527
+ strbuf_release ( & midx );
1523
1528
}
1524
1529
1525
1530
static int verify_midx_error ;
@@ -1572,12 +1577,15 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
1572
1577
if (!m ) {
1573
1578
int result = 0 ;
1574
1579
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 )) {
1577
1585
error (_ ("multi-pack-index file exists, but failed to parse" ));
1578
1586
result = 1 ;
1579
1587
}
1580
- free ( filename );
1588
+ strbuf_release ( & filename );
1581
1589
return result ;
1582
1590
}
1583
1591
@@ -1610,7 +1618,7 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
1610
1618
* Remaining tests assume that we have objects, so we can
1611
1619
* return here.
1612
1620
*/
1613
- return verify_midx_error ;
1621
+ goto cleanup ;
1614
1622
}
1615
1623
1616
1624
if (flags & MIDX_PROGRESS )
@@ -1688,7 +1696,9 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag
1688
1696
}
1689
1697
stop_progress (& progress );
1690
1698
1699
+ cleanup :
1691
1700
free (pairs );
1701
+ close_midx (m );
1692
1702
1693
1703
return verify_midx_error ;
1694
1704
}
0 commit comments