|
20 | 20 | #include "list-objects-filter-options.h"
|
21 | 21 | #include "midx.h"
|
22 | 22 | #include "config.h"
|
| 23 | +#include "pseudo-merge.h" |
23 | 24 |
|
24 | 25 | /*
|
25 | 26 | * An entry on the bitmap index, representing the bitmap for a given
|
@@ -86,6 +87,9 @@ struct bitmap_index {
|
86 | 87 | */
|
87 | 88 | unsigned char *table_lookup;
|
88 | 89 |
|
| 90 | + /* This contains the pseudo-merge cache within 'map' (if found). */ |
| 91 | + struct pseudo_merge_map pseudo_merges; |
| 92 | + |
89 | 93 | /*
|
90 | 94 | * Extended index.
|
91 | 95 | *
|
@@ -205,6 +209,41 @@ static int load_bitmap_header(struct bitmap_index *index)
|
205 | 209 | index->table_lookup = (void *)(index_end - table_size);
|
206 | 210 | index_end -= table_size;
|
207 | 211 | }
|
| 212 | + |
| 213 | + if (flags & BITMAP_OPT_PSEUDO_MERGES) { |
| 214 | + unsigned char *pseudo_merge_ofs; |
| 215 | + size_t table_size; |
| 216 | + uint32_t i; |
| 217 | + |
| 218 | + if (sizeof(table_size) > index_end - index->map - header_size) |
| 219 | + return error(_("corrupted bitmap index file (too short to fit pseudo-merge table header)")); |
| 220 | + |
| 221 | + table_size = get_be64(index_end - 8); |
| 222 | + if (table_size > index_end - index->map - header_size) |
| 223 | + return error(_("corrupted bitmap index file (too short to fit pseudo-merge table)")); |
| 224 | + |
| 225 | + if (git_env_bool("GIT_TEST_USE_PSEUDO_MERGES", 1)) { |
| 226 | + const unsigned char *ext = (index_end - table_size); |
| 227 | + |
| 228 | + index->pseudo_merges.map = index->map; |
| 229 | + index->pseudo_merges.map_size = index->map_size; |
| 230 | + index->pseudo_merges.commits = ext + get_be64(index_end - 16); |
| 231 | + index->pseudo_merges.commits_nr = get_be32(index_end - 20); |
| 232 | + index->pseudo_merges.nr = get_be32(index_end - 24); |
| 233 | + |
| 234 | + CALLOC_ARRAY(index->pseudo_merges.v, |
| 235 | + index->pseudo_merges.nr); |
| 236 | + |
| 237 | + pseudo_merge_ofs = index_end - 24 - |
| 238 | + (index->pseudo_merges.nr * sizeof(uint64_t)); |
| 239 | + for (i = 0; i < index->pseudo_merges.nr; i++) { |
| 240 | + index->pseudo_merges.v[i].at = get_be64(pseudo_merge_ofs); |
| 241 | + pseudo_merge_ofs += sizeof(uint64_t); |
| 242 | + } |
| 243 | + } |
| 244 | + |
| 245 | + index_end -= table_size; |
| 246 | + } |
208 | 247 | }
|
209 | 248 |
|
210 | 249 | index->entry_count = ntohl(header->entry_count);
|
|
0 commit comments