fetch-pack.con commit streaming: make stream_blob_to_fd take struct object_id (7eda0e4)
   1#include "cache.h"
   2#include "lockfile.h"
   3#include "refs.h"
   4#include "pkt-line.h"
   5#include "commit.h"
   6#include "tag.h"
   7#include "exec_cmd.h"
   8#include "pack.h"
   9#include "sideband.h"
  10#include "fetch-pack.h"
  11#include "remote.h"
  12#include "run-command.h"
  13#include "connect.h"
  14#include "transport.h"
  15#include "version.h"
  16#include "prio-queue.h"
  17#include "sha1-array.h"
  18
  19static int transfer_unpack_limit = -1;
  20static int fetch_unpack_limit = -1;
  21static int unpack_limit = 100;
  22static int prefer_ofs_delta = 1;
  23static int no_done;
  24static int fetch_fsck_objects = -1;
  25static int transfer_fsck_objects = -1;
  26static int agent_supported;
  27static struct lock_file shallow_lock;
  28static const char *alternate_shallow_file;
  29
  30/* Remember to update object flag allocation in object.h */
  31#define COMPLETE        (1U << 0)
  32#define COMMON          (1U << 1)
  33#define COMMON_REF      (1U << 2)
  34#define SEEN            (1U << 3)
  35#define POPPED          (1U << 4)
  36
  37static int marked;
  38
  39/*
  40 * After sending this many "have"s if we do not get any new ACK , we
  41 * give up traversing our history.
  42 */
  43#define MAX_IN_VAIN 256
  44
  45static struct prio_queue rev_list = { compare_commits_by_commit_date };
  46static int non_common_revs, multi_ack, use_sideband;
  47/* Allow specifying sha1 if it is a ref tip. */
  48#define ALLOW_TIP_SHA1  01
  49/* Allow request of a sha1 if it is reachable from a ref (possibly hidden ref). */
  50#define ALLOW_REACHABLE_SHA1    02
  51static unsigned int allow_unadvertised_object_request;
  52
  53static void rev_list_push(struct commit *commit, int mark)
  54{
  55        if (!(commit->object.flags & mark)) {
  56                commit->object.flags |= mark;
  57
  58                if (parse_commit(commit))
  59                        return;
  60
  61                prio_queue_put(&rev_list, commit);
  62
  63                if (!(commit->object.flags & COMMON))
  64                        non_common_revs++;
  65        }
  66}
  67
  68static int rev_list_insert_ref(const char *refname, const unsigned char *sha1)
  69{
  70        struct object *o = deref_tag(parse_object(sha1), refname, 0);
  71
  72        if (o && o->type == OBJ_COMMIT)
  73                rev_list_push((struct commit *)o, SEEN);
  74
  75        return 0;
  76}
  77
  78static int rev_list_insert_ref_oid(const char *refname, const struct object_id *oid,
  79                                   int flag, void *cb_data)
  80{
  81        return rev_list_insert_ref(refname, oid->hash);
  82}
  83
  84static int clear_marks(const char *refname, const struct object_id *oid,
  85                       int flag, void *cb_data)
  86{
  87        struct object *o = deref_tag(parse_object(oid->hash), refname, 0);
  88
  89        if (o && o->type == OBJ_COMMIT)
  90                clear_commit_marks((struct commit *)o,
  91                                   COMMON | COMMON_REF | SEEN | POPPED);
  92        return 0;
  93}
  94
  95/*
  96   This function marks a rev and its ancestors as common.
  97   In some cases, it is desirable to mark only the ancestors (for example
  98   when only the server does not yet know that they are common).
  99*/
 100
 101static void mark_common(struct commit *commit,
 102                int ancestors_only, int dont_parse)
 103{
 104        if (commit != NULL && !(commit->object.flags & COMMON)) {
 105                struct object *o = (struct object *)commit;
 106
 107                if (!ancestors_only)
 108                        o->flags |= COMMON;
 109
 110                if (!(o->flags & SEEN))
 111                        rev_list_push(commit, SEEN);
 112                else {
 113                        struct commit_list *parents;
 114
 115                        if (!ancestors_only && !(o->flags & POPPED))
 116                                non_common_revs--;
 117                        if (!o->parsed && !dont_parse)
 118                                if (parse_commit(commit))
 119                                        return;
 120
 121                        for (parents = commit->parents;
 122                                        parents;
 123                                        parents = parents->next)
 124                                mark_common(parents->item, 0, dont_parse);
 125                }
 126        }
 127}
 128
 129/*
 130  Get the next rev to send, ignoring the common.
 131*/
 132
 133static const unsigned char *get_rev(void)
 134{
 135        struct commit *commit = NULL;
 136
 137        while (commit == NULL) {
 138                unsigned int mark;
 139                struct commit_list *parents;
 140
 141                if (rev_list.nr == 0 || non_common_revs == 0)
 142                        return NULL;
 143
 144                commit = prio_queue_get(&rev_list);
 145                parse_commit(commit);
 146                parents = commit->parents;
 147
 148                commit->object.flags |= POPPED;
 149                if (!(commit->object.flags & COMMON))
 150                        non_common_revs--;
 151
 152                if (commit->object.flags & COMMON) {
 153                        /* do not send "have", and ignore ancestors */
 154                        commit = NULL;
 155                        mark = COMMON | SEEN;
 156                } else if (commit->object.flags & COMMON_REF)
 157                        /* send "have", and ignore ancestors */
 158                        mark = COMMON | SEEN;
 159                else
 160                        /* send "have", also for its ancestors */
 161                        mark = SEEN;
 162
 163                while (parents) {
 164                        if (!(parents->item->object.flags & SEEN))
 165                                rev_list_push(parents->item, mark);
 166                        if (mark & COMMON)
 167                                mark_common(parents->item, 1, 0);
 168                        parents = parents->next;
 169                }
 170        }
 171
 172        return commit->object.oid.hash;
 173}
 174
 175enum ack_type {
 176        NAK = 0,
 177        ACK,
 178        ACK_continue,
 179        ACK_common,
 180        ACK_ready
 181};
 182
 183static void consume_shallow_list(struct fetch_pack_args *args, int fd)
 184{
 185        if (args->stateless_rpc && args->depth > 0) {
 186                /* If we sent a depth we will get back "duplicate"
 187                 * shallow and unshallow commands every time there
 188                 * is a block of have lines exchanged.
 189                 */
 190                char *line;
 191                while ((line = packet_read_line(fd, NULL))) {
 192                        if (starts_with(line, "shallow "))
 193                                continue;
 194                        if (starts_with(line, "unshallow "))
 195                                continue;
 196                        die("git fetch-pack: expected shallow list");
 197                }
 198        }
 199}
 200
 201static enum ack_type get_ack(int fd, unsigned char *result_sha1)
 202{
 203        int len;
 204        char *line = packet_read_line(fd, &len);
 205        const char *arg;
 206
 207        if (!len)
 208                die("git fetch-pack: expected ACK/NAK, got EOF");
 209        if (!strcmp(line, "NAK"))
 210                return NAK;
 211        if (skip_prefix(line, "ACK ", &arg)) {
 212                if (!get_sha1_hex(arg, result_sha1)) {
 213                        arg += 40;
 214                        len -= arg - line;
 215                        if (len < 1)
 216                                return ACK;
 217                        if (strstr(arg, "continue"))
 218                                return ACK_continue;
 219                        if (strstr(arg, "common"))
 220                                return ACK_common;
 221                        if (strstr(arg, "ready"))
 222                                return ACK_ready;
 223                        return ACK;
 224                }
 225        }
 226        die("git fetch_pack: expected ACK/NAK, got '%s'", line);
 227}
 228
 229static void send_request(struct fetch_pack_args *args,
 230                         int fd, struct strbuf *buf)
 231{
 232        if (args->stateless_rpc) {
 233                send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
 234                packet_flush(fd);
 235        } else
 236                write_or_die(fd, buf->buf, buf->len);
 237}
 238
 239static void insert_one_alternate_ref(const struct ref *ref, void *unused)
 240{
 241        rev_list_insert_ref(NULL, ref->old_oid.hash);
 242}
 243
 244#define INITIAL_FLUSH 16
 245#define PIPESAFE_FLUSH 32
 246#define LARGE_FLUSH 16384
 247
 248static int next_flush(struct fetch_pack_args *args, int count)
 249{
 250        if (args->stateless_rpc) {
 251                if (count < LARGE_FLUSH)
 252                        count <<= 1;
 253                else
 254                        count = count * 11 / 10;
 255        } else {
 256                if (count < PIPESAFE_FLUSH)
 257                        count <<= 1;
 258                else
 259                        count += PIPESAFE_FLUSH;
 260        }
 261        return count;
 262}
 263
 264static int find_common(struct fetch_pack_args *args,
 265                       int fd[2], unsigned char *result_sha1,
 266                       struct ref *refs)
 267{
 268        int fetching;
 269        int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
 270        const unsigned char *sha1;
 271        unsigned in_vain = 0;
 272        int got_continue = 0;
 273        int got_ready = 0;
 274        struct strbuf req_buf = STRBUF_INIT;
 275        size_t state_len = 0;
 276
 277        if (args->stateless_rpc && multi_ack == 1)
 278                die("--stateless-rpc requires multi_ack_detailed");
 279        if (marked)
 280                for_each_ref(clear_marks, NULL);
 281        marked = 1;
 282
 283        for_each_ref(rev_list_insert_ref_oid, NULL);
 284        for_each_alternate_ref(insert_one_alternate_ref, NULL);
 285
 286        fetching = 0;
 287        for ( ; refs ; refs = refs->next) {
 288                unsigned char *remote = refs->old_oid.hash;
 289                const char *remote_hex;
 290                struct object *o;
 291
 292                /*
 293                 * If that object is complete (i.e. it is an ancestor of a
 294                 * local ref), we tell them we have it but do not have to
 295                 * tell them about its ancestors, which they already know
 296                 * about.
 297                 *
 298                 * We use lookup_object here because we are only
 299                 * interested in the case we *know* the object is
 300                 * reachable and we have already scanned it.
 301                 */
 302                if (((o = lookup_object(remote)) != NULL) &&
 303                                (o->flags & COMPLETE)) {
 304                        continue;
 305                }
 306
 307                remote_hex = sha1_to_hex(remote);
 308                if (!fetching) {
 309                        struct strbuf c = STRBUF_INIT;
 310                        if (multi_ack == 2)     strbuf_addstr(&c, " multi_ack_detailed");
 311                        if (multi_ack == 1)     strbuf_addstr(&c, " multi_ack");
 312                        if (no_done)            strbuf_addstr(&c, " no-done");
 313                        if (use_sideband == 2)  strbuf_addstr(&c, " side-band-64k");
 314                        if (use_sideband == 1)  strbuf_addstr(&c, " side-band");
 315                        if (args->use_thin_pack) strbuf_addstr(&c, " thin-pack");
 316                        if (args->no_progress)   strbuf_addstr(&c, " no-progress");
 317                        if (args->include_tag)   strbuf_addstr(&c, " include-tag");
 318                        if (prefer_ofs_delta)   strbuf_addstr(&c, " ofs-delta");
 319                        if (agent_supported)    strbuf_addf(&c, " agent=%s",
 320                                                            git_user_agent_sanitized());
 321                        packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
 322                        strbuf_release(&c);
 323                } else
 324                        packet_buf_write(&req_buf, "want %s\n", remote_hex);
 325                fetching++;
 326        }
 327
 328        if (!fetching) {
 329                strbuf_release(&req_buf);
 330                packet_flush(fd[1]);
 331                return 1;
 332        }
 333
 334        if (is_repository_shallow())
 335                write_shallow_commits(&req_buf, 1, NULL);
 336        if (args->depth > 0)
 337                packet_buf_write(&req_buf, "deepen %d", args->depth);
 338        packet_buf_flush(&req_buf);
 339        state_len = req_buf.len;
 340
 341        if (args->depth > 0) {
 342                char *line;
 343                const char *arg;
 344                unsigned char sha1[20];
 345
 346                send_request(args, fd[1], &req_buf);
 347                while ((line = packet_read_line(fd[0], NULL))) {
 348                        if (skip_prefix(line, "shallow ", &arg)) {
 349                                if (get_sha1_hex(arg, sha1))
 350                                        die("invalid shallow line: %s", line);
 351                                register_shallow(sha1);
 352                                continue;
 353                        }
 354                        if (skip_prefix(line, "unshallow ", &arg)) {
 355                                if (get_sha1_hex(arg, sha1))
 356                                        die("invalid unshallow line: %s", line);
 357                                if (!lookup_object(sha1))
 358                                        die("object not found: %s", line);
 359                                /* make sure that it is parsed as shallow */
 360                                if (!parse_object(sha1))
 361                                        die("error in object: %s", line);
 362                                if (unregister_shallow(sha1))
 363                                        die("no shallow found: %s", line);
 364                                continue;
 365                        }
 366                        die("expected shallow/unshallow, got %s", line);
 367                }
 368        } else if (!args->stateless_rpc)
 369                send_request(args, fd[1], &req_buf);
 370
 371        if (!args->stateless_rpc) {
 372                /* If we aren't using the stateless-rpc interface
 373                 * we don't need to retain the headers.
 374                 */
 375                strbuf_setlen(&req_buf, 0);
 376                state_len = 0;
 377        }
 378
 379        flushes = 0;
 380        retval = -1;
 381        while ((sha1 = get_rev())) {
 382                packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
 383                if (args->verbose)
 384                        fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
 385                in_vain++;
 386                if (flush_at <= ++count) {
 387                        int ack;
 388
 389                        packet_buf_flush(&req_buf);
 390                        send_request(args, fd[1], &req_buf);
 391                        strbuf_setlen(&req_buf, state_len);
 392                        flushes++;
 393                        flush_at = next_flush(args, count);
 394
 395                        /*
 396                         * We keep one window "ahead" of the other side, and
 397                         * will wait for an ACK only on the next one
 398                         */
 399                        if (!args->stateless_rpc && count == INITIAL_FLUSH)
 400                                continue;
 401
 402                        consume_shallow_list(args, fd[0]);
 403                        do {
 404                                ack = get_ack(fd[0], result_sha1);
 405                                if (args->verbose && ack)
 406                                        fprintf(stderr, "got ack %d %s\n", ack,
 407                                                        sha1_to_hex(result_sha1));
 408                                switch (ack) {
 409                                case ACK:
 410                                        flushes = 0;
 411                                        multi_ack = 0;
 412                                        retval = 0;
 413                                        goto done;
 414                                case ACK_common:
 415                                case ACK_ready:
 416                                case ACK_continue: {
 417                                        struct commit *commit =
 418                                                lookup_commit(result_sha1);
 419                                        if (!commit)
 420                                                die("invalid commit %s", sha1_to_hex(result_sha1));
 421                                        if (args->stateless_rpc
 422                                         && ack == ACK_common
 423                                         && !(commit->object.flags & COMMON)) {
 424                                                /* We need to replay the have for this object
 425                                                 * on the next RPC request so the peer knows
 426                                                 * it is in common with us.
 427                                                 */
 428                                                const char *hex = sha1_to_hex(result_sha1);
 429                                                packet_buf_write(&req_buf, "have %s\n", hex);
 430                                                state_len = req_buf.len;
 431                                        }
 432                                        mark_common(commit, 0, 1);
 433                                        retval = 0;
 434                                        in_vain = 0;
 435                                        got_continue = 1;
 436                                        if (ack == ACK_ready) {
 437                                                clear_prio_queue(&rev_list);
 438                                                got_ready = 1;
 439                                        }
 440                                        break;
 441                                        }
 442                                }
 443                        } while (ack);
 444                        flushes--;
 445                        if (got_continue && MAX_IN_VAIN < in_vain) {
 446                                if (args->verbose)
 447                                        fprintf(stderr, "giving up\n");
 448                                break; /* give up */
 449                        }
 450                }
 451        }
 452done:
 453        if (!got_ready || !no_done) {
 454                packet_buf_write(&req_buf, "done\n");
 455                send_request(args, fd[1], &req_buf);
 456        }
 457        if (args->verbose)
 458                fprintf(stderr, "done\n");
 459        if (retval != 0) {
 460                multi_ack = 0;
 461                flushes++;
 462        }
 463        strbuf_release(&req_buf);
 464
 465        if (!got_ready || !no_done)
 466                consume_shallow_list(args, fd[0]);
 467        while (flushes || multi_ack) {
 468                int ack = get_ack(fd[0], result_sha1);
 469                if (ack) {
 470                        if (args->verbose)
 471                                fprintf(stderr, "got ack (%d) %s\n", ack,
 472                                        sha1_to_hex(result_sha1));
 473                        if (ack == ACK)
 474                                return 0;
 475                        multi_ack = 1;
 476                        continue;
 477                }
 478                flushes--;
 479        }
 480        /* it is no error to fetch into a completely empty repo */
 481        return count ? retval : 0;
 482}
 483
 484static struct commit_list *complete;
 485
 486static int mark_complete(const unsigned char *sha1)
 487{
 488        struct object *o = parse_object(sha1);
 489
 490        while (o && o->type == OBJ_TAG) {
 491                struct tag *t = (struct tag *) o;
 492                if (!t->tagged)
 493                        break; /* broken repository */
 494                o->flags |= COMPLETE;
 495                o = parse_object(t->tagged->oid.hash);
 496        }
 497        if (o && o->type == OBJ_COMMIT) {
 498                struct commit *commit = (struct commit *)o;
 499                if (!(commit->object.flags & COMPLETE)) {
 500                        commit->object.flags |= COMPLETE;
 501                        commit_list_insert(commit, &complete);
 502                }
 503        }
 504        return 0;
 505}
 506
 507static int mark_complete_oid(const char *refname, const struct object_id *oid,
 508                             int flag, void *cb_data)
 509{
 510        return mark_complete(oid->hash);
 511}
 512
 513static void mark_recent_complete_commits(struct fetch_pack_args *args,
 514                                         unsigned long cutoff)
 515{
 516        while (complete && cutoff <= complete->item->date) {
 517                if (args->verbose)
 518                        fprintf(stderr, "Marking %s as complete\n",
 519                                oid_to_hex(&complete->item->object.oid));
 520                pop_most_recent_commit(&complete, COMPLETE);
 521        }
 522}
 523
 524static void filter_refs(struct fetch_pack_args *args,
 525                        struct ref **refs,
 526                        struct ref **sought, int nr_sought)
 527{
 528        struct ref *newlist = NULL;
 529        struct ref **newtail = &newlist;
 530        struct ref *ref, *next;
 531        int i;
 532
 533        i = 0;
 534        for (ref = *refs; ref; ref = next) {
 535                int keep = 0;
 536                next = ref->next;
 537
 538                if (starts_with(ref->name, "refs/") &&
 539                    check_refname_format(ref->name, 0))
 540                        ; /* trash */
 541                else {
 542                        while (i < nr_sought) {
 543                                int cmp = strcmp(ref->name, sought[i]->name);
 544                                if (cmp < 0)
 545                                        break; /* definitely do not have it */
 546                                else if (cmp == 0) {
 547                                        keep = 1; /* definitely have it */
 548                                        sought[i]->matched = 1;
 549                                }
 550                                i++;
 551                        }
 552                }
 553
 554                if (!keep && args->fetch_all &&
 555                    (!args->depth || !starts_with(ref->name, "refs/tags/")))
 556                        keep = 1;
 557
 558                if (keep) {
 559                        *newtail = ref;
 560                        ref->next = NULL;
 561                        newtail = &ref->next;
 562                } else {
 563                        free(ref);
 564                }
 565        }
 566
 567        /* Append unmatched requests to the list */
 568        if ((allow_unadvertised_object_request &
 569            (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1))) {
 570                for (i = 0; i < nr_sought; i++) {
 571                        unsigned char sha1[20];
 572
 573                        ref = sought[i];
 574                        if (ref->matched)
 575                                continue;
 576                        if (get_sha1_hex(ref->name, sha1) ||
 577                            ref->name[40] != '\0' ||
 578                            hashcmp(sha1, ref->old_oid.hash))
 579                                continue;
 580
 581                        ref->matched = 1;
 582                        *newtail = copy_ref(ref);
 583                        newtail = &(*newtail)->next;
 584                }
 585        }
 586        *refs = newlist;
 587}
 588
 589static void mark_alternate_complete(const struct ref *ref, void *unused)
 590{
 591        mark_complete(ref->old_oid.hash);
 592}
 593
 594static int everything_local(struct fetch_pack_args *args,
 595                            struct ref **refs,
 596                            struct ref **sought, int nr_sought)
 597{
 598        struct ref *ref;
 599        int retval;
 600        unsigned long cutoff = 0;
 601
 602        save_commit_buffer = 0;
 603
 604        for (ref = *refs; ref; ref = ref->next) {
 605                struct object *o;
 606
 607                if (!has_object_file(&ref->old_oid))
 608                        continue;
 609
 610                o = parse_object(ref->old_oid.hash);
 611                if (!o)
 612                        continue;
 613
 614                /* We already have it -- which may mean that we were
 615                 * in sync with the other side at some time after
 616                 * that (it is OK if we guess wrong here).
 617                 */
 618                if (o->type == OBJ_COMMIT) {
 619                        struct commit *commit = (struct commit *)o;
 620                        if (!cutoff || cutoff < commit->date)
 621                                cutoff = commit->date;
 622                }
 623        }
 624
 625        if (!args->depth) {
 626                for_each_ref(mark_complete_oid, NULL);
 627                for_each_alternate_ref(mark_alternate_complete, NULL);
 628                commit_list_sort_by_date(&complete);
 629                if (cutoff)
 630                        mark_recent_complete_commits(args, cutoff);
 631        }
 632
 633        /*
 634         * Mark all complete remote refs as common refs.
 635         * Don't mark them common yet; the server has to be told so first.
 636         */
 637        for (ref = *refs; ref; ref = ref->next) {
 638                struct object *o = deref_tag(lookup_object(ref->old_oid.hash),
 639                                             NULL, 0);
 640
 641                if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
 642                        continue;
 643
 644                if (!(o->flags & SEEN)) {
 645                        rev_list_push((struct commit *)o, COMMON_REF | SEEN);
 646
 647                        mark_common((struct commit *)o, 1, 1);
 648                }
 649        }
 650
 651        filter_refs(args, refs, sought, nr_sought);
 652
 653        for (retval = 1, ref = *refs; ref ; ref = ref->next) {
 654                const unsigned char *remote = ref->old_oid.hash;
 655                struct object *o;
 656
 657                o = lookup_object(remote);
 658                if (!o || !(o->flags & COMPLETE)) {
 659                        retval = 0;
 660                        if (!args->verbose)
 661                                continue;
 662                        fprintf(stderr,
 663                                "want %s (%s)\n", sha1_to_hex(remote),
 664                                ref->name);
 665                        continue;
 666                }
 667                if (!args->verbose)
 668                        continue;
 669                fprintf(stderr,
 670                        "already have %s (%s)\n", sha1_to_hex(remote),
 671                        ref->name);
 672        }
 673        return retval;
 674}
 675
 676static int sideband_demux(int in, int out, void *data)
 677{
 678        int *xd = data;
 679        int ret;
 680
 681        ret = recv_sideband("fetch-pack", xd[0], out);
 682        close(out);
 683        return ret;
 684}
 685
 686static int get_pack(struct fetch_pack_args *args,
 687                    int xd[2], char **pack_lockfile)
 688{
 689        struct async demux;
 690        int do_keep = args->keep_pack;
 691        const char *cmd_name;
 692        struct pack_header header;
 693        int pass_header = 0;
 694        struct child_process cmd = CHILD_PROCESS_INIT;
 695        int ret;
 696
 697        memset(&demux, 0, sizeof(demux));
 698        if (use_sideband) {
 699                /* xd[] is talking with upload-pack; subprocess reads from
 700                 * xd[0], spits out band#2 to stderr, and feeds us band#1
 701                 * through demux->out.
 702                 */
 703                demux.proc = sideband_demux;
 704                demux.data = xd;
 705                demux.out = -1;
 706                demux.isolate_sigpipe = 1;
 707                if (start_async(&demux))
 708                        die("fetch-pack: unable to fork off sideband"
 709                            " demultiplexer");
 710        }
 711        else
 712                demux.out = xd[0];
 713
 714        if (!args->keep_pack && unpack_limit) {
 715
 716                if (read_pack_header(demux.out, &header))
 717                        die("protocol error: bad pack header");
 718                pass_header = 1;
 719                if (ntohl(header.hdr_entries) < unpack_limit)
 720                        do_keep = 0;
 721                else
 722                        do_keep = 1;
 723        }
 724
 725        if (alternate_shallow_file) {
 726                argv_array_push(&cmd.args, "--shallow-file");
 727                argv_array_push(&cmd.args, alternate_shallow_file);
 728        }
 729
 730        if (do_keep) {
 731                if (pack_lockfile)
 732                        cmd.out = -1;
 733                cmd_name = "index-pack";
 734                argv_array_push(&cmd.args, cmd_name);
 735                argv_array_push(&cmd.args, "--stdin");
 736                if (!args->quiet && !args->no_progress)
 737                        argv_array_push(&cmd.args, "-v");
 738                if (args->use_thin_pack)
 739                        argv_array_push(&cmd.args, "--fix-thin");
 740                if (args->lock_pack || unpack_limit) {
 741                        char hostname[256];
 742                        if (gethostname(hostname, sizeof(hostname)))
 743                                xsnprintf(hostname, sizeof(hostname), "localhost");
 744                        argv_array_pushf(&cmd.args,
 745                                        "--keep=fetch-pack %"PRIuMAX " on %s",
 746                                        (uintmax_t)getpid(), hostname);
 747                }
 748                if (args->check_self_contained_and_connected)
 749                        argv_array_push(&cmd.args, "--check-self-contained-and-connected");
 750        }
 751        else {
 752                cmd_name = "unpack-objects";
 753                argv_array_push(&cmd.args, cmd_name);
 754                if (args->quiet || args->no_progress)
 755                        argv_array_push(&cmd.args, "-q");
 756                args->check_self_contained_and_connected = 0;
 757        }
 758
 759        if (pass_header)
 760                argv_array_pushf(&cmd.args, "--pack_header=%"PRIu32",%"PRIu32,
 761                                 ntohl(header.hdr_version),
 762                                 ntohl(header.hdr_entries));
 763        if (fetch_fsck_objects >= 0
 764            ? fetch_fsck_objects
 765            : transfer_fsck_objects >= 0
 766            ? transfer_fsck_objects
 767            : 0)
 768                argv_array_push(&cmd.args, "--strict");
 769
 770        cmd.in = demux.out;
 771        cmd.git_cmd = 1;
 772        if (start_command(&cmd))
 773                die("fetch-pack: unable to fork off %s", cmd_name);
 774        if (do_keep && pack_lockfile) {
 775                *pack_lockfile = index_pack_lockfile(cmd.out);
 776                close(cmd.out);
 777        }
 778
 779        if (!use_sideband)
 780                /* Closed by start_command() */
 781                xd[0] = -1;
 782
 783        ret = finish_command(&cmd);
 784        if (!ret || (args->check_self_contained_and_connected && ret == 1))
 785                args->self_contained_and_connected =
 786                        args->check_self_contained_and_connected &&
 787                        ret == 0;
 788        else
 789                die("%s failed", cmd_name);
 790        if (use_sideband && finish_async(&demux))
 791                die("error in sideband demultiplexer");
 792        return 0;
 793}
 794
 795static int cmp_ref_by_name(const void *a_, const void *b_)
 796{
 797        const struct ref *a = *((const struct ref **)a_);
 798        const struct ref *b = *((const struct ref **)b_);
 799        return strcmp(a->name, b->name);
 800}
 801
 802static struct ref *do_fetch_pack(struct fetch_pack_args *args,
 803                                 int fd[2],
 804                                 const struct ref *orig_ref,
 805                                 struct ref **sought, int nr_sought,
 806                                 struct shallow_info *si,
 807                                 char **pack_lockfile)
 808{
 809        struct ref *ref = copy_ref_list(orig_ref);
 810        unsigned char sha1[20];
 811        const char *agent_feature;
 812        int agent_len;
 813
 814        sort_ref_list(&ref, ref_compare_name);
 815        qsort(sought, nr_sought, sizeof(*sought), cmp_ref_by_name);
 816
 817        if ((args->depth > 0 || is_repository_shallow()) && !server_supports("shallow"))
 818                die("Server does not support shallow clients");
 819        if (server_supports("multi_ack_detailed")) {
 820                if (args->verbose)
 821                        fprintf(stderr, "Server supports multi_ack_detailed\n");
 822                multi_ack = 2;
 823                if (server_supports("no-done")) {
 824                        if (args->verbose)
 825                                fprintf(stderr, "Server supports no-done\n");
 826                        if (args->stateless_rpc)
 827                                no_done = 1;
 828                }
 829        }
 830        else if (server_supports("multi_ack")) {
 831                if (args->verbose)
 832                        fprintf(stderr, "Server supports multi_ack\n");
 833                multi_ack = 1;
 834        }
 835        if (server_supports("side-band-64k")) {
 836                if (args->verbose)
 837                        fprintf(stderr, "Server supports side-band-64k\n");
 838                use_sideband = 2;
 839        }
 840        else if (server_supports("side-band")) {
 841                if (args->verbose)
 842                        fprintf(stderr, "Server supports side-band\n");
 843                use_sideband = 1;
 844        }
 845        if (server_supports("allow-tip-sha1-in-want")) {
 846                if (args->verbose)
 847                        fprintf(stderr, "Server supports allow-tip-sha1-in-want\n");
 848                allow_unadvertised_object_request |= ALLOW_TIP_SHA1;
 849        }
 850        if (server_supports("allow-reachable-sha1-in-want")) {
 851                if (args->verbose)
 852                        fprintf(stderr, "Server supports allow-reachable-sha1-in-want\n");
 853                allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1;
 854        }
 855        if (!server_supports("thin-pack"))
 856                args->use_thin_pack = 0;
 857        if (!server_supports("no-progress"))
 858                args->no_progress = 0;
 859        if (!server_supports("include-tag"))
 860                args->include_tag = 0;
 861        if (server_supports("ofs-delta")) {
 862                if (args->verbose)
 863                        fprintf(stderr, "Server supports ofs-delta\n");
 864        } else
 865                prefer_ofs_delta = 0;
 866
 867        if ((agent_feature = server_feature_value("agent", &agent_len))) {
 868                agent_supported = 1;
 869                if (args->verbose && agent_len)
 870                        fprintf(stderr, "Server version is %.*s\n",
 871                                agent_len, agent_feature);
 872        }
 873
 874        if (everything_local(args, &ref, sought, nr_sought)) {
 875                packet_flush(fd[1]);
 876                goto all_done;
 877        }
 878        if (find_common(args, fd, sha1, ref) < 0)
 879                if (!args->keep_pack)
 880                        /* When cloning, it is not unusual to have
 881                         * no common commit.
 882                         */
 883                        warning("no common commits");
 884
 885        if (args->stateless_rpc)
 886                packet_flush(fd[1]);
 887        if (args->depth > 0)
 888                setup_alternate_shallow(&shallow_lock, &alternate_shallow_file,
 889                                        NULL);
 890        else if (si->nr_ours || si->nr_theirs)
 891                alternate_shallow_file = setup_temporary_shallow(si->shallow);
 892        else
 893                alternate_shallow_file = NULL;
 894        if (get_pack(args, fd, pack_lockfile))
 895                die("git fetch-pack: fetch failed.");
 896
 897 all_done:
 898        return ref;
 899}
 900
 901static void fetch_pack_config(void)
 902{
 903        git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit);
 904        git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit);
 905        git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta);
 906        git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects);
 907        git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects);
 908
 909        git_config(git_default_config, NULL);
 910}
 911
 912static void fetch_pack_setup(void)
 913{
 914        static int did_setup;
 915        if (did_setup)
 916                return;
 917        fetch_pack_config();
 918        if (0 <= transfer_unpack_limit)
 919                unpack_limit = transfer_unpack_limit;
 920        else if (0 <= fetch_unpack_limit)
 921                unpack_limit = fetch_unpack_limit;
 922        did_setup = 1;
 923}
 924
 925static int remove_duplicates_in_refs(struct ref **ref, int nr)
 926{
 927        struct string_list names = STRING_LIST_INIT_NODUP;
 928        int src, dst;
 929
 930        for (src = dst = 0; src < nr; src++) {
 931                struct string_list_item *item;
 932                item = string_list_insert(&names, ref[src]->name);
 933                if (item->util)
 934                        continue; /* already have it */
 935                item->util = ref[src];
 936                if (src != dst)
 937                        ref[dst] = ref[src];
 938                dst++;
 939        }
 940        for (src = dst; src < nr; src++)
 941                ref[src] = NULL;
 942        string_list_clear(&names, 0);
 943        return dst;
 944}
 945
 946static void update_shallow(struct fetch_pack_args *args,
 947                           struct ref **sought, int nr_sought,
 948                           struct shallow_info *si)
 949{
 950        struct sha1_array ref = SHA1_ARRAY_INIT;
 951        int *status;
 952        int i;
 953
 954        if (args->depth > 0 && alternate_shallow_file) {
 955                if (*alternate_shallow_file == '\0') { /* --unshallow */
 956                        unlink_or_warn(git_path_shallow());
 957                        rollback_lock_file(&shallow_lock);
 958                } else
 959                        commit_lock_file(&shallow_lock);
 960                return;
 961        }
 962
 963        if (!si->shallow || !si->shallow->nr)
 964                return;
 965
 966        if (args->cloning) {
 967                /*
 968                 * remote is shallow, but this is a clone, there are
 969                 * no objects in repo to worry about. Accept any
 970                 * shallow points that exist in the pack (iow in repo
 971                 * after get_pack() and reprepare_packed_git())
 972                 */
 973                struct sha1_array extra = SHA1_ARRAY_INIT;
 974                unsigned char (*sha1)[20] = si->shallow->sha1;
 975                for (i = 0; i < si->shallow->nr; i++)
 976                        if (has_sha1_file(sha1[i]))
 977                                sha1_array_append(&extra, sha1[i]);
 978                if (extra.nr) {
 979                        setup_alternate_shallow(&shallow_lock,
 980                                                &alternate_shallow_file,
 981                                                &extra);
 982                        commit_lock_file(&shallow_lock);
 983                }
 984                sha1_array_clear(&extra);
 985                return;
 986        }
 987
 988        if (!si->nr_ours && !si->nr_theirs)
 989                return;
 990
 991        remove_nonexistent_theirs_shallow(si);
 992        if (!si->nr_ours && !si->nr_theirs)
 993                return;
 994        for (i = 0; i < nr_sought; i++)
 995                sha1_array_append(&ref, sought[i]->old_oid.hash);
 996        si->ref = &ref;
 997
 998        if (args->update_shallow) {
 999                /*
1000                 * remote is also shallow, .git/shallow may be updated
1001                 * so all refs can be accepted. Make sure we only add
1002                 * shallow roots that are actually reachable from new
1003                 * refs.
1004                 */
1005                struct sha1_array extra = SHA1_ARRAY_INIT;
1006                unsigned char (*sha1)[20] = si->shallow->sha1;
1007                assign_shallow_commits_to_refs(si, NULL, NULL);
1008                if (!si->nr_ours && !si->nr_theirs) {
1009                        sha1_array_clear(&ref);
1010                        return;
1011                }
1012                for (i = 0; i < si->nr_ours; i++)
1013                        sha1_array_append(&extra, sha1[si->ours[i]]);
1014                for (i = 0; i < si->nr_theirs; i++)
1015                        sha1_array_append(&extra, sha1[si->theirs[i]]);
1016                setup_alternate_shallow(&shallow_lock,
1017                                        &alternate_shallow_file,
1018                                        &extra);
1019                commit_lock_file(&shallow_lock);
1020                sha1_array_clear(&extra);
1021                sha1_array_clear(&ref);
1022                return;
1023        }
1024
1025        /*
1026         * remote is also shallow, check what ref is safe to update
1027         * without updating .git/shallow
1028         */
1029        status = xcalloc(nr_sought, sizeof(*status));
1030        assign_shallow_commits_to_refs(si, NULL, status);
1031        if (si->nr_ours || si->nr_theirs) {
1032                for (i = 0; i < nr_sought; i++)
1033                        if (status[i])
1034                                sought[i]->status = REF_STATUS_REJECT_SHALLOW;
1035        }
1036        free(status);
1037        sha1_array_clear(&ref);
1038}
1039
1040struct ref *fetch_pack(struct fetch_pack_args *args,
1041                       int fd[], struct child_process *conn,
1042                       const struct ref *ref,
1043                       const char *dest,
1044                       struct ref **sought, int nr_sought,
1045                       struct sha1_array *shallow,
1046                       char **pack_lockfile)
1047{
1048        struct ref *ref_cpy;
1049        struct shallow_info si;
1050
1051        fetch_pack_setup();
1052        if (nr_sought)
1053                nr_sought = remove_duplicates_in_refs(sought, nr_sought);
1054
1055        if (!ref) {
1056                packet_flush(fd[1]);
1057                die("no matching remote head");
1058        }
1059        prepare_shallow_info(&si, shallow);
1060        ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought,
1061                                &si, pack_lockfile);
1062        reprepare_packed_git();
1063        update_shallow(args, sought, nr_sought, &si);
1064        clear_shallow_info(&si);
1065        return ref_cpy;
1066}