pack-bitmap.con commit bitmap_has_sha1_in_uninteresting(): drop BUG check (5476fb0)
   1#include "cache.h"
   2#include "commit.h"
   3#include "tag.h"
   4#include "diff.h"
   5#include "revision.h"
   6#include "progress.h"
   7#include "list-objects.h"
   8#include "pack.h"
   9#include "pack-bitmap.h"
  10#include "pack-revindex.h"
  11#include "pack-objects.h"
  12#include "packfile.h"
  13#include "repository.h"
  14#include "object-store.h"
  15
  16/*
  17 * An entry on the bitmap index, representing the bitmap for a given
  18 * commit.
  19 */
  20struct stored_bitmap {
  21        unsigned char sha1[20];
  22        struct ewah_bitmap *root;
  23        struct stored_bitmap *xor;
  24        int flags;
  25};
  26
  27/*
  28 * The active bitmap index for a repository. By design, repositories only have
  29 * a single bitmap index available (the index for the biggest packfile in
  30 * the repository), since bitmap indexes need full closure.
  31 *
  32 * If there is more than one bitmap index available (e.g. because of alternates),
  33 * the active bitmap index is the largest one.
  34 */
  35struct bitmap_index {
  36        /* Packfile to which this bitmap index belongs to */
  37        struct packed_git *pack;
  38
  39        /*
  40         * Mark the first `reuse_objects` in the packfile as reused:
  41         * they will be sent as-is without using them for repacking
  42         * calculations
  43         */
  44        uint32_t reuse_objects;
  45
  46        /* mmapped buffer of the whole bitmap index */
  47        unsigned char *map;
  48        size_t map_size; /* size of the mmaped buffer */
  49        size_t map_pos; /* current position when loading the index */
  50
  51        /*
  52         * Type indexes.
  53         *
  54         * Each bitmap marks which objects in the packfile  are of the given
  55         * type. This provides type information when yielding the objects from
  56         * the packfile during a walk, which allows for better delta bases.
  57         */
  58        struct ewah_bitmap *commits;
  59        struct ewah_bitmap *trees;
  60        struct ewah_bitmap *blobs;
  61        struct ewah_bitmap *tags;
  62
  63        /* Map from SHA1 -> `stored_bitmap` for all the bitmapped commits */
  64        khash_sha1 *bitmaps;
  65
  66        /* Number of bitmapped commits */
  67        uint32_t entry_count;
  68
  69        /* If not NULL, this is a name-hash cache pointing into map. */
  70        uint32_t *hashes;
  71
  72        /*
  73         * Extended index.
  74         *
  75         * When trying to perform bitmap operations with objects that are not
  76         * packed in `pack`, these objects are added to this "fake index" and
  77         * are assumed to appear at the end of the packfile for all operations
  78         */
  79        struct eindex {
  80                struct object **objects;
  81                uint32_t *hashes;
  82                uint32_t count, alloc;
  83                khash_sha1_pos *positions;
  84        } ext_index;
  85
  86        /* Bitmap result of the last performed walk */
  87        struct bitmap *result;
  88
  89        /* "have" bitmap from the last performed walk */
  90        struct bitmap *haves;
  91
  92        /* Version of the bitmap index */
  93        unsigned int version;
  94
  95        unsigned loaded : 1;
  96};
  97
  98static struct ewah_bitmap *lookup_stored_bitmap(struct stored_bitmap *st)
  99{
 100        struct ewah_bitmap *parent;
 101        struct ewah_bitmap *composed;
 102
 103        if (st->xor == NULL)
 104                return st->root;
 105
 106        composed = ewah_pool_new();
 107        parent = lookup_stored_bitmap(st->xor);
 108        ewah_xor(st->root, parent, composed);
 109
 110        ewah_pool_free(st->root);
 111        st->root = composed;
 112        st->xor = NULL;
 113
 114        return composed;
 115}
 116
 117/*
 118 * Read a bitmap from the current read position on the mmaped
 119 * index, and increase the read position accordingly
 120 */
 121static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
 122{
 123        struct ewah_bitmap *b = ewah_pool_new();
 124
 125        ssize_t bitmap_size = ewah_read_mmap(b,
 126                index->map + index->map_pos,
 127                index->map_size - index->map_pos);
 128
 129        if (bitmap_size < 0) {
 130                error("Failed to load bitmap index (corrupted?)");
 131                ewah_pool_free(b);
 132                return NULL;
 133        }
 134
 135        index->map_pos += bitmap_size;
 136        return b;
 137}
 138
 139static int load_bitmap_header(struct bitmap_index *index)
 140{
 141        struct bitmap_disk_header *header = (void *)index->map;
 142
 143        if (index->map_size < sizeof(*header) + 20)
 144                return error("Corrupted bitmap index (missing header data)");
 145
 146        if (memcmp(header->magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE)) != 0)
 147                return error("Corrupted bitmap index file (wrong header)");
 148
 149        index->version = ntohs(header->version);
 150        if (index->version != 1)
 151                return error("Unsupported version for bitmap index file (%d)", index->version);
 152
 153        /* Parse known bitmap format options */
 154        {
 155                uint32_t flags = ntohs(header->options);
 156
 157                if ((flags & BITMAP_OPT_FULL_DAG) == 0)
 158                        return error("Unsupported options for bitmap index file "
 159                                "(Git requires BITMAP_OPT_FULL_DAG)");
 160
 161                if (flags & BITMAP_OPT_HASH_CACHE) {
 162                        unsigned char *end = index->map + index->map_size - 20;
 163                        index->hashes = ((uint32_t *)end) - index->pack->num_objects;
 164                }
 165        }
 166
 167        index->entry_count = ntohl(header->entry_count);
 168        index->map_pos += sizeof(*header);
 169        return 0;
 170}
 171
 172static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
 173                                          struct ewah_bitmap *root,
 174                                          const unsigned char *sha1,
 175                                          struct stored_bitmap *xor_with,
 176                                          int flags)
 177{
 178        struct stored_bitmap *stored;
 179        khiter_t hash_pos;
 180        int ret;
 181
 182        stored = xmalloc(sizeof(struct stored_bitmap));
 183        stored->root = root;
 184        stored->xor = xor_with;
 185        stored->flags = flags;
 186        hashcpy(stored->sha1, sha1);
 187
 188        hash_pos = kh_put_sha1(index->bitmaps, stored->sha1, &ret);
 189
 190        /* a 0 return code means the insertion succeeded with no changes,
 191         * because the SHA1 already existed on the map. this is bad, there
 192         * shouldn't be duplicated commits in the index */
 193        if (ret == 0) {
 194                error("Duplicate entry in bitmap index: %s", sha1_to_hex(sha1));
 195                return NULL;
 196        }
 197
 198        kh_value(index->bitmaps, hash_pos) = stored;
 199        return stored;
 200}
 201
 202static inline uint32_t read_be32(const unsigned char *buffer, size_t *pos)
 203{
 204        uint32_t result = get_be32(buffer + *pos);
 205        (*pos) += sizeof(result);
 206        return result;
 207}
 208
 209static inline uint8_t read_u8(const unsigned char *buffer, size_t *pos)
 210{
 211        return buffer[(*pos)++];
 212}
 213
 214#define MAX_XOR_OFFSET 160
 215
 216static int load_bitmap_entries_v1(struct bitmap_index *index)
 217{
 218        uint32_t i;
 219        struct stored_bitmap *recent_bitmaps[MAX_XOR_OFFSET] = { NULL };
 220
 221        for (i = 0; i < index->entry_count; ++i) {
 222                int xor_offset, flags;
 223                struct ewah_bitmap *bitmap = NULL;
 224                struct stored_bitmap *xor_bitmap = NULL;
 225                uint32_t commit_idx_pos;
 226                const unsigned char *sha1;
 227
 228                commit_idx_pos = read_be32(index->map, &index->map_pos);
 229                xor_offset = read_u8(index->map, &index->map_pos);
 230                flags = read_u8(index->map, &index->map_pos);
 231
 232                sha1 = nth_packed_object_sha1(index->pack, commit_idx_pos);
 233
 234                bitmap = read_bitmap_1(index);
 235                if (!bitmap)
 236                        return -1;
 237
 238                if (xor_offset > MAX_XOR_OFFSET || xor_offset > i)
 239                        return error("Corrupted bitmap pack index");
 240
 241                if (xor_offset > 0) {
 242                        xor_bitmap = recent_bitmaps[(i - xor_offset) % MAX_XOR_OFFSET];
 243
 244                        if (xor_bitmap == NULL)
 245                                return error("Invalid XOR offset in bitmap pack index");
 246                }
 247
 248                recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
 249                        index, bitmap, sha1, xor_bitmap, flags);
 250        }
 251
 252        return 0;
 253}
 254
 255static char *pack_bitmap_filename(struct packed_git *p)
 256{
 257        size_t len;
 258
 259        if (!strip_suffix(p->pack_name, ".pack", &len))
 260                BUG("pack_name does not end in .pack");
 261        return xstrfmt("%.*s.bitmap", (int)len, p->pack_name);
 262}
 263
 264static int open_pack_bitmap_1(struct bitmap_index *bitmap_git, struct packed_git *packfile)
 265{
 266        int fd;
 267        struct stat st;
 268        char *idx_name;
 269
 270        if (open_pack_index(packfile))
 271                return -1;
 272
 273        idx_name = pack_bitmap_filename(packfile);
 274        fd = git_open(idx_name);
 275        free(idx_name);
 276
 277        if (fd < 0)
 278                return -1;
 279
 280        if (fstat(fd, &st)) {
 281                close(fd);
 282                return -1;
 283        }
 284
 285        if (bitmap_git->pack) {
 286                warning("ignoring extra bitmap file: %s", packfile->pack_name);
 287                close(fd);
 288                return -1;
 289        }
 290
 291        bitmap_git->pack = packfile;
 292        bitmap_git->map_size = xsize_t(st.st_size);
 293        bitmap_git->map = xmmap(NULL, bitmap_git->map_size, PROT_READ, MAP_PRIVATE, fd, 0);
 294        bitmap_git->map_pos = 0;
 295        close(fd);
 296
 297        if (load_bitmap_header(bitmap_git) < 0) {
 298                munmap(bitmap_git->map, bitmap_git->map_size);
 299                bitmap_git->map = NULL;
 300                bitmap_git->map_size = 0;
 301                return -1;
 302        }
 303
 304        return 0;
 305}
 306
 307static int load_pack_bitmap(struct bitmap_index *bitmap_git)
 308{
 309        assert(bitmap_git->map && !bitmap_git->loaded);
 310
 311        bitmap_git->bitmaps = kh_init_sha1();
 312        bitmap_git->ext_index.positions = kh_init_sha1_pos();
 313        load_pack_revindex(bitmap_git->pack);
 314
 315        if (!(bitmap_git->commits = read_bitmap_1(bitmap_git)) ||
 316                !(bitmap_git->trees = read_bitmap_1(bitmap_git)) ||
 317                !(bitmap_git->blobs = read_bitmap_1(bitmap_git)) ||
 318                !(bitmap_git->tags = read_bitmap_1(bitmap_git)))
 319                goto failed;
 320
 321        if (load_bitmap_entries_v1(bitmap_git) < 0)
 322                goto failed;
 323
 324        bitmap_git->loaded = 1;
 325        return 0;
 326
 327failed:
 328        munmap(bitmap_git->map, bitmap_git->map_size);
 329        bitmap_git->map = NULL;
 330        bitmap_git->map_size = 0;
 331        return -1;
 332}
 333
 334static int open_pack_bitmap(struct bitmap_index *bitmap_git)
 335{
 336        struct packed_git *p;
 337        int ret = -1;
 338
 339        assert(!bitmap_git->map && !bitmap_git->loaded);
 340
 341        for (p = get_packed_git(the_repository); p; p = p->next) {
 342                if (open_pack_bitmap_1(bitmap_git, p) == 0)
 343                        ret = 0;
 344        }
 345
 346        return ret;
 347}
 348
 349struct bitmap_index *prepare_bitmap_git(void)
 350{
 351        struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
 352
 353        if (!open_pack_bitmap(bitmap_git) && !load_pack_bitmap(bitmap_git))
 354                return bitmap_git;
 355
 356        free_bitmap_index(bitmap_git);
 357        return NULL;
 358}
 359
 360struct include_data {
 361        struct bitmap_index *bitmap_git;
 362        struct bitmap *base;
 363        struct bitmap *seen;
 364};
 365
 366static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
 367                                           const unsigned char *sha1)
 368{
 369        khash_sha1_pos *positions = bitmap_git->ext_index.positions;
 370        khiter_t pos = kh_get_sha1_pos(positions, sha1);
 371
 372        if (pos < kh_end(positions)) {
 373                int bitmap_pos = kh_value(positions, pos);
 374                return bitmap_pos + bitmap_git->pack->num_objects;
 375        }
 376
 377        return -1;
 378}
 379
 380static inline int bitmap_position_packfile(struct bitmap_index *bitmap_git,
 381                                           const unsigned char *sha1)
 382{
 383        off_t offset = find_pack_entry_one(sha1, bitmap_git->pack);
 384        if (!offset)
 385                return -1;
 386
 387        return find_revindex_position(bitmap_git->pack, offset);
 388}
 389
 390static int bitmap_position(struct bitmap_index *bitmap_git,
 391                           const unsigned char *sha1)
 392{
 393        int pos = bitmap_position_packfile(bitmap_git, sha1);
 394        return (pos >= 0) ? pos : bitmap_position_extended(bitmap_git, sha1);
 395}
 396
 397static int ext_index_add_object(struct bitmap_index *bitmap_git,
 398                                struct object *object, const char *name)
 399{
 400        struct eindex *eindex = &bitmap_git->ext_index;
 401
 402        khiter_t hash_pos;
 403        int hash_ret;
 404        int bitmap_pos;
 405
 406        hash_pos = kh_put_sha1_pos(eindex->positions, object->oid.hash, &hash_ret);
 407        if (hash_ret > 0) {
 408                if (eindex->count >= eindex->alloc) {
 409                        eindex->alloc = (eindex->alloc + 16) * 3 / 2;
 410                        REALLOC_ARRAY(eindex->objects, eindex->alloc);
 411                        REALLOC_ARRAY(eindex->hashes, eindex->alloc);
 412                }
 413
 414                bitmap_pos = eindex->count;
 415                eindex->objects[eindex->count] = object;
 416                eindex->hashes[eindex->count] = pack_name_hash(name);
 417                kh_value(eindex->positions, hash_pos) = bitmap_pos;
 418                eindex->count++;
 419        } else {
 420                bitmap_pos = kh_value(eindex->positions, hash_pos);
 421        }
 422
 423        return bitmap_pos + bitmap_git->pack->num_objects;
 424}
 425
 426struct bitmap_show_data {
 427        struct bitmap_index *bitmap_git;
 428        struct bitmap *base;
 429};
 430
 431static void show_object(struct object *object, const char *name, void *data_)
 432{
 433        struct bitmap_show_data *data = data_;
 434        int bitmap_pos;
 435
 436        bitmap_pos = bitmap_position(data->bitmap_git, object->oid.hash);
 437
 438        if (bitmap_pos < 0)
 439                bitmap_pos = ext_index_add_object(data->bitmap_git, object,
 440                                                  name);
 441
 442        bitmap_set(data->base, bitmap_pos);
 443}
 444
 445static void show_commit(struct commit *commit, void *data)
 446{
 447}
 448
 449static int add_to_include_set(struct bitmap_index *bitmap_git,
 450                              struct include_data *data,
 451                              const unsigned char *sha1,
 452                              int bitmap_pos)
 453{
 454        khiter_t hash_pos;
 455
 456        if (data->seen && bitmap_get(data->seen, bitmap_pos))
 457                return 0;
 458
 459        if (bitmap_get(data->base, bitmap_pos))
 460                return 0;
 461
 462        hash_pos = kh_get_sha1(bitmap_git->bitmaps, sha1);
 463        if (hash_pos < kh_end(bitmap_git->bitmaps)) {
 464                struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, hash_pos);
 465                bitmap_or_ewah(data->base, lookup_stored_bitmap(st));
 466                return 0;
 467        }
 468
 469        bitmap_set(data->base, bitmap_pos);
 470        return 1;
 471}
 472
 473static int should_include(struct commit *commit, void *_data)
 474{
 475        struct include_data *data = _data;
 476        int bitmap_pos;
 477
 478        bitmap_pos = bitmap_position(data->bitmap_git, commit->object.oid.hash);
 479        if (bitmap_pos < 0)
 480                bitmap_pos = ext_index_add_object(data->bitmap_git,
 481                                                  (struct object *)commit,
 482                                                  NULL);
 483
 484        if (!add_to_include_set(data->bitmap_git, data, commit->object.oid.hash,
 485                                bitmap_pos)) {
 486                struct commit_list *parent = commit->parents;
 487
 488                while (parent) {
 489                        parent->item->object.flags |= SEEN;
 490                        parent = parent->next;
 491                }
 492
 493                return 0;
 494        }
 495
 496        return 1;
 497}
 498
 499static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
 500                                   struct rev_info *revs,
 501                                   struct object_list *roots,
 502                                   struct bitmap *seen)
 503{
 504        struct bitmap *base = NULL;
 505        int needs_walk = 0;
 506
 507        struct object_list *not_mapped = NULL;
 508
 509        /*
 510         * Go through all the roots for the walk. The ones that have bitmaps
 511         * on the bitmap index will be `or`ed together to form an initial
 512         * global reachability analysis.
 513         *
 514         * The ones without bitmaps in the index will be stored in the
 515         * `not_mapped_list` for further processing.
 516         */
 517        while (roots) {
 518                struct object *object = roots->item;
 519                roots = roots->next;
 520
 521                if (object->type == OBJ_COMMIT) {
 522                        khiter_t pos = kh_get_sha1(bitmap_git->bitmaps, object->oid.hash);
 523
 524                        if (pos < kh_end(bitmap_git->bitmaps)) {
 525                                struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
 526                                struct ewah_bitmap *or_with = lookup_stored_bitmap(st);
 527
 528                                if (base == NULL)
 529                                        base = ewah_to_bitmap(or_with);
 530                                else
 531                                        bitmap_or_ewah(base, or_with);
 532
 533                                object->flags |= SEEN;
 534                                continue;
 535                        }
 536                }
 537
 538                object_list_insert(object, &not_mapped);
 539        }
 540
 541        /*
 542         * Best case scenario: We found bitmaps for all the roots,
 543         * so the resulting `or` bitmap has the full reachability analysis
 544         */
 545        if (not_mapped == NULL)
 546                return base;
 547
 548        roots = not_mapped;
 549
 550        /*
 551         * Let's iterate through all the roots that don't have bitmaps to
 552         * check if we can determine them to be reachable from the existing
 553         * global bitmap.
 554         *
 555         * If we cannot find them in the existing global bitmap, we'll need
 556         * to push them to an actual walk and run it until we can confirm
 557         * they are reachable
 558         */
 559        while (roots) {
 560                struct object *object = roots->item;
 561                int pos;
 562
 563                roots = roots->next;
 564                pos = bitmap_position(bitmap_git, object->oid.hash);
 565
 566                if (pos < 0 || base == NULL || !bitmap_get(base, pos)) {
 567                        object->flags &= ~UNINTERESTING;
 568                        add_pending_object(revs, object, "");
 569                        needs_walk = 1;
 570                } else {
 571                        object->flags |= SEEN;
 572                }
 573        }
 574
 575        if (needs_walk) {
 576                struct include_data incdata;
 577                struct bitmap_show_data show_data;
 578
 579                if (base == NULL)
 580                        base = bitmap_new();
 581
 582                incdata.bitmap_git = bitmap_git;
 583                incdata.base = base;
 584                incdata.seen = seen;
 585
 586                revs->include_check = should_include;
 587                revs->include_check_data = &incdata;
 588
 589                if (prepare_revision_walk(revs))
 590                        die("revision walk setup failed");
 591
 592                show_data.bitmap_git = bitmap_git;
 593                show_data.base = base;
 594
 595                traverse_commit_list(revs, show_commit, show_object,
 596                                     &show_data);
 597        }
 598
 599        return base;
 600}
 601
 602static void show_extended_objects(struct bitmap_index *bitmap_git,
 603                                  show_reachable_fn show_reach)
 604{
 605        struct bitmap *objects = bitmap_git->result;
 606        struct eindex *eindex = &bitmap_git->ext_index;
 607        uint32_t i;
 608
 609        for (i = 0; i < eindex->count; ++i) {
 610                struct object *obj;
 611
 612                if (!bitmap_get(objects, bitmap_git->pack->num_objects + i))
 613                        continue;
 614
 615                obj = eindex->objects[i];
 616                show_reach(&obj->oid, obj->type, 0, eindex->hashes[i], NULL, 0);
 617        }
 618}
 619
 620static void show_objects_for_type(
 621        struct bitmap_index *bitmap_git,
 622        struct ewah_bitmap *type_filter,
 623        enum object_type object_type,
 624        show_reachable_fn show_reach)
 625{
 626        size_t pos = 0, i = 0;
 627        uint32_t offset;
 628
 629        struct ewah_iterator it;
 630        eword_t filter;
 631
 632        struct bitmap *objects = bitmap_git->result;
 633
 634        if (bitmap_git->reuse_objects == bitmap_git->pack->num_objects)
 635                return;
 636
 637        ewah_iterator_init(&it, type_filter);
 638
 639        while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) {
 640                eword_t word = objects->words[i] & filter;
 641
 642                for (offset = 0; offset < BITS_IN_EWORD; ++offset) {
 643                        struct object_id oid;
 644                        struct revindex_entry *entry;
 645                        uint32_t hash = 0;
 646
 647                        if ((word >> offset) == 0)
 648                                break;
 649
 650                        offset += ewah_bit_ctz64(word >> offset);
 651
 652                        if (pos + offset < bitmap_git->reuse_objects)
 653                                continue;
 654
 655                        entry = &bitmap_git->pack->revindex[pos + offset];
 656                        nth_packed_object_oid(&oid, bitmap_git->pack, entry->nr);
 657
 658                        if (bitmap_git->hashes)
 659                                hash = get_be32(bitmap_git->hashes + entry->nr);
 660
 661                        show_reach(&oid, object_type, 0, hash, bitmap_git->pack, entry->offset);
 662                }
 663
 664                pos += BITS_IN_EWORD;
 665                i++;
 666        }
 667}
 668
 669static int in_bitmapped_pack(struct bitmap_index *bitmap_git,
 670                             struct object_list *roots)
 671{
 672        while (roots) {
 673                struct object *object = roots->item;
 674                roots = roots->next;
 675
 676                if (find_pack_entry_one(object->oid.hash, bitmap_git->pack) > 0)
 677                        return 1;
 678        }
 679
 680        return 0;
 681}
 682
 683struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
 684{
 685        unsigned int i;
 686
 687        struct object_list *wants = NULL;
 688        struct object_list *haves = NULL;
 689
 690        struct bitmap *wants_bitmap = NULL;
 691        struct bitmap *haves_bitmap = NULL;
 692
 693        struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
 694        /* try to open a bitmapped pack, but don't parse it yet
 695         * because we may not need to use it */
 696        if (open_pack_bitmap(bitmap_git) < 0)
 697                goto cleanup;
 698
 699        for (i = 0; i < revs->pending.nr; ++i) {
 700                struct object *object = revs->pending.objects[i].item;
 701
 702                if (object->type == OBJ_NONE)
 703                        parse_object_or_die(&object->oid, NULL);
 704
 705                while (object->type == OBJ_TAG) {
 706                        struct tag *tag = (struct tag *) object;
 707
 708                        if (object->flags & UNINTERESTING)
 709                                object_list_insert(object, &haves);
 710                        else
 711                                object_list_insert(object, &wants);
 712
 713                        if (!tag->tagged)
 714                                die("bad tag");
 715                        object = parse_object_or_die(&tag->tagged->oid, NULL);
 716                }
 717
 718                if (object->flags & UNINTERESTING)
 719                        object_list_insert(object, &haves);
 720                else
 721                        object_list_insert(object, &wants);
 722        }
 723
 724        /*
 725         * if we have a HAVES list, but none of those haves is contained
 726         * in the packfile that has a bitmap, we don't have anything to
 727         * optimize here
 728         */
 729        if (haves && !in_bitmapped_pack(bitmap_git, haves))
 730                goto cleanup;
 731
 732        /* if we don't want anything, we're done here */
 733        if (!wants)
 734                goto cleanup;
 735
 736        /*
 737         * now we're going to use bitmaps, so load the actual bitmap entries
 738         * from disk. this is the point of no return; after this the rev_list
 739         * becomes invalidated and we must perform the revwalk through bitmaps
 740         */
 741        if (!bitmap_git->loaded && load_pack_bitmap(bitmap_git) < 0)
 742                goto cleanup;
 743
 744        object_array_clear(&revs->pending);
 745
 746        if (haves) {
 747                revs->ignore_missing_links = 1;
 748                haves_bitmap = find_objects(bitmap_git, revs, haves, NULL);
 749                reset_revision_walk();
 750                revs->ignore_missing_links = 0;
 751
 752                if (haves_bitmap == NULL)
 753                        BUG("failed to perform bitmap walk");
 754        }
 755
 756        wants_bitmap = find_objects(bitmap_git, revs, wants, haves_bitmap);
 757
 758        if (!wants_bitmap)
 759                BUG("failed to perform bitmap walk");
 760
 761        if (haves_bitmap)
 762                bitmap_and_not(wants_bitmap, haves_bitmap);
 763
 764        bitmap_git->result = wants_bitmap;
 765        bitmap_git->haves = haves_bitmap;
 766
 767        return bitmap_git;
 768
 769cleanup:
 770        free_bitmap_index(bitmap_git);
 771        return NULL;
 772}
 773
 774int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
 775                                       struct packed_git **packfile,
 776                                       uint32_t *entries,
 777                                       off_t *up_to)
 778{
 779        /*
 780         * Reuse the packfile content if we need more than
 781         * 90% of its objects
 782         */
 783        static const double REUSE_PERCENT = 0.9;
 784
 785        struct bitmap *result = bitmap_git->result;
 786        uint32_t reuse_threshold;
 787        uint32_t i, reuse_objects = 0;
 788
 789        assert(result);
 790
 791        for (i = 0; i < result->word_alloc; ++i) {
 792                if (result->words[i] != (eword_t)~0) {
 793                        reuse_objects += ewah_bit_ctz64(~result->words[i]);
 794                        break;
 795                }
 796
 797                reuse_objects += BITS_IN_EWORD;
 798        }
 799
 800#ifdef GIT_BITMAP_DEBUG
 801        {
 802                const unsigned char *sha1;
 803                struct revindex_entry *entry;
 804
 805                entry = &bitmap_git->reverse_index->revindex[reuse_objects];
 806                sha1 = nth_packed_object_sha1(bitmap_git->pack, entry->nr);
 807
 808                fprintf(stderr, "Failed to reuse at %d (%016llx)\n",
 809                        reuse_objects, result->words[i]);
 810                fprintf(stderr, " %s\n", sha1_to_hex(sha1));
 811        }
 812#endif
 813
 814        if (!reuse_objects)
 815                return -1;
 816
 817        if (reuse_objects >= bitmap_git->pack->num_objects) {
 818                bitmap_git->reuse_objects = *entries = bitmap_git->pack->num_objects;
 819                *up_to = -1; /* reuse the full pack */
 820                *packfile = bitmap_git->pack;
 821                return 0;
 822        }
 823
 824        reuse_threshold = bitmap_popcount(bitmap_git->result) * REUSE_PERCENT;
 825
 826        if (reuse_objects < reuse_threshold)
 827                return -1;
 828
 829        bitmap_git->reuse_objects = *entries = reuse_objects;
 830        *up_to = bitmap_git->pack->revindex[reuse_objects].offset;
 831        *packfile = bitmap_git->pack;
 832
 833        return 0;
 834}
 835
 836void traverse_bitmap_commit_list(struct bitmap_index *bitmap_git,
 837                                 show_reachable_fn show_reachable)
 838{
 839        assert(bitmap_git->result);
 840
 841        show_objects_for_type(bitmap_git, bitmap_git->commits,
 842                OBJ_COMMIT, show_reachable);
 843        show_objects_for_type(bitmap_git, bitmap_git->trees,
 844                OBJ_TREE, show_reachable);
 845        show_objects_for_type(bitmap_git, bitmap_git->blobs,
 846                OBJ_BLOB, show_reachable);
 847        show_objects_for_type(bitmap_git, bitmap_git->tags,
 848                OBJ_TAG, show_reachable);
 849
 850        show_extended_objects(bitmap_git, show_reachable);
 851
 852        bitmap_free(bitmap_git->result);
 853        bitmap_git->result = NULL;
 854}
 855
 856static uint32_t count_object_type(struct bitmap_index *bitmap_git,
 857                                  enum object_type type)
 858{
 859        struct bitmap *objects = bitmap_git->result;
 860        struct eindex *eindex = &bitmap_git->ext_index;
 861
 862        uint32_t i = 0, count = 0;
 863        struct ewah_iterator it;
 864        eword_t filter;
 865
 866        switch (type) {
 867        case OBJ_COMMIT:
 868                ewah_iterator_init(&it, bitmap_git->commits);
 869                break;
 870
 871        case OBJ_TREE:
 872                ewah_iterator_init(&it, bitmap_git->trees);
 873                break;
 874
 875        case OBJ_BLOB:
 876                ewah_iterator_init(&it, bitmap_git->blobs);
 877                break;
 878
 879        case OBJ_TAG:
 880                ewah_iterator_init(&it, bitmap_git->tags);
 881                break;
 882
 883        default:
 884                return 0;
 885        }
 886
 887        while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) {
 888                eword_t word = objects->words[i++] & filter;
 889                count += ewah_bit_popcount64(word);
 890        }
 891
 892        for (i = 0; i < eindex->count; ++i) {
 893                if (eindex->objects[i]->type == type &&
 894                        bitmap_get(objects, bitmap_git->pack->num_objects + i))
 895                        count++;
 896        }
 897
 898        return count;
 899}
 900
 901void count_bitmap_commit_list(struct bitmap_index *bitmap_git,
 902                              uint32_t *commits, uint32_t *trees,
 903                              uint32_t *blobs, uint32_t *tags)
 904{
 905        assert(bitmap_git->result);
 906
 907        if (commits)
 908                *commits = count_object_type(bitmap_git, OBJ_COMMIT);
 909
 910        if (trees)
 911                *trees = count_object_type(bitmap_git, OBJ_TREE);
 912
 913        if (blobs)
 914                *blobs = count_object_type(bitmap_git, OBJ_BLOB);
 915
 916        if (tags)
 917                *tags = count_object_type(bitmap_git, OBJ_TAG);
 918}
 919
 920struct bitmap_test_data {
 921        struct bitmap_index *bitmap_git;
 922        struct bitmap *base;
 923        struct progress *prg;
 924        size_t seen;
 925};
 926
 927static void test_show_object(struct object *object, const char *name,
 928                             void *data)
 929{
 930        struct bitmap_test_data *tdata = data;
 931        int bitmap_pos;
 932
 933        bitmap_pos = bitmap_position(tdata->bitmap_git, object->oid.hash);
 934        if (bitmap_pos < 0)
 935                die("Object not in bitmap: %s\n", oid_to_hex(&object->oid));
 936
 937        bitmap_set(tdata->base, bitmap_pos);
 938        display_progress(tdata->prg, ++tdata->seen);
 939}
 940
 941static void test_show_commit(struct commit *commit, void *data)
 942{
 943        struct bitmap_test_data *tdata = data;
 944        int bitmap_pos;
 945
 946        bitmap_pos = bitmap_position(tdata->bitmap_git,
 947                                     commit->object.oid.hash);
 948        if (bitmap_pos < 0)
 949                die("Object not in bitmap: %s\n", oid_to_hex(&commit->object.oid));
 950
 951        bitmap_set(tdata->base, bitmap_pos);
 952        display_progress(tdata->prg, ++tdata->seen);
 953}
 954
 955void test_bitmap_walk(struct rev_info *revs)
 956{
 957        struct object *root;
 958        struct bitmap *result = NULL;
 959        khiter_t pos;
 960        size_t result_popcnt;
 961        struct bitmap_test_data tdata;
 962        struct bitmap_index *bitmap_git;
 963
 964        if (!(bitmap_git = prepare_bitmap_git()))
 965                die("failed to load bitmap indexes");
 966
 967        if (revs->pending.nr != 1)
 968                die("you must specify exactly one commit to test");
 969
 970        fprintf(stderr, "Bitmap v%d test (%d entries loaded)\n",
 971                bitmap_git->version, bitmap_git->entry_count);
 972
 973        root = revs->pending.objects[0].item;
 974        pos = kh_get_sha1(bitmap_git->bitmaps, root->oid.hash);
 975
 976        if (pos < kh_end(bitmap_git->bitmaps)) {
 977                struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
 978                struct ewah_bitmap *bm = lookup_stored_bitmap(st);
 979
 980                fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n",
 981                        oid_to_hex(&root->oid), (int)bm->bit_size, ewah_checksum(bm));
 982
 983                result = ewah_to_bitmap(bm);
 984        }
 985
 986        if (result == NULL)
 987                die("Commit %s doesn't have an indexed bitmap", oid_to_hex(&root->oid));
 988
 989        revs->tag_objects = 1;
 990        revs->tree_objects = 1;
 991        revs->blob_objects = 1;
 992
 993        result_popcnt = bitmap_popcount(result);
 994
 995        if (prepare_revision_walk(revs))
 996                die("revision walk setup failed");
 997
 998        tdata.bitmap_git = bitmap_git;
 999        tdata.base = bitmap_new();
