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