@@ -647,16 +647,22 @@ static uint32_t *midx_pack_order(struct write_midx_context *ctx)
647
647
return pack_order ;
648
648
}
649
649
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 )
652
653
{
653
654
struct strbuf buf = STRBUF_INIT ;
654
655
char * tmp_file ;
655
656
656
657
trace2_region_enter ("midx" , "write_midx_reverse_index" , ctx -> repo );
657
658
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 );
660
666
661
667
tmp_file = write_rev_file_order (ctx -> repo -> hash_algo , NULL , ctx -> pack_order ,
662
668
ctx -> entries_nr , midx_hash , WRITE_REV );
@@ -829,22 +835,29 @@ static struct commit **find_commits_for_midx_bitmap(uint32_t *indexed_commits_nr
829
835
return cb .commits ;
830
836
}
831
837
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 ,
833
840
const unsigned char * midx_hash ,
834
841
struct packing_data * pdata ,
835
842
struct commit * * commits ,
836
843
uint32_t commits_nr ,
837
- uint32_t * pack_order ,
838
844
unsigned flags )
839
845
{
840
846
int ret , i ;
841
847
uint16_t options = 0 ;
842
848
struct bitmap_writer writer ;
843
849
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 );
846
853
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 );
848
861
849
862
if (flags & MIDX_WRITE_BITMAP_HASH_CACHE )
850
863
options |= BITMAP_OPT_HASH_CACHE ;
@@ -861,7 +874,8 @@ static int write_midx_bitmap(struct repository *r, const char *midx_name,
861
874
for (i = 0 ; i < pdata -> nr_objects ; i ++ )
862
875
index [i ] = & pdata -> objects [i ].idx ;
863
876
864
- bitmap_writer_init (& writer , r , pdata );
877
+ bitmap_writer_init (& writer , ctx -> repo , pdata ,
878
+ ctx -> incremental ? ctx -> base_midx : NULL );
865
879
bitmap_writer_show_progress (& writer , flags & MIDX_PROGRESS );
866
880
bitmap_writer_build_type_index (& writer , index );
867
881
@@ -879,22 +893,22 @@ static int write_midx_bitmap(struct repository *r, const char *midx_name,
879
893
* bitmap_writer_finish().
880
894
*/
881
895
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 ;
883
897
884
898
bitmap_writer_select_commits (& writer , commits , commits_nr );
885
899
ret = bitmap_writer_build (& writer );
886
900
if (ret < 0 )
887
901
goto cleanup ;
888
902
889
903
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 );
891
905
892
906
cleanup :
893
907
free (index );
894
- free ( bitmap_name );
908
+ strbuf_release ( & bitmap_name );
895
909
bitmap_writer_free (& writer );
896
910
897
- trace2_region_leave ("midx" , "write_midx_bitmap" , r );
911
+ trace2_region_leave ("midx" , "write_midx_bitmap" , ctx -> repo );
898
912
899
913
return ret ;
900
914
}
@@ -1077,8 +1091,6 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1077
1091
ctx .repo = r ;
1078
1092
1079
1093
ctx .incremental = !!(flags & MIDX_WRITE_INCREMENTAL );
1080
- if (ctx .incremental && (flags & MIDX_WRITE_BITMAP ))
1081
- die (_ ("cannot write incremental MIDX with bitmap" ));
1082
1094
1083
1095
if (ctx .incremental )
1084
1096
strbuf_addf (& midx_name ,
@@ -1119,6 +1131,13 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1119
1131
if (ctx .incremental ) {
1120
1132
struct multi_pack_index * m = ctx .base_midx ;
1121
1133
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
+ }
1122
1141
ctx .num_multi_pack_indexes_before ++ ;
1123
1142
m = m -> base_midx ;
1124
1143
}
@@ -1387,7 +1406,7 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1387
1406
1388
1407
if (flags & MIDX_WRITE_REV_INDEX &&
1389
1408
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 );
1391
1410
1392
1411
if (flags & MIDX_WRITE_BITMAP ) {
1393
1412
struct packing_data pdata ;
@@ -1410,8 +1429,8 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
1410
1429
FREE_AND_NULL (ctx .entries );
1411
1430
ctx .entries_nr = 0 ;
1412
1431
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 ,
1415
1434
flags ) < 0 ) {
1416
1435
error (_ ("could not write multi-pack bitmap" ));
1417
1436
result = 1 ;
0 commit comments