1000        tdata.prg = start_progress("Verifying bitmap entries", result_popcnt);
1001        tdata.seen = 0;
1002
1003        traverse_commit_list(revs, &test_show_commit, &test_show_object, &tdata);
1004
1005        stop_progress(&tdata.prg);
1006
1007        if (bitmap_equals(result, tdata.base))
1008                fprintf(stderr, "OK!\n");
1009        else
1010                fprintf(stderr, "Mismatch!\n");
1011
1012        free_bitmap_index(bitmap_git);
1013}
1014
1015static int rebuild_bitmap(uint32_t *reposition,
1016                          struct ewah_bitmap *source,
1017                          struct bitmap *dest)
1018{
1019        uint32_t pos = 0;
1020        struct ewah_iterator it;
1021        eword_t word;
1022
1023        ewah_iterator_init(&it, source);
1024
1025        while (ewah_iterator_next(&word, &it)) {
1026                uint32_t offset, bit_pos;
1027
1028                for (offset = 0; offset < BITS_IN_EWORD; ++offset) {
1029                        if ((word >> offset) == 0)
1030                                break;
1031
1032                        offset += ewah_bit_ctz64(word >> offset);
1033
1034                        bit_pos = reposition[pos + offset];
1035                        if (bit_pos > 0)
1036                                bitmap_set(dest, bit_pos - 1);
1037                        else /* can't reuse, we don't have the object */
1038                                return -1;
1039                }
1040
1041                pos += BITS_IN_EWORD;
1042        }
1043        return 0;
1044}
1045
1046int rebuild_existing_bitmaps(struct bitmap_index *bitmap_git,
1047                             struct packing_data *mapping,
1048                             khash_sha1 *reused_bitmaps,
1049                             int show_progress)
1050{
1051        uint32_t i, num_objects;
1052        uint32_t *reposition;
1053        struct bitmap *rebuild;
1054        struct stored_bitmap *stored;
1055        struct progress *progress = NULL;
1056
1057        khiter_t hash_pos;
1058        int hash_ret;
1059
1060        num_objects = bitmap_git->pack->num_objects;
1061        reposition = xcalloc(num_objects, sizeof(uint32_t));
1062
1063        for (i = 0; i < num_objects; ++i) {
1064                const unsigned char *sha1;
1065                struct revindex_entry *entry;
1066                struct object_entry *oe;
1067
1068                entry = &bitmap_git->pack->revindex[i];
1069                sha1 = nth_packed_object_sha1(bitmap_git->pack, entry->nr);
1070                oe = packlist_find(mapping, sha1, NULL);
1071
1072                if (oe)
1073                        reposition[i] = oe_in_pack_pos(mapping, oe) + 1;
1074        }
1075
1076        rebuild = bitmap_new();
1077        i = 0;
1078
1079        if (show_progress)
1080                progress = start_progress("Reusing bitmaps", 0);
1081
1082        kh_foreach_value(bitmap_git->bitmaps, stored, {
1083                if (stored->flags & BITMAP_FLAG_REUSE) {
1084                        if (!rebuild_bitmap(reposition,
1085                                            lookup_stored_bitmap(stored),
1086                                            rebuild)) {
1087                                hash_pos = kh_put_sha1(reused_bitmaps,
1088                                                       stored->sha1,
1089                                                       &hash_ret);
1090                                kh_value(reused_bitmaps, hash_pos) =
1091                                        bitmap_to_ewah(rebuild);
1092                        }
1093                        bitmap_reset(rebuild);
1094                        display_progress(progress, ++i);
1095                }
1096        });
1097
1098        stop_progress(&progress);
1099
1100        free(reposition);
1101        bitmap_free(rebuild);
1102        return 0;
1103}
1104
1105void free_bitmap_index(struct bitmap_index *b)
1106{
1107        if (!b)
1108                return;
1109
1110        if (b->map)
1111                munmap(b->map, b->map_size);
1112        ewah_pool_free(b->commits);
1113        ewah_pool_free(b->trees);
1114        ewah_pool_free(b->blobs);
1115        ewah_pool_free(b->tags);
1116        kh_destroy_sha1(b->bitmaps);
1117        free(b->ext_index.objects);
1118        free(b->ext_index.hashes);
1119        bitmap_free(b->result);
1120        bitmap_free(b->haves);
1121        free(b);
1122}
1123
1124int bitmap_has_sha1_in_uninteresting(struct bitmap_index *bitmap_git,
1125                                     const unsigned char *sha1)
1126{
1127        int pos;
1128
1129        if (!bitmap_git)
1130                return 0; /* no bitmap loaded */
1131        if (!bitmap_git->haves)
1132                return 0; /* walk had no "haves" */
1133
1134        pos = bitmap_position_packfile(bitmap_git, sha1);
1135        if (pos < 0)
1136                return 0;
1137
1138        return bitmap_get(bitmap_git->haves, pos);
1139}