@@ -25,8 +25,14 @@ struct bitmapped_commit {
25
25
int flags ;
26
26
int xor_offset ;
27
27
uint32_t commit_pos ;
28
+ unsigned pseudo_merge : 1 ;
28
29
};
29
30
31
+ static inline int bitmap_writer_nr_selected_commits (struct bitmap_writer * writer )
32
+ {
33
+ return writer -> selected_nr - writer -> pseudo_merges_nr ;
34
+ }
35
+
30
36
void bitmap_writer_init (struct bitmap_writer * writer , struct repository * r )
31
37
{
32
38
memset (writer , 0 , sizeof (struct bitmap_writer ));
@@ -129,27 +135,31 @@ void bitmap_writer_build_type_index(struct bitmap_writer *writer,
129
135
*/
130
136
131
137
static inline void push_bitmapped_commit (struct bitmap_writer * writer ,
132
- struct commit * commit )
138
+ struct commit * commit ,
139
+ unsigned pseudo_merge )
133
140
{
134
- int hash_ret ;
135
- khiter_t hash_pos ;
136
-
137
141
if (writer -> selected_nr >= writer -> selected_alloc ) {
138
142
writer -> selected_alloc = (writer -> selected_alloc + 32 ) * 2 ;
139
143
REALLOC_ARRAY (writer -> selected , writer -> selected_alloc );
140
144
}
141
145
142
- hash_pos = kh_put_oid_map (writer -> bitmaps , commit -> object .oid ,
143
- & hash_ret );
144
- if (!hash_ret )
145
- die (_ ("duplicate entry when writing bitmap index: %s" ),
146
- oid_to_hex (& commit -> object .oid ));
147
- kh_value (writer -> bitmaps , hash_pos ) = NULL ;
146
+ if (!pseudo_merge ) {
147
+ int hash_ret ;
148
+ khiter_t hash_pos = kh_put_oid_map (writer -> bitmaps ,
149
+ commit -> object .oid ,
150
+ & hash_ret );
151
+
152
+ if (!hash_ret )
153
+ die (_ ("duplicate entry when writing bitmap index: %s" ),
154
+ oid_to_hex (& commit -> object .oid ));
155
+ kh_value (writer -> bitmaps , hash_pos ) = NULL ;
156
+ }
148
157
149
158
writer -> selected [writer -> selected_nr ].commit = commit ;
150
159
writer -> selected [writer -> selected_nr ].bitmap = NULL ;
151
160
writer -> selected [writer -> selected_nr ].write_as = NULL ;
152
161
writer -> selected [writer -> selected_nr ].flags = 0 ;
162
+ writer -> selected [writer -> selected_nr ].pseudo_merge = pseudo_merge ;
153
163
154
164
writer -> selected_nr ++ ;
155
165
}
@@ -180,16 +190,20 @@ static void compute_xor_offsets(struct bitmap_writer *writer)
180
190
181
191
while (next < writer -> selected_nr ) {
182
192
struct bitmapped_commit * stored = & writer -> selected [next ];
183
-
184
193
int best_offset = 0 ;
185
194
struct ewah_bitmap * best_bitmap = stored -> bitmap ;
186
195
struct ewah_bitmap * test_xor ;
187
196
197
+ if (stored -> pseudo_merge )
198
+ goto next ;
199
+
188
200
for (i = 1 ; i <= MAX_XOR_OFFSET_SEARCH ; ++ i ) {
189
201
int curr = next - i ;
190
202
191
203
if (curr < 0 )
192
204
break ;
205
+ if (writer -> selected [curr ].pseudo_merge )
206
+ continue ;
193
207
194
208
test_xor = ewah_pool_new ();
195
209
ewah_xor (writer -> selected [curr ].bitmap , stored -> bitmap , test_xor );
@@ -205,6 +219,7 @@ static void compute_xor_offsets(struct bitmap_writer *writer)
205
219
}
206
220
}
207
221
222
+ next :
208
223
stored -> xor_offset = best_offset ;
209
224
stored -> write_as = best_bitmap ;
210
225
@@ -217,7 +232,8 @@ struct bb_commit {
217
232
struct bitmap * commit_mask ;
218
233
struct bitmap * bitmap ;
219
234
unsigned selected :1 ,
220
- maximal :1 ;
235
+ maximal :1 ,
236
+ pseudo_merge :1 ;
221
237
unsigned idx ; /* within selected array */
222
238
};
223
239
@@ -255,17 +271,18 @@ static void bitmap_builder_init(struct bitmap_builder *bb,
255
271
revs .first_parent_only = 1 ;
256
272
257
273
for (i = 0 ; i < writer -> selected_nr ; i ++ ) {
258
- struct commit * c = writer -> selected [i ]. commit ;
259
- struct bb_commit * ent = bb_data_at (& bb -> data , c );
274
+ struct bitmapped_commit * bc = & writer -> selected [i ];
275
+ struct bb_commit * ent = bb_data_at (& bb -> data , bc -> commit );
260
276
261
277
ent -> selected = 1 ;
262
278
ent -> maximal = 1 ;
279
+ ent -> pseudo_merge = bc -> pseudo_merge ;
263
280
ent -> idx = i ;
264
281
265
282
ent -> commit_mask = bitmap_new ();
266
283
bitmap_set (ent -> commit_mask , i );
267
284
268
- add_pending_object (& revs , & c -> object , "" );
285
+ add_pending_object (& revs , & bc -> commit -> object , "" );
269
286
}
270
287
271
288
if (prepare_revision_walk (& revs ))
@@ -444,8 +461,13 @@ static int fill_bitmap_commit(struct bitmap_writer *writer,
444
461
struct commit * c = prio_queue_get (queue );
445
462
446
463
if (old_bitmap && mapping ) {
447
- struct ewah_bitmap * old = bitmap_for_commit ( old_bitmap , c ) ;
464
+ struct ewah_bitmap * old ;
448
465
struct bitmap * remapped = bitmap_new ();
466
+
467
+ if (commit -> object .flags & BITMAP_PSEUDO_MERGE )
468
+ old = NULL ;
469
+ else
470
+ old = bitmap_for_commit (old_bitmap , c );
449
471
/*
450
472
* If this commit has an old bitmap, then translate that
451
473
* bitmap and add its bits to this one. No need to walk
@@ -464,12 +486,14 @@ static int fill_bitmap_commit(struct bitmap_writer *writer,
464
486
* Mark ourselves and queue our tree. The commit
465
487
* walk ensures we cover all parents.
466
488
*/
467
- pos = find_object_pos (writer , & c -> object .oid , & found );
468
- if (!found )
469
- return -1 ;
470
- bitmap_set (ent -> bitmap , pos );
471
- prio_queue_put (tree_queue ,
472
- repo_get_commit_tree (the_repository , c ));
489
+ if (!(c -> object .flags & BITMAP_PSEUDO_MERGE )) {
490
+ pos = find_object_pos (writer , & c -> object .oid , & found );
491
+ if (!found )
492
+ return -1 ;
493
+ bitmap_set (ent -> bitmap , pos );
494
+ prio_queue_put (tree_queue ,
495
+ repo_get_commit_tree (the_repository , c ));
496
+ }
473
497
474
498
for (p = c -> parents ; p ; p = p -> next ) {
475
499
pos = find_object_pos (writer , & p -> item -> object .oid ,
@@ -499,6 +523,9 @@ static void store_selected(struct bitmap_writer *writer,
499
523
500
524
stored -> bitmap = bitmap_to_ewah (ent -> bitmap );
501
525
526
+ if (ent -> pseudo_merge )
527
+ return ;
528
+
502
529
hash_pos = kh_get_oid_map (writer -> bitmaps , commit -> object .oid );
503
530
if (hash_pos == kh_end (writer -> bitmaps ))
504
531
die (_ ("attempted to store non-selected commit: '%s'" ),
@@ -631,7 +658,7 @@ void bitmap_writer_select_commits(struct bitmap_writer *writer,
631
658
632
659
if (indexed_commits_nr < 100 ) {
633
660
for (i = 0 ; i < indexed_commits_nr ; ++ i )
634
- push_bitmapped_commit (writer , indexed_commits [i ]);
661
+ push_bitmapped_commit (writer , indexed_commits [i ], 0 );
635
662
return ;
636
663
}
637
664
@@ -664,7 +691,7 @@ void bitmap_writer_select_commits(struct bitmap_writer *writer,
664
691
}
665
692
}
666
693
667
- push_bitmapped_commit (writer , chosen );
694
+ push_bitmapped_commit (writer , chosen , 0 );
668
695
669
696
i += next + 1 ;
670
697
display_progress (writer -> progress , i );
@@ -701,8 +728,11 @@ static void write_selected_commits_v1(struct bitmap_writer *writer,
701
728
{
702
729
int i ;
703
730
704
- for (i = 0 ; i < writer -> selected_nr ; ++ i ) {
731
+ for (i = 0 ; i < bitmap_writer_nr_selected_commits ( writer ) ; ++ i ) {
705
732
struct bitmapped_commit * stored = & writer -> selected [i ];
733
+ if (stored -> pseudo_merge )
734
+ BUG ("unexpected pseudo-merge among selected: %s" ,
735
+ oid_to_hex (& stored -> commit -> object .oid ));
706
736
707
737
if (offsets )
708
738
offsets [i ] = hashfile_total (f );
@@ -735,27 +765,27 @@ static void write_lookup_table(struct bitmap_writer *writer, struct hashfile *f,
735
765
uint32_t i ;
736
766
uint32_t * table , * table_inv ;
737
767
738
- ALLOC_ARRAY (table , writer -> selected_nr );
739
- ALLOC_ARRAY (table_inv , writer -> selected_nr );
768
+ ALLOC_ARRAY (table , bitmap_writer_nr_selected_commits ( writer ) );
769
+ ALLOC_ARRAY (table_inv , bitmap_writer_nr_selected_commits ( writer ) );
740
770
741
- for (i = 0 ; i < writer -> selected_nr ; i ++ )
771
+ for (i = 0 ; i < bitmap_writer_nr_selected_commits ( writer ) ; i ++ )
742
772
table [i ] = i ;
743
773
744
774
/*
745
775
* At the end of this sort table[j] = i means that the i'th
746
776
* bitmap corresponds to j'th bitmapped commit (among the selected
747
777
* commits) in lex order of OIDs.
748
778
*/
749
- QSORT_S (table , writer -> selected_nr , table_cmp , writer );
779
+ QSORT_S (table , bitmap_writer_nr_selected_commits ( writer ) , table_cmp , writer );
750
780
751
781
/* table_inv helps us discover that relationship (i'th bitmap
752
782
* to j'th commit by j = table_inv[i])
753
783
*/
754
- for (i = 0 ; i < writer -> selected_nr ; i ++ )
784
+ for (i = 0 ; i < bitmap_writer_nr_selected_commits ( writer ) ; i ++ )
755
785
table_inv [table [i ]] = i ;
756
786
757
787
trace2_region_enter ("pack-bitmap-write" , "writing_lookup_table" , the_repository );
758
- for (i = 0 ; i < writer -> selected_nr ; i ++ ) {
788
+ for (i = 0 ; i < bitmap_writer_nr_selected_commits ( writer ) ; i ++ ) {
759
789
struct bitmapped_commit * selected = & writer -> selected [table [i ]];
760
790
uint32_t xor_offset = selected -> xor_offset ;
761
791
uint32_t xor_row ;
@@ -827,7 +857,7 @@ void bitmap_writer_finish(struct bitmap_writer *writer,
827
857
memcpy (header .magic , BITMAP_IDX_SIGNATURE , sizeof (BITMAP_IDX_SIGNATURE ));
828
858
header .version = htons (default_version );
829
859
header .options = htons (flags | options );
830
- header .entry_count = htonl (writer -> selected_nr );
860
+ header .entry_count = htonl (bitmap_writer_nr_selected_commits ( writer ) );
831
861
hashcpy (header .checksum , writer -> pack_checksum );
832
862
833
863
hashwrite (f , & header , sizeof (header ) - GIT_MAX_RAWSZ + the_hash_algo -> rawsz );
@@ -839,7 +869,7 @@ void bitmap_writer_finish(struct bitmap_writer *writer,
839
869
if (options & BITMAP_OPT_LOOKUP_TABLE )
840
870
CALLOC_ARRAY (offsets , index_nr );
841
871
842
- for (i = 0 ; i < writer -> selected_nr ; i ++ ) {
872
+ for (i = 0 ; i < bitmap_writer_nr_selected_commits ( writer ) ; i ++ ) {
843
873
struct bitmapped_commit * stored = & writer -> selected [i ];
844
874
int commit_pos = oid_pos (& stored -> commit -> object .oid , index ,
845
875
index_nr , oid_access );
0 commit comments