packfile.con commit l10n: git.pot: v2.23.0 round 2 (4 new, 6 removed) (466c88f)
   1#include "cache.h"
   2#include "list.h"
   3#include "pack.h"
   4#include "repository.h"
   5#include "dir.h"
   6#include "mergesort.h"
   7#include "packfile.h"
   8#include "delta.h"
   9#include "list.h"
  10#include "streaming.h"
  11#include "sha1-lookup.h"
  12#include "commit.h"
  13#include "object.h"
  14#include "tag.h"
  15#include "tree-walk.h"
  16#include "tree.h"
  17#include "object-store.h"
  18#include "midx.h"
  19#include "commit-graph.h"
  20
  21char *odb_pack_name(struct strbuf *buf,
  22                    const unsigned char *sha1,
  23                    const char *ext)
  24{
  25        strbuf_reset(buf);
  26        strbuf_addf(buf, "%s/pack/pack-%s.%s", get_object_directory(),
  27                    sha1_to_hex(sha1), ext);
  28        return buf->buf;
  29}
  30
  31char *sha1_pack_name(const unsigned char *sha1)
  32{
  33        static struct strbuf buf = STRBUF_INIT;
  34        return odb_pack_name(&buf, sha1, "pack");
  35}
  36
  37char *sha1_pack_index_name(const unsigned char *sha1)
  38{
  39        static struct strbuf buf = STRBUF_INIT;
  40        return odb_pack_name(&buf, sha1, "idx");
  41}
  42
  43static unsigned int pack_used_ctr;
  44static unsigned int pack_mmap_calls;
  45static unsigned int peak_pack_open_windows;
  46static unsigned int pack_open_windows;
  47static unsigned int pack_open_fds;
  48static unsigned int pack_max_fds;
  49static size_t peak_pack_mapped;
  50static size_t pack_mapped;
  51
  52#define SZ_FMT PRIuMAX
  53static inline uintmax_t sz_fmt(size_t s) { return s; }
  54
  55void pack_report(void)
  56{
  57        fprintf(stderr,
  58                "pack_report: getpagesize()            = %10" SZ_FMT "\n"
  59                "pack_report: core.packedGitWindowSize = %10" SZ_FMT "\n"
  60                "pack_report: core.packedGitLimit      = %10" SZ_FMT "\n",
  61                sz_fmt(getpagesize()),
  62                sz_fmt(packed_git_window_size),
  63                sz_fmt(packed_git_limit));
  64        fprintf(stderr,
  65                "pack_report: pack_used_ctr            = %10u\n"
  66                "pack_report: pack_mmap_calls          = %10u\n"
  67                "pack_report: pack_open_windows        = %10u / %10u\n"
  68                "pack_report: pack_mapped              = "
  69                        "%10" SZ_FMT " / %10" SZ_FMT "\n",
  70                pack_used_ctr,
  71                pack_mmap_calls,
  72                pack_open_windows, peak_pack_open_windows,
  73                sz_fmt(pack_mapped), sz_fmt(peak_pack_mapped));
  74}
  75
  76/*
  77 * Open and mmap the index file at path, perform a couple of
  78 * consistency checks, then record its information to p.  Return 0 on
  79 * success.
  80 */
  81static int check_packed_git_idx(const char *path, struct packed_git *p)
  82{
  83        void *idx_map;
  84        size_t idx_size;
  85        int fd = git_open(path), ret;
  86        struct stat st;
  87        const unsigned int hashsz = the_hash_algo->rawsz;
  88
  89        if (fd < 0)
  90                return -1;
  91        if (fstat(fd, &st)) {
  92                close(fd);
  93                return -1;
  94        }
  95        idx_size = xsize_t(st.st_size);
  96        if (idx_size < 4 * 256 + hashsz + hashsz) {
  97                close(fd);
  98                return error("index file %s is too small", path);
  99        }
 100        idx_map = xmmap(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0);
 101        close(fd);
 102
 103        ret = load_idx(path, hashsz, idx_map, idx_size, p);
 104
 105        if (ret)
 106                munmap(idx_map, idx_size);
 107
 108        return ret;
 109}
 110
 111int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
 112             size_t idx_size, struct packed_git *p)
 113{
 114        struct pack_idx_header *hdr = idx_map;
 115        uint32_t version, nr, i, *index;
 116
 117        if (idx_size < 4 * 256 + hashsz + hashsz)
 118                return error("index file %s is too small", path);
 119        if (idx_map == NULL)
 120                return error("empty data");
 121
 122        if (hdr->idx_signature == htonl(PACK_IDX_SIGNATURE)) {
 123                version = ntohl(hdr->idx_version);
 124                if (version < 2 || version > 2)
 125                        return error("index file %s is version %"PRIu32
 126                                     " and is not supported by this binary"
 127                                     " (try upgrading GIT to a newer version)",
 128                                     path, version);
 129        } else
 130                version = 1;
 131
 132        nr = 0;
 133        index = idx_map;
 134        if (version > 1)
 135                index += 2;  /* skip index header */
 136        for (i = 0; i < 256; i++) {
 137                uint32_t n = ntohl(index[i]);
 138                if (n < nr)
 139                        return error("non-monotonic index %s", path);
 140                nr = n;
 141        }
 142
 143        if (version == 1) {
 144                /*
 145                 * Total size:
 146                 *  - 256 index entries 4 bytes each
 147                 *  - 24-byte entries * nr (object ID + 4-byte offset)
 148                 *  - hash of the packfile
 149                 *  - file checksum
 150                 */
 151                if (idx_size != 4 * 256 + nr * (hashsz + 4) + hashsz + hashsz)
 152                        return error("wrong index v1 file size in %s", path);
 153        } else if (version == 2) {
 154                /*
 155                 * Minimum size:
 156                 *  - 8 bytes of header
 157                 *  - 256 index entries 4 bytes each
 158                 *  - object ID entry * nr
 159                 *  - 4-byte crc entry * nr
 160                 *  - 4-byte offset entry * nr
 161                 *  - hash of the packfile
 162                 *  - file checksum
 163                 * And after the 4-byte offset table might be a
 164                 * variable sized table containing 8-byte entries
 165                 * for offsets larger than 2^31.
 166                 */
 167                unsigned long min_size = 8 + 4*256 + nr*(hashsz + 4 + 4) + hashsz + hashsz;
 168                unsigned long max_size = min_size;
 169                if (nr)
 170                        max_size += (nr - 1)*8;
 171                if (idx_size < min_size || idx_size > max_size)
 172                        return error("wrong index v2 file size in %s", path);
 173                if (idx_size != min_size &&
 174                    /*
 175                     * make sure we can deal with large pack offsets.
 176                     * 31-bit signed offset won't be enough, neither
 177                     * 32-bit unsigned one will be.
 178                     */
 179                    (sizeof(off_t) <= 4))
 180                        return error("pack too large for current definition of off_t in %s", path);
 181        }
 182
 183        p->index_version = version;
 184        p->index_data = idx_map;
 185        p->index_size = idx_size;
 186        p->num_objects = nr;
 187        return 0;
 188}
 189
 190int open_pack_index(struct packed_git *p)
 191{
 192        char *idx_name;
 193        size_t len;
 194        int ret;
 195
 196        if (p->index_data)
 197                return 0;
 198
 199        if (!strip_suffix(p->pack_name, ".pack", &len))
 200                BUG("pack_name does not end in .pack");
 201        idx_name = xstrfmt("%.*s.idx", (int)len, p->pack_name);
 202        ret = check_packed_git_idx(idx_name, p);
 203        free(idx_name);
 204        return ret;
 205}
 206
 207uint32_t get_pack_fanout(struct packed_git *p, uint32_t value)
 208{
 209        const uint32_t *level1_ofs = p->index_data;
 210
 211        if (!level1_ofs) {
 212                if (open_pack_index(p))
 213                        return 0;
 214                level1_ofs = p->index_data;
 215        }
 216
 217        if (p->index_version > 1) {
 218                level1_ofs += 2;
 219        }
 220
 221        return ntohl(level1_ofs[value]);
 222}
 223
 224static struct packed_git *alloc_packed_git(int extra)
 225{
 226        struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
 227        memset(p, 0, sizeof(*p));
 228        p->pack_fd = -1;
 229        return p;
 230}
 231
 232struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
 233{
 234        const char *path = sha1_pack_name(sha1);
 235        size_t alloc = st_add(strlen(path), 1);
 236        struct packed_git *p = alloc_packed_git(alloc);
 237
 238        memcpy(p->pack_name, path, alloc); /* includes NUL */
 239        hashcpy(p->hash, sha1);
 240        if (check_packed_git_idx(idx_path, p)) {
 241                free(p);
 242                return NULL;
 243        }
 244
 245        return p;
 246}
 247
 248static void scan_windows(struct packed_git *p,
 249        struct packed_git **lru_p,
 250        struct pack_window **lru_w,
 251        struct pack_window **lru_l)
 252{
 253        struct pack_window *w, *w_l;
 254
 255        for (w_l = NULL, w = p->windows; w; w = w->next) {
 256                if (!w->inuse_cnt) {
 257                        if (!*lru_w || w->last_used < (*lru_w)->last_used) {
 258                                *lru_p = p;
 259                                *lru_w = w;
 260                                *lru_l = w_l;
 261                        }
 262                }
 263                w_l = w;
 264        }
 265}
 266
 267static int unuse_one_window(struct packed_git *current)
 268{
 269        struct packed_git *p, *lru_p = NULL;
 270        struct pack_window *lru_w = NULL, *lru_l = NULL;
 271
 272        if (current)
 273                scan_windows(current, &lru_p, &lru_w, &lru_l);
 274        for (p = the_repository->objects->packed_git; p; p = p->next)
 275                scan_windows(p, &lru_p, &lru_w, &lru_l);
 276        if (lru_p) {
 277                munmap(lru_w->base, lru_w->len);
 278                pack_mapped -= lru_w->len;
 279                if (lru_l)
 280                        lru_l->next = lru_w->next;
 281                else
 282                        lru_p->windows = lru_w->next;
 283                free(lru_w);
 284                pack_open_windows--;
 285                return 1;
 286        }
 287        return 0;
 288}
 289
 290void release_pack_memory(size_t need)
 291{
 292        size_t cur = pack_mapped;
 293        while (need >= (cur - pack_mapped) && unuse_one_window(NULL))
 294                ; /* nothing */
 295}
 296
 297void close_pack_windows(struct packed_git *p)
 298{
 299        while (p->windows) {
 300                struct pack_window *w = p->windows;
 301
 302                if (w->inuse_cnt)
 303                        die("pack '%s' still has open windows to it",
 304                            p->pack_name);
 305                munmap(w->base, w->len);
 306                pack_mapped -= w->len;
 307                pack_open_windows--;
 308                p->windows = w->next;
 309                free(w);
 310        }
 311}
 312
 313int close_pack_fd(struct packed_git *p)
 314{
 315        if (p->pack_fd < 0)
 316                return 0;
 317
 318        close(p->pack_fd);
 319        pack_open_fds--;
 320        p->pack_fd = -1;
 321
 322        return 1;
 323}
 324
 325void close_pack_index(struct packed_git *p)
 326{
 327        if (p->index_data) {
 328                munmap((void *)p->index_data, p->index_size);
 329                p->index_data = NULL;
 330        }
 331}
 332
 333void close_pack(struct packed_git *p)
 334{
 335        close_pack_windows(p);
 336        close_pack_fd(p);
 337        close_pack_index(p);
 338}
 339
 340void close_object_store(struct raw_object_store *o)
 341{
 342        struct packed_git *p;
 343
 344        for (p = o->packed_git; p; p = p->next)
 345                if (p->do_not_close)
 346                        BUG("want to close pack marked 'do-not-close'");
 347                else
 348                        close_pack(p);
 349
 350        if (o->multi_pack_index) {
 351                close_midx(o->multi_pack_index);
 352                o->multi_pack_index = NULL;
 353        }
 354
 355        close_commit_graph(o);
 356}
 357
 358void unlink_pack_path(const char *pack_name, int force_delete)
 359{
 360        static const char *exts[] = {".pack", ".idx", ".keep", ".bitmap", ".promisor"};
 361        int i;
 362        struct strbuf buf = STRBUF_INIT;
 363        size_t plen;
 364
 365        strbuf_addstr(&buf, pack_name);
 366        strip_suffix_mem(buf.buf, &buf.len, ".pack");
 367        plen = buf.len;
 368
 369        if (!force_delete) {
 370                strbuf_addstr(&buf, ".keep");
 371                if (!access(buf.buf, F_OK)) {
 372                        strbuf_release(&buf);
 373                        return;
 374                }
 375        }
 376
 377        for (i = 0; i < ARRAY_SIZE(exts); i++) {
 378                strbuf_setlen(&buf, plen);
 379                strbuf_addstr(&buf, exts[i]);
 380                unlink(buf.buf);
 381        }
 382
 383        strbuf_release(&buf);
 384}
 385
 386/*
 387 * The LRU pack is the one with the oldest MRU window, preferring packs
 388 * with no used windows, or the oldest mtime if it has no windows allocated.
 389 */
 390static void find_lru_pack(struct packed_git *p, struct packed_git **lru_p, struct pack_window **mru_w, int *accept_windows_inuse)
 391{
 392        struct pack_window *w, *this_mru_w;
 393        int has_windows_inuse = 0;
 394
 395        /*
 396         * Reject this pack if it has windows and the previously selected
 397         * one does not.  If this pack does not have windows, reject
 398         * it if the pack file is newer than the previously selected one.
 399         */
 400        if (*lru_p && !*mru_w && (p->windows || p->mtime > (*lru_p)->mtime))
 401                return;
 402
 403        for (w = this_mru_w = p->windows; w; w = w->next) {
 404                /*
 405                 * Reject this pack if any of its windows are in use,
 406                 * but the previously selected pack did not have any
 407                 * inuse windows.  Otherwise, record that this pack
 408                 * has windows in use.
 409                 */
 410                if (w->inuse_cnt) {
 411                        if (*accept_windows_inuse)
 412                                has_windows_inuse = 1;
 413                        else
 414                                return;
 415                }
 416
 417                if (w->last_used > this_mru_w->last_used)
 418                        this_mru_w = w;
 419
 420                /*
 421                 * Reject this pack if it has windows that have been
 422                 * used more recently than the previously selected pack.
 423                 * If the previously selected pack had windows inuse and
 424                 * we have not encountered a window in this pack that is
 425                 * inuse, skip this check since we prefer a pack with no
 426                 * inuse windows to one that has inuse windows.
 427                 */
 428                if (*mru_w && *accept_windows_inuse == has_windows_inuse &&
 429                    this_mru_w->last_used > (*mru_w)->last_used)
 430                        return;
 431        }
 432
 433        /*
 434         * Select this pack.
 435         */
 436        *mru_w = this_mru_w;
 437        *lru_p = p;
 438        *accept_windows_inuse = has_windows_inuse;
 439}
 440
 441static int close_one_pack(void)
 442{
 443        struct packed_git *p, *lru_p = NULL;
 444        struct pack_window *mru_w = NULL;
 445        int accept_windows_inuse = 1;
 446
 447        for (p = the_repository->objects->packed_git; p; p = p->next) {
 448                if (p->pack_fd == -1)
 449                        continue;
 450                find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
 451        }
 452
 453        if (lru_p)
 454                return close_pack_fd(lru_p);
 455
 456        return 0;
 457}
 458
 459static unsigned int get_max_fd_limit(void)
 460{
 461#ifdef RLIMIT_NOFILE
 462        {
 463                struct rlimit lim;
 464
 465                if (!getrlimit(RLIMIT_NOFILE, &lim))
 466                        return lim.rlim_cur;
 467        }
 468#endif
 469
 470#ifdef _SC_OPEN_MAX
 471        {
 472                long open_max = sysconf(_SC_OPEN_MAX);
 473                if (0 < open_max)
 474                        return open_max;
 475                /*
 476                 * Otherwise, we got -1 for one of the two
 477                 * reasons:
 478                 *
 479                 * (1) sysconf() did not understand _SC_OPEN_MAX
 480                 *     and signaled an error with -1; or
 481                 * (2) sysconf() said there is no limit.
 482                 *
 483                 * We _could_ clear errno before calling sysconf() to
 484                 * tell these two cases apart and return a huge number
 485                 * in the latter case to let the caller cap it to a
 486                 * value that is not so selfish, but letting the
 487                 * fallback OPEN_MAX codepath take care of these cases
 488                 * is a lot simpler.
 489                 */
 490        }
 491#endif
 492
 493#ifdef OPEN_MAX
 494        return OPEN_MAX;
 495#else
 496        return 1; /* see the caller ;-) */
 497#endif
 498}
 499
 500const char *pack_basename(struct packed_git *p)
 501{
 502        const char *ret = strrchr(p->pack_name, '/');
 503        if (ret)
 504                ret = ret + 1; /* skip past slash */
 505        else
 506                ret = p->pack_name; /* we only have a base */
 507        return ret;
 508}
 509
 510/*
 511 * Do not call this directly as this leaks p->pack_fd on error return;
 512 * call open_packed_git() instead.
 513 */
 514static int open_packed_git_1(struct packed_git *p)
 515{
 516        struct stat st;
 517        struct pack_header hdr;
 518        unsigned char hash[GIT_MAX_RAWSZ];
 519        unsigned char *idx_hash;
 520        long fd_flag;
 521        ssize_t read_result;
 522        const unsigned hashsz = the_hash_algo->rawsz;
 523
 524        if (!p->index_data) {
 525                struct multi_pack_index *m;
 526                const char *pack_name = pack_basename(p);
 527
 528                for (m = the_repository->objects->multi_pack_index;
 529                     m; m = m->next) {
 530                        if (midx_contains_pack(m, pack_name))
 531                                break;
 532                }
 533
 534                if (!m && open_pack_index(p))
 535                        return error("packfile %s index unavailable", p->pack_name);
 536        }
 537
 538        if (!pack_max_fds) {
 539                unsigned int max_fds = get_max_fd_limit();
 540
 541                /* Save 3 for stdin/stdout/stderr, 22 for work */
 542                if (25 < max_fds)
 543                        pack_max_fds = max_fds - 25;
 544                else
 545                        pack_max_fds = 1;
 546        }
 547
 548        while (pack_max_fds <= pack_open_fds && close_one_pack())
 549                ; /* nothing */
 550
 551        p->pack_fd = git_open(p->pack_name);
 552        if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
 553                return -1;
 554        pack_open_fds++;
 555
 556        /* If we created the struct before we had the pack we lack size. */
 557        if (!p->pack_size) {
 558                if (!S_ISREG(st.st_mode))
 559                        return error("packfile %s not a regular file", p->pack_name);
 560                p->pack_size = st.st_size;
 561        } else if (p->pack_size != st.st_size)
 562                return error("packfile %s size changed", p->pack_name);
 563
 564        /* We leave these file descriptors open with sliding mmap;
 565         * there is no point keeping them open across exec(), though.
 566         */
 567        fd_flag = fcntl(p->pack_fd, F_GETFD, 0);
 568        if (fd_flag < 0)
 569                return error("cannot determine file descriptor flags");
 570        fd_flag |= FD_CLOEXEC;
 571        if (fcntl(p->pack_fd, F_SETFD, fd_flag) == -1)
 572                return error("cannot set FD_CLOEXEC");
 573
 574        /* Verify we recognize this pack file format. */
 575        read_result = read_in_full(p->pack_fd, &hdr, sizeof(hdr));
 576        if (read_result < 0)
 577                return error_errno("error reading from %s", p->pack_name);
 578        if (read_result != sizeof(hdr))
 579                return error("file %s is far too short to be a packfile", p->pack_name);
 580        if (hdr.hdr_signature != htonl(PACK_SIGNATURE))
 581                return error("file %s is not a GIT packfile", p->pack_name);
 582        if (!pack_version_ok(hdr.hdr_version))
 583                return error("packfile %s is version %"PRIu32" and not"
 584                        " supported (try upgrading GIT to a newer version)",
 585                        p->pack_name, ntohl(hdr.hdr_version));
 586
 587        /* Skip index checking if in multi-pack-index */
 588        if (!p->index_data)
 589                return 0;
 590
 591        /* Verify the pack matches its index. */
 592        if (p->num_objects != ntohl(hdr.hdr_entries))
 593                return error("packfile %s claims to have %"PRIu32" objects"
 594                             " while index indicates %"PRIu32" objects",
 595                             p->pack_name, ntohl(hdr.hdr_entries),
 596                             p->num_objects);
 597        if (lseek(p->pack_fd, p->pack_size - hashsz, SEEK_SET) == -1)
 598                return error("end of packfile %s is unavailable", p->pack_name);
 599        read_result = read_in_full(p->pack_fd, hash, hashsz);
 600        if (read_result < 0)
 601                return error_errno("error reading from %s", p->pack_name);
 602        if (read_result != hashsz)
 603                return error("packfile %s signature is unavailable", p->pack_name);
 604        idx_hash = ((unsigned char *)p->index_data) + p->index_size - hashsz * 2;
 605        if (!hasheq(hash, idx_hash))
 606                return error("packfile %s does not match index", p->pack_name);
 607        return 0;
 608}
 609
 610static int open_packed_git(struct packed_git *p)
 611{
 612        if (!open_packed_git_1(p))
 613                return 0;
 614        close_pack_fd(p);
 615        return -1;
 616}
 617
 618static int in_window(struct pack_window *win, off_t offset)
 619{
 620        /* We must promise at least one full hash after the
 621         * offset is available from this window, otherwise the offset
 622         * is not actually in this window and a different window (which
 623         * has that one hash excess) must be used.  This is to support
 624         * the object header and delta base parsing routines below.
 625         */
 626        off_t win_off = win->offset;
 627        return win_off <= offset
 628                && (offset + the_hash_algo->rawsz) <= (win_off + win->len);
 629}
 630
 631unsigned char *use_pack(struct packed_git *p,
 632                struct pack_window **w_cursor,
 633                off_t offset,
 634                unsigned long *left)
 635{
 636        struct pack_window *win = *w_cursor;
 637
 638        /* Since packfiles end in a hash of their content and it's
 639         * pointless to ask for an offset into the middle of that
 640         * hash, and the in_window function above wouldn't match
 641         * don't allow an offset too close to the end of the file.
 642         */
 643        if (!p->pack_size && p->pack_fd == -1 && open_packed_git(p))
 644                die("packfile %s cannot be accessed", p->pack_name);
 645        if (offset > (p->pack_size - the_hash_algo->rawsz))
 646                die("offset beyond end of packfile (truncated pack?)");
 647        if (offset < 0)
 648                die(_("offset before end of packfile (broken .idx?)"));
 649
 650        if (!win || !in_window(win, offset)) {
 651                if (win)
 652                        win->inuse_cnt--;
 653                for (win = p->windows; win; win = win->next) {
 654                        if (in_window(win, offset))
 655                                break;
 656                }
 657                if (!win) {
 658                        size_t window_align = packed_git_window_size / 2;
 659                        off_t len;
 660
 661                        if (p->pack_fd == -1 && open_packed_git(p))
 662                                die("packfile %s cannot be accessed", p->pack_name);
 663
 664                        win = xcalloc(1, sizeof(*win));
 665                        win->offset = (offset / window_align) * window_align;
 666                        len = p->pack_size - win->offset;
 667                        if (len > packed_git_window_size)
 668                                len = packed_git_window_size;
 669                        win->len = (size_t)len;
 670                        pack_mapped += win->len;
 671                        while (packed_git_limit < pack_mapped
 672                                && unuse_one_window(p))
 673                                ; /* nothing */
 674                        win->base = xmmap_gently(NULL, win->len,
 675                                PROT_READ, MAP_PRIVATE,
 676                                p->pack_fd, win->offset);
 677                        if (win->base == MAP_FAILED)
 678                                die_errno("packfile %s cannot be mapped",
 679                                          p->pack_name);
 680                        if (!win->offset && win->len == p->pack_size
 681                                && !p->do_not_close)
 682                                close_pack_fd(p);
 683                        pack_mmap_calls++;
 684                        pack_open_windows++;
 685                        if (pack_mapped > peak_pack_mapped)
 686                                peak_pack_mapped = pack_mapped;
 687                        if (pack_open_windows > peak_pack_open_windows)
 688                                peak_pack_open_windows = pack_open_windows;
 689                        win->next = p->windows;
 690                        p->windows = win;
 691                }
 692        }
 693        if (win != *w_cursor) {
 694                win->last_used = pack_used_ctr++;
 695                win->inuse_cnt++;
 696                *w_cursor = win;
 697        }
 698        offset -= win->offset;
 699        if (left)
 700                *left = win->len - xsize_t(offset);
 701        return win->base + offset;
 702}
 703
 704void unuse_pack(struct pack_window **w_cursor)
 705{
 706        struct pack_window *w = *w_cursor;
 707        if (w) {
 708                w->inuse_cnt--;
 709                *w_cursor = NULL;
 710        }
 711}
 712
 713static void try_to_free_pack_memory(size_t size)
 714{
 715        release_pack_memory(size);
 716}
 717
 718struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
 719{
 720        static int have_set_try_to_free_routine;
 721        struct stat st;
 722        size_t alloc;
 723        struct packed_git *p;
 724
 725        if (!have_set_try_to_free_routine) {
 726                have_set_try_to_free_routine = 1;
 727                set_try_to_free_routine(try_to_free_pack_memory);
 728        }
 729
 730        /*
 731         * Make sure a corresponding .pack file exists and that
 732         * the index looks sane.
 733         */
 734        if (!strip_suffix_mem(path, &path_len, ".idx"))
 735                return NULL;
 736
 737        /*
 738         * ".promisor" is long enough to hold any suffix we're adding (and
 739         * the use xsnprintf double-checks that)
 740         */
 741        alloc = st_add3(path_len, strlen(".promisor"), 1);
 742        p = alloc_packed_git(alloc);
 743        memcpy(p->pack_name, path, path_len);
 744
 745        xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
 746        if (!access(p->pack_name, F_OK))
 747                p->pack_keep = 1;
 748
 749        xsnprintf(p->pack_name + path_len, alloc - path_len, ".promisor");
 750        if (!access(p->pack_name, F_OK))
 751                p->pack_promisor = 1;
 752
 753        xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
 754        if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
 755                free(p);
 756                return NULL;
 757        }
 758
 759        /* ok, it looks sane as far as we can check without
 760         * actually mapping the pack file.
 761         */
 762        p->pack_size = st.st_size;
 763        p->pack_local = local;
 764        p->mtime = st.st_mtime;
 765        if (path_len < the_hash_algo->hexsz ||
 766            get_sha1_hex(path + path_len - the_hash_algo->hexsz, p->hash))
 767                hashclr(p->hash);
 768        return p;
 769}
 770
 771void install_packed_git(struct repository *r, struct packed_git *pack)
 772{
 773        if (pack->pack_fd != -1)
 774                pack_open_fds++;
 775
 776        pack->next = r->objects->packed_git;
 777        r->objects->packed_git = pack;
 778}
 779
 780void (*report_garbage)(unsigned seen_bits, const char *path);
 781
 782static void report_helper(const struct string_list *list,
 783                          int seen_bits, int first, int last)
 784{
 785        if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX))
 786                return;
 787
 788        for (; first < last; first++)
 789                report_garbage(seen_bits, list->items[first].string);
 790}
 791
 792static void report_pack_garbage(struct string_list *list)
 793{
 794        int i, baselen = -1, first = 0, seen_bits = 0;
 795
 796        if (!report_garbage)
 797                return;
 798
 799        string_list_sort(list);
 800
 801        for (i = 0; i < list->nr; i++) {
 802                const char *path = list->items[i].string;
 803                if (baselen != -1 &&
 804                    strncmp(path, list->items[first].string, baselen)) {
 805                        report_helper(list, seen_bits, first, i);
 806                        baselen = -1;
 807                        seen_bits = 0;
 808                }
 809                if (baselen == -1) {
 810                        const char *dot = strrchr(path, '.');
 811                        if (!dot) {
 812                                report_garbage(PACKDIR_FILE_GARBAGE, path);
 813                                continue;
 814                        }
 815                        baselen = dot - path + 1;
 816                        first = i;
 817                }
 818                if (!strcmp(path + baselen, "pack"))
 819                        seen_bits |= 1;
 820                else if (!strcmp(path + baselen, "idx"))
 821                        seen_bits |= 2;
 822        }
 823        report_helper(list, seen_bits, first, list->nr);
 824}
 825
 826void for_each_file_in_pack_dir(const char *objdir,
 827                               each_file_in_pack_dir_fn fn,
 828                               void *data)
 829{
 830        struct strbuf path = STRBUF_INIT;
 831        size_t dirnamelen;
 832        DIR *dir;
 833        struct dirent *de;
 834
 835        strbuf_addstr(&path, objdir);
 836        strbuf_addstr(&path, "/pack");
 837        dir = opendir(path.buf);
 838        if (!dir) {
 839                if (errno != ENOENT)
 840                        error_errno("unable to open object pack directory: %s",
 841                                    path.buf);
 842                strbuf_release(&path);
 843                return;
 844        }
 845        strbuf_addch(&path, '/');
 846        dirnamelen = path.len;
 847        while ((de = readdir(dir)) != NULL) {
 848                if (is_dot_or_dotdot(de->d_name))
 849                        continue;
 850
 851                strbuf_setlen(&path, dirnamelen);
 852                strbuf_addstr(&path, de->d_name);
 853
 854                fn(path.buf, path.len, de->d_name, data);
 855        }
 856
 857        closedir(dir);
 858        strbuf_release(&path);
 859}
 860
 861struct prepare_pack_data {
 862        struct repository *r;
 863        struct string_list *garbage;
 864        int local;
 865        struct multi_pack_index *m;
 866};
 867
 868static void prepare_pack(const char *full_name, size_t full_name_len,
 869                         const char *file_name, void *_data)
 870{
 871        struct prepare_pack_data *data = (struct prepare_pack_data *)_data;
 872        struct packed_git *p;
 873        size_t base_len = full_name_len;
 874
 875        if (strip_suffix_mem(full_name, &base_len, ".idx") &&
 876            !(data->m && midx_contains_pack(data->m, file_name))) {
 877                /* Don't reopen a pack we already have. */
 878                for (p = data->r->objects->packed_git; p; p = p->next) {
 879                        size_t len;
 880                        if (strip_suffix(p->pack_name, ".pack", &len) &&
 881                            len == base_len &&
 882                            !memcmp(p->pack_name, full_name, len))
 883                                break;
 884                }
 885
 886                if (!p) {
 887                        p = add_packed_git(full_name, full_name_len, data->local);
 888                        if (p)
 889                                install_packed_git(data->r, p);
 890                }
 891        }
 892
 893        if (!report_garbage)
 894                return;
 895
 896        if (!strcmp(file_name, "multi-pack-index"))
 897                return;
 898        if (ends_with(file_name, ".idx") ||
 899            ends_with(file_name, ".pack") ||
 900            ends_with(file_name, ".bitmap") ||
 901            ends_with(file_name, ".keep") ||
 902            ends_with(file_name, ".promisor"))
 903                string_list_append(data->garbage, full_name);
 904        else
 905                report_garbage(PACKDIR_FILE_GARBAGE, full_name);
 906}
 907
 908static void prepare_packed_git_one(struct repository *r, char *objdir, int local)
 909{
 910        struct prepare_pack_data data;
 911        struct string_list garbage = STRING_LIST_INIT_DUP;
 912
 913        data.m = r->objects->multi_pack_index;
 914
 915        /* look for the multi-pack-index for this object directory */
 916        while (data.m && strcmp(data.m->object_dir, objdir))
 917                data.m = data.m->next;
 918
 919        data.r = r;
 920        data.garbage = &garbage;
 921        data.local = local;
 922
 923        for_each_file_in_pack_dir(objdir, prepare_pack, &data);
 924
 925        report_pack_garbage(data.garbage);
 926        string_list_clear(data.garbage, 0);
 927}
 928
 929static void prepare_packed_git(struct repository *r);
 930/*
 931 * Give a fast, rough count of the number of objects in the repository. This
 932 * ignores loose objects completely. If you have a lot of them, then either
 933 * you should repack because your performance will be awful, or they are
 934 * all unreachable objects about to be pruned, in which case they're not really
 935 * interesting as a measure of repo size in the first place.
 936 */
 937unsigned long repo_approximate_object_count(struct repository *r)
 938{
 939        if (!r->objects->approximate_object_count_valid) {
 940                unsigned long count;
 941                struct multi_pack_index *m;
 942                struct packed_git *p;
 943
 944                prepare_packed_git(r);
 945                count = 0;
 946                for (m = get_multi_pack_index(r); m; m = m->next)
 947                        count += m->num_objects;
 948                for (p = r->objects->packed_git; p; p = p->next) {
 949                        if (open_pack_index(p))
 950                                continue;
 951                        count += p->num_objects;
 952                }
 953                r->objects->approximate_object_count = count;
 954        }
 955        return r->objects->approximate_object_count;
 956}
 957
 958static void *get_next_packed_git(const void *p)
 959{
 960        return ((const struct packed_git *)p)->next;
 961}
 962
 963static void set_next_packed_git(void *p, void *next)
 964{
 965        ((struct packed_git *)p)->next = next;
 966}
 967
 968static int sort_pack(const void *a_, const void *b_)
 969{
 970        const struct packed_git *a = a_;
 971        const struct packed_git *b = b_;
 972        int st;
 973
 974        /*
 975         * Local packs tend to contain objects specific to our
 976         * variant of the project than remote ones.  In addition,
 977         * remote ones could be on a network mounted filesystem.
 978         * Favor local ones for these reasons.
 979         */
 980        st = a->pack_local - b->pack_local;
 981        if (st)
 982                return -st;
 983
 984        /*
 985         * Younger packs tend to contain more recent objects,
 986         * and more recent objects tend to get accessed more
 987         * often.
 988         */
 989        if (a->mtime < b->mtime)
 990                return 1;
 991        else if (a->mtime == b->mtime)
 992                return 0;
 993        return -1;
 994}
 995
 996static void rearrange_packed_git(struct repository *r)
 997{
 998        r->objects->packed_git = llist_mergesort(
 999                r->objects->packed_git, get_next_packed_git,
1000                set_next_packed_git, sort_pack);
1001}
1002
1003static void prepare_packed_git_mru(struct repository *r)
1004{
1005        struct packed_git *p;
1006
1007        INIT_LIST_HEAD(&r->objects->packed_git_mru);
1008
1009        for (p = r->objects->packed_git; p; p = p->next)
1010                list_add_tail(&p->mru, &r->objects->packed_git_mru);
1011}
1012
1013static void prepare_packed_git(struct repository *r)
1014{
1015        struct object_directory *odb;
1016
1017        if (r->objects->packed_git_initialized)
1018                return;
1019
1020        prepare_alt_odb(r);
1021        for (odb = r->objects->odb; odb; odb = odb->next) {
1022                int local = (odb == r->objects->odb);
1023                prepare_multi_pack_index_one(r, odb->path, local);
1024                prepare_packed_git_one(r, odb->path, local);
1025        }
1026        rearrange_packed_git(r);
1027
1028        prepare_packed_git_mru(r);
1029        r->objects->packed_git_initialized = 1;
1030}
1031
1032void reprepare_packed_git(struct repository *r)
1033{
1034        struct object_directory *odb;
1035
1036        for (odb = r->objects->odb; odb; odb = odb->next)
1037                odb_clear_loose_cache(odb);
1038
1039        r->objects->approximate_object_count_valid = 0;
1040        r->objects->packed_git_initialized = 0;
1041        prepare_packed_git(r);
1042}
1043
1044struct packed_git *get_packed_git(struct repository *r)
1045{
1046        prepare_packed_git(r);
1047        return r->objects->packed_git;
1048}
1049
1050struct multi_pack_index *get_multi_pack_index(struct repository *r)
1051{
1052        prepare_packed_git(r);
1053        return r->objects->multi_pack_index;
1054}
1055
1056struct packed_git *get_all_packs(struct repository *r)
1057{
1058        struct multi_pack_index *m;
1059
1060        prepare_packed_git(r);
1061        for (m = r->objects->multi_pack_index; m; m = m->next) {
1062                uint32_t i;
1063                for (i = 0; i < m->num_packs; i++)
1064                        prepare_midx_pack(r, m, i);
1065        }
1066
1067        return r->objects->packed_git;
1068}
1069
1070struct list_head *get_packed_git_mru(struct repository *r)
1071{
1072        prepare_packed_git(r);
1073        return &r->objects->packed_git_mru;
1074}
1075
1076unsigned long unpack_object_header_buffer(const unsigned char *buf,
1077                unsigned long len, enum object_type *type, unsigned long *sizep)
1078{
1079        unsigned shift;
1080        unsigned long size, c;
1081        unsigned long used = 0;
1082
1083        c = buf[used++];
1084        *type = (c >> 4) & 7;
1085        size = c & 15;
1086        shift = 4;
1087        while (c & 0x80) {
1088                if (len <= used || bitsizeof(long) <= shift) {
1089                        error("bad object header");
1090                        size = used = 0;
1091                        break;
1092                }
1093                c = buf[used++];
1094                size += (c & 0x7f) << shift;
1095                shift += 7;
1096        }
1097        *sizep = size;
1098        return used;
1099}
1100
1101unsigned long get_size_from_delta(struct packed_git *p,
1102                                  struct pack_window **w_curs,
1103                                  off_t curpos)
1104{
1105        const unsigned char *data;
1106        unsigned char delta_head[20], *in;
1107        git_zstream stream;
1108        int st;
1109
1110        memset(&stream, 0, sizeof(stream));
1111        stream.next_out = delta_head;
1112        stream.avail_out = sizeof(delta_head);
1113
1114        git_inflate_init(&stream);
1115        do {
1116                in = use_pack(p, w_curs, curpos, &stream.avail_in);
1117                stream.next_in = in;
1118                st = git_inflate(&stream, Z_FINISH);
1119                curpos += stream.next_in - in;
1120        } while ((st == Z_OK || st == Z_BUF_ERROR) &&
1121                 stream.total_out < sizeof(delta_head));
1122        git_inflate_end(&stream);
1123        if ((st != Z_STREAM_END) && stream.total_out != sizeof(delta_head)) {
1124                error("delta data unpack-initial failed");
1125                return 0;
1126        }
1127
1128        /* Examine the initial part of the delta to figure out
1129         * the result size.
1130         */
1131        data = delta_head;
1132
1133        /* ignore base size */
1134        get_delta_hdr_size(&data, delta_head+sizeof(delta_head));
1135
1136        /* Read the result size */
1137        return get_delta_hdr_size(&data, delta_head+sizeof(delta_head));
1138}
1139
1140int unpack_object_header(struct packed_git *p,
1141                         struct pack_window **w_curs,
1142                         off_t *curpos,
1143                         unsigned long *sizep)
1144{
1145        unsigned char *base;
1146        unsigned long left;
1147        unsigned long used;
1148        enum object_type type;
1149
1150        /* use_pack() assures us we have [base, base + 20) available
1151         * as a range that we can look at.  (Its actually the hash
1152         * size that is assured.)  With our object header encoding
1153         * the maximum deflated object size is 2^137, which is just
1154         * insane, so we know won't exceed what we have been given.
1155         */
1156        base = use_pack(p, w_curs, *curpos, &left);
1157        used = unpack_object_header_buffer(base, left, &type, sizep);
1158        if (!used) {
1159                type = OBJ_BAD;
1160        } else
1161                *curpos += used;
1162
1163        return type;
1164}
1165
1166void mark_bad_packed_object(struct packed_git *p, const unsigned char *sha1)
1167{
1168        unsigned i;
1169        const unsigned hashsz = the_hash_algo->rawsz;
1170        for (i = 0; i < p->num_bad_objects; i++)
1171                if (hasheq(sha1, p->bad_object_sha1 + hashsz * i))
1172                        return;
1173        p->bad_object_sha1 = xrealloc(p->bad_object_sha1,
1174                                      st_mult(GIT_MAX_RAWSZ,
1175                                              st_add(p->num_bad_objects, 1)));
1176        hashcpy(p->bad_object_sha1 + hashsz * p->num_bad_objects, sha1);
1177        p->num_bad_objects++;
1178}
1179
1180const struct packed_git *has_packed_and_bad(struct repository *r,
1181                                            const unsigned char *sha1)
1182{
1183        struct packed_git *p;
1184        unsigned i;
1185
1186        for (p = r->objects->packed_git; p; p = p->next)
1187                for (i = 0; i < p->num_bad_objects; i++)
1188                        if (hasheq(sha1,
1189                                   p->bad_object_sha1 + the_hash_algo->rawsz * i))
1190                                return p;
1191        return NULL;
1192}
1193
1194static off_t get_delta_base(struct packed_git *p,
1195                                    struct pack_window **w_curs,
1196                                    off_t *curpos,
1197                                    enum object_type type,
1198                                    off_t delta_obj_offset)
1199{
1200        unsigned char *base_info = use_pack(p, w_curs, *curpos, NULL);
1201        off_t base_offset;
1202
1203        /* use_pack() assured us we have [base_info, base_info + 20)
1204         * as a range that we can look at without walking off the
1205         * end of the mapped window.  Its actually the hash size
1206         * that is assured.  An OFS_DELTA longer than the hash size
1207         * is stupid, as then a REF_DELTA would be smaller to store.
1208         */
1209        if (type == OBJ_OFS_DELTA) {
1210                unsigned used = 0;
1211                unsigned char c = base_info[used++];
1212                base_offset = c & 127;
1213                while (c & 128) {
1214                        base_offset += 1;
1215                        if (!base_offset || MSB(base_offset, 7))
1216                                return 0;  /* overflow */
1217                        c = base_info[used++];
1218                        base_offset = (base_offset << 7) + (c & 127);
1219                }
1220                base_offset = delta_obj_offset - base_offset;
1221                if (base_offset <= 0 || base_offset >= delta_obj_offset)
1222                        return 0;  /* out of bound */
1223                *curpos += used;
1224        } else if (type == OBJ_REF_DELTA) {
1225                /* The base entry _must_ be in the same pack */
1226                base_offset = find_pack_entry_one(base_info, p);
1227                *curpos += the_hash_algo->rawsz;
1228        } else
1229                die("I am totally screwed");
1230        return base_offset;
1231}
1232
1233/*
1234 * Like get_delta_base above, but we return the sha1 instead of the pack
1235 * offset. This means it is cheaper for REF deltas (we do not have to do
1236 * the final object lookup), but more expensive for OFS deltas (we
1237 * have to load the revidx to convert the offset back into a sha1).
1238 */
1239static const unsigned char *get_delta_base_sha1(struct packed_git *p,
1240                                                struct pack_window **w_curs,
1241                                                off_t curpos,
1242                                                enum object_type type,
1243                                                off_t delta_obj_offset)
1244{
1245        if (type == OBJ_REF_DELTA) {
1246                unsigned char *base = use_pack(p, w_curs, curpos, NULL);
1247                return base;
1248        } else if (type == OBJ_OFS_DELTA) {
1249                struct revindex_entry *revidx;
1250                off_t base_offset = get_delta_base(p, w_curs, &curpos,
1251                                                   type, delta_obj_offset);
1252
1253                if (!base_offset)
1254                        return NULL;
1255
1256                revidx = find_pack_revindex(p, base_offset);
1257                if (!revidx)
1258                        return NULL;
1259
1260                return nth_packed_object_sha1(p, revidx->nr);
1261        } else
1262                return NULL;
1263}
1264
1265static int retry_bad_packed_offset(struct repository *r,
1266                                   struct packed_git *p,
1267                                   off_t obj_offset)
1268{
1269        int type;
1270        struct revindex_entry *revidx;
1271        struct object_id oid;
1272        revidx = find_pack_revindex(p, obj_offset);
1273        if (!revidx)
1274                return OBJ_BAD;
1275        nth_packed_object_oid(&oid, p, revidx->nr);
1276        mark_bad_packed_object(p, oid.hash);
1277        type = oid_object_info(r, &oid, NULL);
1278        if (type <= OBJ_NONE)
1279                return OBJ_BAD;
1280        return type;
1281}
1282
1283#define POI_STACK_PREALLOC 64
1284
1285static enum object_type packed_to_object_type(struct repository *r,
1286                                              struct packed_git *p,
1287                                              off_t obj_offset,
1288                                              enum object_type type,
1289                                              struct pack_window **w_curs,
1290                                              off_t curpos)
1291{
1292        off_t small_poi_stack[POI_STACK_PREALLOC];
1293        off_t *poi_stack = small_poi_stack;
1294        int poi_stack_nr = 0, poi_stack_alloc = POI_STACK_PREALLOC;
1295
1296        while (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
1297                off_t base_offset;
1298                unsigned long size;
1299                /* Push the object we're going to leave behind */
1300                if (poi_stack_nr >= poi_stack_alloc && poi_stack == small_poi_stack) {
1301                        poi_stack_alloc = alloc_nr(poi_stack_nr);
1302                        ALLOC_ARRAY(poi_stack, poi_stack_alloc);
1303                        COPY_ARRAY(poi_stack, small_poi_stack, poi_stack_nr);
1304                } else {
1305                        ALLOC_GROW(poi_stack, poi_stack_nr+1, poi_stack_alloc);
1306                }
1307                poi_stack[poi_stack_nr++] = obj_offset;
1308                /* If parsing the base offset fails, just unwind */
1309                base_offset = get_delta_base(p, w_curs, &curpos, type, obj_offset);
1310                if (!base_offset)
1311                        goto unwind;
1312                curpos = obj_offset = base_offset;
1313                type = unpack_object_header(p, w_curs, &curpos, &size);
1314                if (type <= OBJ_NONE) {
1315                        /* If getting the base itself fails, we first
1316                         * retry the base, otherwise unwind */
1317                        type = retry_bad_packed_offset(r, p, base_offset);
1318                        if (type > OBJ_NONE)
1319                                goto out;
1320                        goto unwind;
1321                }
1322        }
1323
1324        switch (type) {
1325        case OBJ_BAD:
1326        case OBJ_COMMIT:
1327        case OBJ_TREE:
1328        case OBJ_BLOB:
1329        case OBJ_TAG:
1330                break;
1331        default:
1332                error("unknown object type %i at offset %"PRIuMAX" in %s",
1333                      type, (uintmax_t)obj_offset, p->pack_name);
1334                type = OBJ_BAD;
1335        }
1336
1337out:
1338        if (poi_stack != small_poi_stack)
1339                free(poi_stack);
1340        return type;
1341
1342unwind:
1343        while (poi_stack_nr) {
1344                obj_offset = poi_stack[--poi_stack_nr];
1345                type = retry_bad_packed_offset(r, p, obj_offset);
1346                if (type > OBJ_NONE)
1347                        goto out;
1348        }
1349        type = OBJ_BAD;
1350        goto out;
1351}
1352
1353static struct hashmap delta_base_cache;
1354static size_t delta_base_cached;
1355
1356static LIST_HEAD(delta_base_cache_lru);
1357
1358struct delta_base_cache_key {
1359        struct packed_git *p;
1360        off_t base_offset;
1361};
1362
1363struct delta_base_cache_entry {
1364        struct hashmap hash;
1365        struct delta_base_cache_key key;
1366        struct list_head lru;
1367        void *data;
1368        unsigned long size;
1369        enum object_type type;
1370};
1371
1372static unsigned int pack_entry_hash(struct packed_git *p, off_t base_offset)
1373{
1374        unsigned int hash;
1375
1376        hash = (unsigned int)(intptr_t)p + (unsigned int)base_offset;
1377        hash += (hash >> 8) + (hash >> 16);
1378        return hash;
1379}
1380
1381static struct delta_base_cache_entry *
1382get_delta_base_cache_entry(struct packed_git *p, off_t base_offset)
1383{
1384        struct hashmap_entry entry;
1385        struct delta_base_cache_key key;
1386
1387        if (!delta_base_cache.cmpfn)
1388                return NULL;
1389
1390        hashmap_entry_init(&entry, pack_entry_hash(p, base_offset));
1391        key.p = p;
1392        key.base_offset = base_offset;
1393        return hashmap_get(&delta_base_cache, &entry, &key);
1394}
1395
1396static int delta_base_cache_key_eq(const struct delta_base_cache_key *a,
1397                                   const struct delta_base_cache_key *b)
1398{
1399        return a->p == b->p && a->base_offset == b->base_offset;
1400}
1401
1402static int delta_base_cache_hash_cmp(const void *unused_cmp_data,
1403                                     const void *va, const void *vb,
1404                                     const void *vkey)
1405{
1406        const struct delta_base_cache_entry *a = va, *b = vb;
1407        const struct delta_base_cache_key *key = vkey;
1408        if (key)
1409                return !delta_base_cache_key_eq(&a->key, key);
1410        else
1411                return !delta_base_cache_key_eq(&a->key, &b->key);
1412}
1413
1414static int in_delta_base_cache(struct packed_git *p, off_t base_offset)
1415{
1416        return !!get_delta_base_cache_entry(p, base_offset);
1417}
1418
1419/*
1420 * Remove the entry from the cache, but do _not_ free the associated
1421 * entry data. The caller takes ownership of the "data" buffer, and
1422 * should copy out any fields it wants before detaching.
1423 */
1424static void detach_delta_base_cache_entry(struct delta_base_cache_entry *ent)
1425{
1426        hashmap_remove(&delta_base_cache, ent, &ent->key);
1427        list_del(&ent->lru);
1428        delta_base_cached -= ent->size;
1429        free(ent);
1430}
1431
1432static void *cache_or_unpack_entry(struct repository *r, struct packed_git *p,
1433                                   off_t base_offset, unsigned long *base_size,
1434                                   enum object_type *type)
1435{
1436        struct delta_base_cache_entry *ent;
1437
1438        ent = get_delta_base_cache_entry(p, base_offset);
1439        if (!ent)
1440                return unpack_entry(r, p, base_offset, type, base_size);
1441
1442        if (type)
1443                *type = ent->type;
1444        if (base_size)
1445                *base_size = ent->size;
1446        return xmemdupz(ent->data, ent->size);
1447}
1448
1449static inline void release_delta_base_cache(struct delta_base_cache_entry *ent)
1450{
1451        free(ent->data);
1452        detach_delta_base_cache_entry(ent);
1453}
1454
1455void clear_delta_base_cache(void)
1456{
1457        struct list_head *lru, *tmp;
1458        list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
1459                struct delta_base_cache_entry *entry =
1460                        list_entry(lru, struct delta_base_cache_entry, lru);
1461                release_delta_base_cache(entry);
1462        }
1463}
1464
1465static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
1466        void *base, unsigned long base_size, enum object_type type)
1467{
1468        struct delta_base_cache_entry *ent = xmalloc(sizeof(*ent));
1469        struct list_head *lru, *tmp;
1470
1471        delta_base_cached += base_size;
1472
1473        list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
1474                struct delta_base_cache_entry *f =
1475                        list_entry(lru, struct delta_base_cache_entry, lru);
1476                if (delta_base_cached <= delta_base_cache_limit)
1477                        break;
1478                release_delta_base_cache(f);
1479        }
1480
1481        ent->key.p = p;
1482        ent->key.base_offset = base_offset;
1483        ent->type = type;
1484        ent->data = base;
1485        ent->size = base_size;
1486        list_add_tail(&ent->lru, &delta_base_cache_lru);
1487
1488        if (!delta_base_cache.cmpfn)
1489                hashmap_init(&delta_base_cache, delta_base_cache_hash_cmp, NULL, 0);
1490        hashmap_entry_init(ent, pack_entry_hash(p, base_offset));
1491        hashmap_add(&delta_base_cache, ent);
1492}
1493
1494int packed_object_info(struct repository *r, struct packed_git *p,
1495                       off_t obj_offset, struct object_info *oi)
1496{
1497        struct pack_window *w_curs = NULL;
1498        unsigned long size;
1499        off_t curpos = obj_offset;
1500        enum object_type type;
1501
1502        /*
1503         * We always get the representation type, but only convert it to
1504         * a "real" type later if the caller is interested.
1505         */
1506        if (oi->contentp) {
1507                *oi->contentp = cache_or_unpack_entry(r, p, obj_offset, oi->sizep,
1508                                                      &type);
1509                if (!*oi->contentp)
1510                        type = OBJ_BAD;
1511        } else {
1512                type = unpack_object_header(p, &w_curs, &curpos, &size);
1513        }
1514
1515        if (!oi->contentp && oi->sizep) {
1516                if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
1517                        off_t tmp_pos = curpos;
1518                        off_t base_offset = get_delta_base(p, &w_curs, &tmp_pos,
1519                                                           type, obj_offset);
1520                        if (!base_offset) {
1521                                type = OBJ_BAD;
1522                                goto out;
1523                        }
1524                        *oi->sizep = get_size_from_delta(p, &w_curs, tmp_pos);
1525                        if (*oi->sizep == 0) {
1526                                type = OBJ_BAD;
1527                                goto out;
1528                        }
1529                } else {
1530                        *oi->sizep = size;
1531                }
1532        }
1533
1534        if (oi->disk_sizep) {
1535                struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
1536                *oi->disk_sizep = revidx[1].offset - obj_offset;
1537        }
1538
1539        if (oi->typep || oi->type_name) {
1540                enum object_type ptot;
1541                ptot = packed_to_object_type(r, p, obj_offset,
1542                                             type, &w_curs, curpos);
1543                if (oi->typep)
1544                        *oi->typep = ptot;
1545                if (oi->type_name) {
1546                        const char *tn = type_name(ptot);
1547                        if (tn)
1548                                strbuf_addstr(oi->type_name, tn);
1549                }
1550                if (ptot < 0) {
1551                        type = OBJ_BAD;
1552                        goto out;
1553                }
1554        }
1555
1556        if (oi->delta_base_sha1) {
1557                if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
1558                        const unsigned char *base;
1559
1560                        base = get_delta_base_sha1(p, &w_curs, curpos,
1561                                                   type, obj_offset);
1562                        if (!base) {
1563                                type = OBJ_BAD;
1564                                goto out;
1565                        }
1566
1567                        hashcpy(oi->delta_base_sha1, base);
1568                } else
1569                        hashclr(oi->delta_base_sha1);
1570        }
1571
1572        oi->whence = in_delta_base_cache(p, obj_offset) ? OI_DBCACHED :
1573                                                          OI_PACKED;
1574
1575out:
1576        unuse_pack(&w_curs);
1577        return type;
1578}
1579
1580static void *unpack_compressed_entry(struct packed_git *p,
1581                                    struct pack_window **w_curs,
1582                                    off_t curpos,
1583                                    unsigned long size)
1584{
1585        int st;
1586        git_zstream stream;
1587        unsigned char *buffer, *in;
1588
1589        buffer = xmallocz_gently(size);
1590        if (!buffer)
1591                return NULL;
1592        memset(&stream, 0, sizeof(stream));
1593        stream.next_out = buffer;
1594        stream.avail_out = size + 1;
1595
1596        git_inflate_init(&stream);
1597        do {
1598                in = use_pack(p, w_curs, curpos, &stream.avail_in);
1599                stream.next_in = in;
1600                st = git_inflate(&stream, Z_FINISH);
1601                if (!stream.avail_out)
1602                        break; /* the payload is larger than it should be */
1603                curpos += stream.next_in - in;
1604        } while (st == Z_OK || st == Z_BUF_ERROR);
1605        git_inflate_end(&stream);
1606        if ((st != Z_STREAM_END) || stream.total_out != size) {
1607                free(buffer);
1608                return NULL;
1609        }
1610
1611        /* versions of zlib can clobber unconsumed portion of outbuf */
1612        buffer[size] = '\0';
1613
1614        return buffer;
1615}
1616
1617static void write_pack_access_log(struct packed_git *p, off_t obj_offset)
1618{
1619        static struct trace_key pack_access = TRACE_KEY_INIT(PACK_ACCESS);
1620        trace_printf_key(&pack_access, "%s %"PRIuMAX"\n",
1621                         p->pack_name, (uintmax_t)obj_offset);
1622}
1623
1624int do_check_packed_object_crc;
1625
1626#define UNPACK_ENTRY_STACK_PREALLOC 64
1627struct unpack_entry_stack_ent {
1628        off_t obj_offset;
1629        off_t curpos;
1630        unsigned long size;
1631};
1632
1633static void *read_object(struct repository *r,
1634                         const struct object_id *oid,
1635                         enum object_type *type,
1636                         unsigned long *size)
1637{
1638        struct object_info oi = OBJECT_INFO_INIT;
1639        void *content;
1640        oi.typep = type;
1641        oi.sizep = size;
1642        oi.contentp = &content;
1643
1644        if (oid_object_info_extended(r, oid, &oi, 0) < 0)
1645                return NULL;
1646        return content;
1647}
1648
1649void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
1650                   enum object_type *final_type, unsigned long *final_size)
1651{
1652        struct pack_window *w_curs = NULL;
1653        off_t curpos = obj_offset;
1654        void *data = NULL;
1655        unsigned long size;
1656        enum object_type type;
1657        struct unpack_entry_stack_ent small_delta_stack[UNPACK_ENTRY_STACK_PREALLOC];
1658        struct unpack_entry_stack_ent *delta_stack = small_delta_stack;
1659        int delta_stack_nr = 0, delta_stack_alloc = UNPACK_ENTRY_STACK_PREALLOC;
1660        int base_from_cache = 0;
1661
1662        write_pack_access_log(p, obj_offset);
1663
1664        /* PHASE 1: drill down to the innermost base object */
1665        for (;;) {
1666                off_t base_offset;
1667                int i;
1668                struct delta_base_cache_entry *ent;
1669
1670                ent = get_delta_base_cache_entry(p, curpos);
1671                if (ent) {
1672                        type = ent->type;
1673                        data = ent->data;
1674                        size = ent->size;
1675                        detach_delta_base_cache_entry(ent);
1676                        base_from_cache = 1;
1677                        break;
1678                }
1679
1680                if (do_check_packed_object_crc && p->index_version > 1) {
1681                        struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
1682                        off_t len = revidx[1].offset - obj_offset;
1683                        if (check_pack_crc(p, &w_curs, obj_offset, len, revidx->nr)) {
1684                                struct object_id oid;
1685                                nth_packed_object_oid(&oid, p, revidx->nr);
1686                                error("bad packed object CRC for %s",
1687                                      oid_to_hex(&oid));
1688                                mark_bad_packed_object(p, oid.hash);
1689                                data = NULL;
1690                                goto out;
1691                        }
1692                }
1693
1694                type = unpack_object_header(p, &w_curs, &curpos, &size);
1695                if (type != OBJ_OFS_DELTA && type != OBJ_REF_DELTA)
1696                        break;
1697
1698                base_offset = get_delta_base(p, &w_curs, &curpos, type, obj_offset);
1699                if (!base_offset) {
1700                        error("failed to validate delta base reference "
1701                              "at offset %"PRIuMAX" from %s",
1702                              (uintmax_t)curpos, p->pack_name);
1703                        /* bail to phase 2, in hopes of recovery */
1704                        data = NULL;
1705                        break;
1706                }
1707
1708                /* push object, proceed to base */
1709                if (delta_stack_nr >= delta_stack_alloc
1710                    && delta_stack == small_delta_stack) {
1711                        delta_stack_alloc = alloc_nr(delta_stack_nr);
1712                        ALLOC_ARRAY(delta_stack, delta_stack_alloc);
1713                        COPY_ARRAY(delta_stack, small_delta_stack,
1714                                   delta_stack_nr);
1715                } else {
1716                        ALLOC_GROW(delta_stack, delta_stack_nr+1, delta_stack_alloc);
1717                }
1718                i = delta_stack_nr++;
1719                delta_stack[i].obj_offset = obj_offset;
1720                delta_stack[i].curpos = curpos;
1721                delta_stack[i].size = size;
1722
1723                curpos = obj_offset = base_offset;
1724        }
1725
1726        /* PHASE 2: handle the base */
1727        switch (type) {
1728        case OBJ_OFS_DELTA:
1729        case OBJ_REF_DELTA:
1730                if (data)
1731                        BUG("unpack_entry: left loop at a valid delta");
1732                break;
1733        case OBJ_COMMIT:
1734        case OBJ_TREE:
1735        case OBJ_BLOB:
1736        case OBJ_TAG:
1737                if (!base_from_cache)
1738                        data = unpack_compressed_entry(p, &w_curs, curpos, size);
1739                break;
1740        default:
1741                data = NULL;
1742                error("unknown object type %i at offset %"PRIuMAX" in %s",
1743                      type, (uintmax_t)obj_offset, p->pack_name);
1744        }
1745
1746        /* PHASE 3: apply deltas in order */
1747
1748        /* invariants:
1749         *   'data' holds the base data, or NULL if there was corruption
1750         */
1751        while (delta_stack_nr) {
1752                void *delta_data;
1753                void *base = data;
1754                void *external_base = NULL;
1755                unsigned long delta_size, base_size = size;
1756                int i;
1757
1758                data = NULL;
1759
1760                if (base)
1761                        add_delta_base_cache(p, obj_offset, base, base_size, type);
1762
1763                if (!base) {
1764                        /*
1765                         * We're probably in deep shit, but let's try to fetch
1766                         * the required base anyway from another pack or loose.
1767                         * This is costly but should happen only in the presence
1768                         * of a corrupted pack, and is better than failing outright.
1769                         */
1770                        struct revindex_entry *revidx;
1771                        struct object_id base_oid;
1772                        revidx = find_pack_revindex(p, obj_offset);
1773                        if (revidx) {
1774                                nth_packed_object_oid(&base_oid, p, revidx->nr);
1775                                error("failed to read delta base object %s"
1776                                      " at offset %"PRIuMAX" from %s",
1777                                      oid_to_hex(&base_oid), (uintmax_t)obj_offset,
1778                                      p->pack_name);
1779                                mark_bad_packed_object(p, base_oid.hash);
1780                                base = read_object(r, &base_oid, &type, &base_size);
1781                                external_base = base;
1782                        }
1783                }
1784
1785                i = --delta_stack_nr;
1786                obj_offset = delta_stack[i].obj_offset;
1787                curpos = delta_stack[i].curpos;
1788                delta_size = delta_stack[i].size;
1789
1790                if (!base)
1791                        continue;
1792
1793                delta_data = unpack_compressed_entry(p, &w_curs, curpos, delta_size);
1794
1795                if (!delta_data) {
1796                        error("failed to unpack compressed delta "
1797                              "at offset %"PRIuMAX" from %s",
1798                              (uintmax_t)curpos, p->pack_name);
1799                        data = NULL;
1800                        free(external_base);
1801                        continue;
1802                }
1803
1804                data = patch_delta(base, base_size,
1805                                   delta_data, delta_size,
1806                                   &size);
1807
1808                /*
1809                 * We could not apply the delta; warn the user, but keep going.
1810                 * Our failure will be noticed either in the next iteration of
1811                 * the loop, or if this is the final delta, in the caller when
1812                 * we return NULL. Those code paths will take care of making
1813                 * a more explicit warning and retrying with another copy of
1814                 * the object.
1815                 */
1816                if (!data)
1817                        error("failed to apply delta");
1818
1819                free(delta_data);
1820                free(external_base);
1821        }
1822
1823        if (final_type)
1824                *final_type = type;
1825        if (final_size)
1826                *final_size = size;
1827
1828out:
1829        unuse_pack(&w_curs);
1830
1831        if (delta_stack != small_delta_stack)
1832                free(delta_stack);
1833
1834        return data;
1835}
1836
1837int bsearch_pack(const struct object_id *oid, const struct packed_git *p, uint32_t *result)
1838{
1839        const unsigned char *index_fanout = p->index_data;
1840        const unsigned char *index_lookup;
1841        const unsigned int hashsz = the_hash_algo->rawsz;
1842        int index_lookup_width;
1843
1844        if (!index_fanout)
1845                BUG("bsearch_pack called without a valid pack-index");
1846
1847        index_lookup = index_fanout + 4 * 256;
1848        if (p->index_version == 1) {
1849                index_lookup_width = hashsz + 4;
1850                index_lookup += 4;
1851        } else {
1852                index_lookup_width = hashsz;
1853                index_fanout += 8;
1854                index_lookup += 8;
1855        }
1856
1857        return bsearch_hash(oid->hash, (const uint32_t*)index_fanout,
1858                            index_lookup, index_lookup_width, result);
1859}
1860
1861const unsigned char *nth_packed_object_sha1(struct packed_git *p,
1862                                            uint32_t n)
1863{
1864        const unsigned char *index = p->index_data;
1865        const unsigned int hashsz = the_hash_algo->rawsz;
1866        if (!index) {
1867                if (open_pack_index(p))
1868                        return NULL;
1869                index = p->index_data;
1870        }
1871        if (n >= p->num_objects)
1872                return NULL;
1873        index += 4 * 256;
1874        if (p->index_version == 1) {
1875                return index + (hashsz + 4) * n + 4;
1876        } else {
1877                index += 8;
1878                return index + hashsz * n;
1879        }
1880}
1881
1882const struct object_id *nth_packed_object_oid(struct object_id *oid,
1883                                              struct packed_git *p,
1884                                              uint32_t n)
1885{
1886        const unsigned char *hash = nth_packed_object_sha1(p, n);
1887        if (!hash)
1888                return NULL;
1889        hashcpy(oid->hash, hash);
1890        return oid;
1891}
1892
1893void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
1894{
1895        const unsigned char *ptr = vptr;
1896        const unsigned char *start = p->index_data;
1897        const unsigned char *end = start + p->index_size;
1898        if (ptr < start)
1899                die(_("offset before start of pack index for %s (corrupt index?)"),
1900                    p->pack_name);
1901        /* No need to check for underflow; .idx files must be at least 8 bytes */
1902        if (ptr >= end - 8)
1903                die(_("offset beyond end of pack index for %s (truncated index?)"),
1904                    p->pack_name);
1905}
1906
1907off_t nth_packed_object_offset(const struct packed_git *p, uint32_t n)
1908{
1909        const unsigned char *index = p->index_data;
1910        const unsigned int hashsz = the_hash_algo->rawsz;
1911        index += 4 * 256;
1912        if (p->index_version == 1) {
1913                return ntohl(*((uint32_t *)(index + (hashsz + 4) * n)));
1914        } else {
1915                uint32_t off;
1916                index += 8 + p->num_objects * (hashsz + 4);
1917                off = ntohl(*((uint32_t *)(index + 4 * n)));
1918                if (!(off & 0x80000000))
1919                        return off;
1920                index += p->num_objects * 4 + (off & 0x7fffffff) * 8;
1921                check_pack_index_ptr(p, index);
1922                return get_be64(index);
1923        }
1924}
1925
1926off_t find_pack_entry_one(const unsigned char *sha1,
1927                                  struct packed_git *p)
1928{
1929        const unsigned char *index = p->index_data;
1930        struct object_id oid;
1931        uint32_t result;
1932
1933        if (!index) {
1934                if (open_pack_index(p))
1935                        return 0;
1936        }
1937
1938        hashcpy(oid.hash, sha1);
1939        if (bsearch_pack(&oid, p, &result))
1940                return nth_packed_object_offset(p, result);
1941        return 0;
1942}
1943
1944int is_pack_valid(struct packed_git *p)
1945{
1946        /* An already open pack is known to be valid. */
1947        if (p->pack_fd != -1)
1948                return 1;
1949
1950        /* If the pack has one window completely covering the
1951         * file size, the pack is known to be valid even if
1952         * the descriptor is not currently open.
1953         */
1954        if (p->windows) {
1955                struct pack_window *w = p->windows;
1956
1957                if (!w->offset && w->len == p->pack_size)
1958                        return 1;
1959        }
1960
1961        /* Force the pack to open to prove its valid. */
1962        return !open_packed_git(p);
1963}
1964
1965struct packed_git *find_sha1_pack(const unsigned char *sha1,
1966                                  struct packed_git *packs)
1967{
1968        struct packed_git *p;
1969
1970        for (p = packs; p; p = p->next) {
1971                if (find_pack_entry_one(sha1, p))
1972                        return p;
1973        }
1974        return NULL;
1975
1976}
1977
1978static int fill_pack_entry(const struct object_id *oid,
1979                           struct pack_entry *e,
1980                           struct packed_git *p)
1981{
1982        off_t offset;
1983
1984        if (p->num_bad_objects) {
1985                unsigned i;
1986                for (i = 0; i < p->num_bad_objects; i++)
1987                        if (hasheq(oid->hash,
1988                                   p->bad_object_sha1 + the_hash_algo->rawsz * i))
1989                                return 0;
1990        }
1991
1992        offset = find_pack_entry_one(oid->hash, p);
1993        if (!offset)
1994                return 0;
1995
1996        /*
1997         * We are about to tell the caller where they can locate the
1998         * requested object.  We better make sure the packfile is
1999         * still here and can be accessed before supplying that
2000         * answer, as it may have been deleted since the index was
2001         * loaded!
2002         */
2003        if (!is_pack_valid(p))
2004                return 0;
2005        e->offset = offset;
2006        e->p = p;
2007        return 1;
2008}
2009
2010int find_pack_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e)
2011{
2012        struct list_head *pos;
2013        struct multi_pack_index *m;
2014
2015        prepare_packed_git(r);
2016        if (!r->objects->packed_git && !r->objects->multi_pack_index)
2017                return 0;
2018
2019        for (m = r->objects->multi_pack_index; m; m = m->next) {
2020                if (fill_midx_entry(r, oid, e, m))
2021                        return 1;
2022        }
2023
2024        list_for_each(pos, &r->objects->packed_git_mru) {
2025                struct packed_git *p = list_entry(pos, struct packed_git, mru);
2026                if (!p->multi_pack_index && fill_pack_entry(oid, e, p)) {
2027                        list_move(&p->mru, &r->objects->packed_git_mru);
2028                        return 1;
2029                }
2030        }
2031        return 0;
2032}
2033
2034int has_object_pack(const struct object_id *oid)
2035{
2036        struct pack_entry e;
2037        return find_pack_entry(the_repository, oid, &e);
2038}
2039
2040int has_pack_index(const unsigned char *sha1)
2041{
2042        struct stat st;
2043        if (stat(sha1_pack_index_name(sha1), &st))
2044                return 0;
2045        return 1;
2046}
2047
2048int for_each_object_in_pack(struct packed_git *p,
2049                            each_packed_object_fn cb, void *data,
2050                            enum for_each_object_flags flags)
2051{
2052        uint32_t i;
2053        int r = 0;
2054
2055        if (flags & FOR_EACH_OBJECT_PACK_ORDER) {
2056                if (load_pack_revindex(p))
2057                        return -1;
2058        }
2059
2060        for (i = 0; i < p->num_objects; i++) {
2061                uint32_t pos;
2062                struct object_id oid;
2063
2064                if (flags & FOR_EACH_OBJECT_PACK_ORDER)
2065                        pos = p->revindex[i].nr;
2066                else
2067                        pos = i;
2068
2069                if (!nth_packed_object_oid(&oid, p, pos))
2070                        return error("unable to get sha1 of object %u in %s",
2071                                     pos, p->pack_name);
2072
2073                r = cb(&oid, p, pos, data);
2074                if (r)
2075                        break;
2076        }
2077        return r;
2078}
2079
2080int for_each_packed_object(each_packed_object_fn cb, void *data,
2081                           enum for_each_object_flags flags)
2082{
2083        struct packed_git *p;
2084        int r = 0;
2085        int pack_errors = 0;
2086
2087        prepare_packed_git(the_repository);
2088        for (p = get_all_packs(the_repository); p; p = p->next) {
2089                if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
2090                        continue;
2091                if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
2092                    !p->pack_promisor)
2093                        continue;
2094                if (open_pack_index(p)) {
2095                        pack_errors = 1;
2096                        continue;
2097                }
2098                r = for_each_object_in_pack(p, cb, data, flags);
2099                if (r)
2100                        break;
2101        }
2102        return r ? r : pack_errors;
2103}
2104
2105static int add_promisor_object(const struct object_id *oid,
2106                               struct packed_git *pack,
2107                               uint32_t pos,
2108                               void *set_)
2109{
2110        struct oidset *set = set_;
2111        struct object *obj = parse_object(the_repository, oid);
2112        if (!obj)
2113                return 1;
2114
2115        oidset_insert(set, oid);
2116
2117        /*
2118         * If this is a tree, commit, or tag, the objects it refers
2119         * to are also promisor objects. (Blobs refer to no objects->)
2120         */
2121        if (obj->type == OBJ_TREE) {
2122                struct tree *tree = (struct tree *)obj;
2123                struct tree_desc desc;
2124                struct name_entry entry;
2125                if (init_tree_desc_gently(&desc, tree->buffer, tree->size))
2126                        /*
2127                         * Error messages are given when packs are
2128                         * verified, so do not print any here.
2129                         */
2130                        return 0;
2131                while (tree_entry_gently(&desc, &entry))
2132                        oidset_insert(set, &entry.oid);
2133        } else if (obj->type == OBJ_COMMIT) {
2134                struct commit *commit = (struct commit *) obj;
2135                struct commit_list *parents = commit->parents;
2136
2137                oidset_insert(set, get_commit_tree_oid(commit));
2138                for (; parents; parents = parents->next)
2139                        oidset_insert(set, &parents->item->object.oid);
2140        } else if (obj->type == OBJ_TAG) {
2141                struct tag *tag = (struct tag *) obj;
2142                oidset_insert(set, &tag->tagged->oid);
2143        }
2144        return 0;
2145}
2146
2147int is_promisor_object(const struct object_id *oid)
2148{
2149        static struct oidset promisor_objects;
2150        static int promisor_objects_prepared;
2151
2152        if (!promisor_objects_prepared) {
2153                if (repository_format_partial_clone) {
2154                        for_each_packed_object(add_promisor_object,
2155                                               &promisor_objects,
2156                                               FOR_EACH_OBJECT_PROMISOR_ONLY);
2157                }
2158                promisor_objects_prepared = 1;
2159        }
2160        return oidset_contains(&promisor_objects, oid);
2161}