@@ -647,16 +647,23 @@ 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 ,
661+ & buf , object_dir , midx_hash ,
662+ MIDX_EXT_REV );
663+ else
664+ get_midx_filename_ext (ctx -> repo -> hash_algo ,
665+ & buf , object_dir , midx_hash ,
666+ MIDX_EXT_REV );
660667
661668 tmp_file = write_rev_file_order (ctx -> repo -> hash_algo , NULL , ctx -> pack_order ,
662669 ctx -> entries_nr , midx_hash , WRITE_REV );
@@ -829,22 +836,30 @@ static struct commit **find_commits_for_midx_bitmap(uint32_t *indexed_commits_nr
829836 return cb .commits ;
830837}
831838
832- static int write_midx_bitmap (struct repository * r , const char * midx_name ,
839+ static int write_midx_bitmap (struct write_midx_context * ctx ,
840+ const char * object_dir ,
833841 const unsigned char * midx_hash ,
834842 struct packing_data * pdata ,
835843 struct commit * * commits ,
836844 uint32_t commits_nr ,
837- uint32_t * pack_order ,
838845 unsigned flags )
839846{
840847 int ret , i ;
841848 uint16_t options = 0 ;
842849 struct bitmap_writer writer ;
843850 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 ));
851+ struct strbuf bitmap_name = STRBUF_INIT ;
852+
853+ if (ctx -> incremental )
854+ get_split_midx_filename_ext (ctx -> repo -> hash_algo ,
855+ & bitmap_name , object_dir , midx_hash ,
856+ MIDX_EXT_BITMAP );
857+ else
858+ get_midx_filename_ext (ctx -> repo -> hash_algo ,
859+ & bitmap_name , object_dir , midx_hash ,
860+ MIDX_EXT_BITMAP );
846861
847- trace2_region_enter ("midx" , "write_midx_bitmap" , r );
862+ trace2_region_enter ("midx" , "write_midx_bitmap" , ctx -> repo );
848863
849864 if (flags & MIDX_WRITE_BITMAP_HASH_CACHE )
850865 options |= BITMAP_OPT_HASH_CACHE ;
@@ -861,7 +876,8 @@ static int write_midx_bitmap(struct repository *r, const char *midx_name,
861876 for (i = 0 ; i < pdata -> nr_objects ; i ++ )
862877 index [i ] = & pdata -> objects [i ].idx ;
863878
864- bitmap_writer_init (& writer , r , pdata );
879+ bitmap_writer_init (& writer , ctx -> repo , pdata ,
880+ ctx -> incremental ? ctx -> base_midx : NULL );
865881 bitmap_writer_show_progress (& writer , flags & MIDX_PROGRESS );
866882 bitmap_writer_build_type_index (& writer , index );
867883
@@ -879,22 +895,22 @@ static int write_midx_bitmap(struct repository *r, const char *midx_name,
879895 * bitmap_writer_finish().
880896 */
881897 for (i = 0 ; i < pdata -> nr_objects ; i ++ )
882- index [pack_order [i ]] = & pdata -> objects [i ].idx ;
898+ index [ctx -> pack_order [i ]] = & pdata -> objects [i ].idx ;
883899
884900 bitmap_writer_select_commits (& writer , commits , commits_nr );
885901 ret = bitmap_writer_build (& writer );
886902 if (ret < 0 )
887903 goto cleanup ;
888904
889905 bitmap_writer_set_checksum (& writer , midx_hash );
890- bitmap_writer_finish (& writer , index , bitmap_name , options );
906+ bitmap_writer_finish (& writer , index , bitmap_name . buf , options );
891907
892908cleanup :
893909 free (index );
894- free ( bitmap_name );
910+ strbuf_release ( & bitmap_name );
895911 bitmap_writer_free (& writer );
896912
897- trace2_region_leave ("midx" , "write_midx_bitmap" , r );
913+ trace2_region_leave ("midx" , "write_midx_bitmap" , ctx -> repo );
898914
899915 return ret ;
900916}
@@ -1077,8 +1093,6 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
10771093 ctx .repo = r ;
10781094
10791095 ctx .incremental = !!(flags & MIDX_WRITE_INCREMENTAL );
1080- if (ctx .incremental && (flags & MIDX_WRITE_BITMAP ))
1081- die (_ ("cannot write incremental MIDX with bitmap" ));
10821096
10831097 if (ctx .incremental )
10841098 strbuf_addf (& midx_name ,
@@ -1119,6 +1133,13 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
11191133 if (ctx .incremental ) {
11201134 struct multi_pack_index * m = ctx .base_midx ;
11211135 while (m ) {
1136+ if (flags & MIDX_WRITE_BITMAP && load_midx_revindex (m )) {
1137+ error (_ ("could not load reverse index for MIDX %s" ),
1138+ hash_to_hex_algop (get_midx_checksum (m ),
1139+ r -> hash_algo ));
1140+ result = 1 ;
1141+ goto cleanup ;
1142+ }
11221143 ctx .num_multi_pack_indexes_before ++ ;
11231144 m = m -> base_midx ;
11241145 }
@@ -1387,7 +1408,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
13871408
13881409 if (flags & MIDX_WRITE_REV_INDEX &&
13891410 git_env_bool ("GIT_TEST_MIDX_WRITE_REV" , 0 ))
1390- write_midx_reverse_index (midx_name . buf , midx_hash , & ctx );
1411+ write_midx_reverse_index (& ctx , object_dir , midx_hash );
13911412
13921413 if (flags & MIDX_WRITE_BITMAP ) {
13931414 struct packing_data pdata ;
@@ -1410,8 +1431,8 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
14101431 FREE_AND_NULL (ctx .entries );
14111432 ctx .entries_nr = 0 ;
14121433
1413- if (write_midx_bitmap (r , midx_name . buf , midx_hash , & pdata ,
1414- commits , commits_nr , ctx . pack_order ,
1434+ if (write_midx_bitmap (& ctx , object_dir ,
1435+ midx_hash , & pdata , commits , commits_nr ,
14151436 flags ) < 0 ) {
14161437 error (_ ("could not write multi-pack bitmap" ));
14171438 result = 1 ;
0 commit comments