@@ -192,18 +192,17 @@ void close_midx(struct multi_pack_index *m)
192192 m -> fd = -1 ;
193193
194194 for (i = 0 ; i < m -> num_packs ; i ++ ) {
195- if (m -> packs [i ]) {
196- close_pack (m -> packs [i ]);
197- free (m -> packs [i ]);
198- }
195+ if (m -> packs [i ])
196+ m -> packs [i ]-> multi_pack_index = 0 ;
199197 }
200198 FREE_AND_NULL (m -> packs );
201199 FREE_AND_NULL (m -> pack_names );
202200}
203201
204- int prepare_midx_pack (struct multi_pack_index * m , uint32_t pack_int_id )
202+ int prepare_midx_pack (struct repository * r , struct multi_pack_index * m , uint32_t pack_int_id )
205203{
206204 struct strbuf pack_name = STRBUF_INIT ;
205+ struct packed_git * p ;
207206
208207 if (pack_int_id >= m -> num_packs )
209208 die (_ ("bad pack-int-id: %u (%u total packs)" ),
@@ -215,9 +214,18 @@ int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id)
215214 strbuf_addf (& pack_name , "%s/pack/%s" , m -> object_dir ,
216215 m -> pack_names [pack_int_id ]);
217216
218- m -> packs [ pack_int_id ] = add_packed_git (pack_name .buf , pack_name .len , m -> local );
217+ p = add_packed_git (pack_name .buf , pack_name .len , m -> local );
219218 strbuf_release (& pack_name );
220- return !m -> packs [pack_int_id ];
219+
220+ if (!p )
221+ return 1 ;
222+
223+ p -> multi_pack_index = 1 ;
224+ m -> packs [pack_int_id ] = p ;
225+ install_packed_git (r , p );
226+ list_add_tail (& p -> mru , & r -> objects -> packed_git_mru );
227+
228+ return 0 ;
221229}
222230
223231int bsearch_midx (const struct object_id * oid , struct multi_pack_index * m , uint32_t * result )
@@ -261,7 +269,10 @@ static uint32_t nth_midxed_pack_int_id(struct multi_pack_index *m, uint32_t pos)
261269 return get_be32 (m -> chunk_object_offsets + pos * MIDX_CHUNK_OFFSET_WIDTH );
262270}
263271
264- static int nth_midxed_pack_entry (struct multi_pack_index * m , struct pack_entry * e , uint32_t pos )
272+ static int nth_midxed_pack_entry (struct repository * r ,
273+ struct multi_pack_index * m ,
274+ struct pack_entry * e ,
275+ uint32_t pos )
265276{
266277 uint32_t pack_int_id ;
267278 struct packed_git * p ;
@@ -271,7 +282,7 @@ static int nth_midxed_pack_entry(struct multi_pack_index *m, struct pack_entry *
271282
272283 pack_int_id = nth_midxed_pack_int_id (m , pos );
273284
274- if (prepare_midx_pack (m , pack_int_id ))
285+ if (prepare_midx_pack (r , m , pack_int_id ))
275286 die (_ ("error preparing packfile from multi-pack-index" ));
276287 p = m -> packs [pack_int_id ];
277288
@@ -301,14 +312,17 @@ static int nth_midxed_pack_entry(struct multi_pack_index *m, struct pack_entry *
301312 return 1 ;
302313}
303314
304- int fill_midx_entry (const struct object_id * oid , struct pack_entry * e , struct multi_pack_index * m )
315+ int fill_midx_entry (struct repository * r ,
316+ const struct object_id * oid ,
317+ struct pack_entry * e ,
318+ struct multi_pack_index * m )
305319{
306320 uint32_t pos ;
307321
308322 if (!bsearch_midx (oid , m , & pos ))
309323 return 0 ;
310324
311- return nth_midxed_pack_entry (m , e , pos );
325+ return nth_midxed_pack_entry (r , m , e , pos );
312326}
313327
314328/* Match "foo.idx" against either "foo.pack" _or_ "foo.idx". */
@@ -1020,7 +1034,7 @@ static int compare_pair_pos_vs_id(const void *_a, const void *_b)
10201034 display_progress(progress, _n); \
10211035 } while (0)
10221036
1023- int verify_midx_file (const char * object_dir )
1037+ int verify_midx_file (struct repository * r , const char * object_dir )
10241038{
10251039 struct pair_pos_vs_id * pairs = NULL ;
10261040 uint32_t i ;
@@ -1034,7 +1048,7 @@ int verify_midx_file(const char *object_dir)
10341048 progress = start_progress (_ ("Looking for referenced packfiles" ),
10351049 m -> num_packs );
10361050 for (i = 0 ; i < m -> num_packs ; i ++ ) {
1037- if (prepare_midx_pack (m , i ))
1051+ if (prepare_midx_pack (r , m , i ))
10381052 midx_report ("failed to load pack in position %d" , i );
10391053
10401054 display_progress (progress , i + 1 );
@@ -1099,7 +1113,7 @@ int verify_midx_file(const char *object_dir)
10991113
11001114 nth_midxed_object_oid (& oid , m , pairs [i ].pos );
11011115
1102- if (!fill_midx_entry (& oid , & e , m )) {
1116+ if (!fill_midx_entry (r , & oid , & e , m )) {
11031117 midx_report (_ ("failed to load pack entry for oid[%d] = %s" ),
11041118 pairs [i ].pos , oid_to_hex (& oid ));
11051119 continue ;
0 commit comments