@@ -647,16 +647,22 @@ static uint32_t *midx_pack_order(struct write_midx_context *ctx)
647647 return pack_order ;
648648}
649649
650- static void write_midx_reverse_index (char * midx_name , unsigned char * midx_hash ,
651- struct write_midx_context * ctx )
650+ static void write_midx_reverse_index (struct write_midx_context * ctx ,
651+ const char * object_dir ,
652+ unsigned char * midx_hash )
652653{
653654 struct strbuf buf = STRBUF_INIT ;
654655 char * tmp_file ;
655656
656657 trace2_region_enter ("midx" , "write_midx_reverse_index" , ctx -> repo );
657658
658- strbuf_addf (& buf , "%s-%s.rev" , midx_name , hash_to_hex_algop (midx_hash ,
659- ctx -> repo -> hash_algo ));
659+ if (ctx -> incremental )
660+ get_split_midx_filename_ext (ctx -> repo -> hash_algo , & buf ,
661+ object_dir , midx_hash ,
662+ MIDX_EXT_REV );
663+ else
664+ get_midx_filename_ext (ctx -> repo -> hash_algo , & buf , object_dir ,
665+ midx_hash , MIDX_EXT_REV );
660666
661667 tmp_file = write_rev_file_order (ctx -> repo -> hash_algo , NULL , ctx -> pack_order ,
662668 ctx -> entries_nr , midx_hash , WRITE_REV );
@@ -829,22 +835,29 @@ static struct commit **find_commits_for_midx_bitmap(uint32_t *indexed_commits_nr
829835 return cb .commits ;
830836}
831837
832- static int write_midx_bitmap (struct repository * r , const char * midx_name ,
838+ static int write_midx_bitmap (struct write_midx_context * ctx ,
839+ const char * object_dir ,
833840 const unsigned char * midx_hash ,
834841 struct packing_data * pdata ,
835842 struct commit * * commits ,
836843 uint32_t commits_nr ,
837- uint32_t * pack_order ,
838844 unsigned flags )
839845{
840846 int ret , i ;
841847 uint16_t options = 0 ;
842848 struct bitmap_writer writer ;
843849 struct pack_idx_entry * * index ;
844- char * bitmap_name = xstrfmt ("%s-%s.bitmap" , midx_name ,
845- hash_to_hex_algop (midx_hash , r -> hash_algo ));
850+ struct strbuf bitmap_name = STRBUF_INIT ;
851+
852+ trace2_region_enter ("midx" , "write_midx_bitmap" , ctx -> repo );
846853
847- trace2_region_enter ("midx" , "write_midx_bitmap" , r );
854+ if (ctx -> incremental )
855+ get_split_midx_filename_ext (ctx -> repo -> hash_algo , & bitmap_name ,
856+ object_dir , midx_hash ,
857+ MIDX_EXT_BITMAP );
858+ else
859+ get_midx_filename_ext (ctx -> repo -> hash_algo , & bitmap_name ,
860+ object_dir , midx_hash , MIDX_EXT_BITMAP );
848861
849862 if (flags & MIDX_WRITE_BITMAP_HASH_CACHE )
850863 options |= BITMAP_OPT_HASH_CACHE ;
@@ -861,7 +874,8 @@ static int write_midx_bitmap(struct repository *r, const char *midx_name,
861874 for (i = 0 ; i < pdata -> nr_objects ; i ++ )
862875 index [i ] = & pdata -> objects [i ].idx ;
863876
864- bitmap_writer_init (& writer , r , pdata );
877+ bitmap_writer_init (& writer , ctx -> repo , pdata ,
878+ ctx -> incremental ? ctx -> base_midx : NULL );
865879 bitmap_writer_show_progress (& writer , flags & MIDX_PROGRESS );
866880 bitmap_writer_build_type_index (& writer , index );
867881
@@ -879,22 +893,22 @@ static int write_midx_bitmap(struct repository *r, const char *midx_name,
879893 * bitmap_writer_finish().
880894 */
881895 for (i = 0 ; i < pdata -> nr_objects ; i ++ )
882- index [pack_order [i ]] = & pdata -> objects [i ].idx ;
896+ index [ctx -> pack_order [i ]] = & pdata -> objects [i ].idx ;
883897
884898 bitmap_writer_select_commits (& writer , commits , commits_nr );
885899 ret = bitmap_writer_build (& writer );
886900 if (ret < 0 )
887901 goto cleanup ;
888902
889903 bitmap_writer_set_checksum (& writer , midx_hash );
890- bitmap_writer_finish (& writer , index , bitmap_name , options );
904+ bitmap_writer_finish (& writer , index , bitmap_name . buf , options );
891905
892906cleanup :
893907 free (index );
894- free ( bitmap_name );
908+ strbuf_release ( & bitmap_name );
895909 bitmap_writer_free (& writer );
896910
897- trace2_region_leave ("midx" , "write_midx_bitmap" , r );
911+ trace2_region_leave ("midx" , "write_midx_bitmap" , ctx -> repo );
898912
899913 return ret ;
900914}
@@ -1077,8 +1091,6 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
10771091 ctx .repo = r ;
10781092
10791093 ctx .incremental = !!(flags & MIDX_WRITE_INCREMENTAL );
1080- if (ctx .incremental && (flags & MIDX_WRITE_BITMAP ))
1081- die (_ ("cannot write incremental MIDX with bitmap" ));
10821094
10831095 if (ctx .incremental )
10841096 strbuf_addf (& midx_name ,
@@ -1119,6 +1131,13 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
11191131 if (ctx .incremental ) {
11201132 struct multi_pack_index * m = ctx .base_midx ;
11211133 while (m ) {
1134+ if (flags & MIDX_WRITE_BITMAP && load_midx_revindex (m )) {
1135+ error (_ ("could not load reverse index for MIDX %s" ),
1136+ hash_to_hex_algop (get_midx_checksum (m ),
1137+ m -> repo -> hash_algo ));
1138+ result = 1 ;
1139+ goto cleanup ;
1140+ }
11221141 ctx .num_multi_pack_indexes_before ++ ;
11231142 m = m -> base_midx ;
11241143 }
@@ -1387,7 +1406,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
13871406
13881407 if (flags & MIDX_WRITE_REV_INDEX &&
13891408 git_env_bool ("GIT_TEST_MIDX_WRITE_REV" , 0 ))
1390- write_midx_reverse_index (midx_name . buf , midx_hash , & ctx );
1409+ write_midx_reverse_index (& ctx , object_dir , midx_hash );
13911410
13921411 if (flags & MIDX_WRITE_BITMAP ) {
13931412 struct packing_data pdata ;
@@ -1410,8 +1429,8 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
14101429 FREE_AND_NULL (ctx .entries );
14111430 ctx .entries_nr = 0 ;
14121431
1413- if (write_midx_bitmap (r , midx_name . buf , midx_hash , & pdata ,
1414- commits , commits_nr , ctx . pack_order ,
1432+ if (write_midx_bitmap (& ctx , object_dir ,
1433+ midx_hash , & pdata , commits , commits_nr ,
14151434 flags ) < 0 ) {
14161435 error (_ ("could not write multi-pack bitmap" ));
14171436 result = 1 ;
0 commit comments