fetch-pack.con commit sha1_file: avoid comparison if no packed hash matches the first byte (6355a76)
   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                                                 * Reset in_vain because an ack
 433                                                 * for this commit has not been
 434                                                 * seen.
 435                                                 */
 436                                                in_vain = 0;
 437                                        } else if (!args->stateless_rpc
 438                                                   || ack != ACK_common)
 439                                                in_vain = 0;
 440                                        mark_common(commit, 0, 1);
 441                                        retval = 0;
 442                                        got_continue = 1;
 443                                        if (ack == ACK_ready) {
 444                                                clear_prio_queue(&rev_list);
 445                                                got_ready = 1;
 446                                        }
 447                                        break;
 448                                        }
 449                                }
 450                        } while (ack);
 451                        flushes--;
 452                        if (got_continue && MAX_IN_VAIN < in_vain) {
 453                                if (args->verbose)
 454                                        fprintf(stderr, "giving up\n");
 455                                break; /* give up */
 456                        }
 457                }
 458        }
 459done:
 460        if (!got_ready || !no_done) {
 461                packet_buf_write(&req_buf, "done\n");
 462                send_request(args, fd[1], &req_buf);
 463        }
 464        if (args->verbose)
 465                fprintf(stderr, "done\n");
 466        if (retval != 0) {
 467                multi_ack = 0;
 468                flushes++;
 469        }
 470        strbuf_release(&req_buf);
 471
 472        if (!got_ready || !no_done)
 473                consume_shallow_list(args, fd[0]);
 474        while (flushes || multi_ack) {
 475                int ack = get_ack(fd[0], result_sha1);
 476                if (ack) {
 477                        if (args->verbose)
 478                                fprintf(stderr, "got ack (%d) %s\n", ack,
 479                                        sha1_to_hex(result_sha1));
 480                        if (ack == ACK)
 481                                return 0;
 482                        multi_ack = 1;
 483                        continue;
 484                }
 485                flushes--;
 486        }
 487        /* it is no error to fetch into a completely empty repo */
 488        return count ? retval : 0;
 489}
 490
 491static struct commit_list *complete;
 492
 493static int mark_complete(const unsigned char *sha1)
 494{
 495        struct object *o = parse_object(sha1);
 496
 497        while (o && o->type == OBJ_TAG) {
 498                struct tag *t = (struct tag *) o;
 499                if (!t->tagged)
 500                        break; /* broken repository */
 501                o->flags |= COMPLETE;
 502                o = parse_object(t->tagged->oid.hash);
 503        }
 504        if (o && o->type == OBJ_COMMIT) {
 505                struct commit *commit = (struct commit *)o;
 506                if (!(commit->object.flags & COMPLETE)) {
 507                        commit->object.flags |= COMPLETE;
 508                        commit_list_insert(commit, &complete);
 509                }
 510        }
 511        return 0;
 512}
 513
 514static int mark_complete_oid(const char *refname, const struct object_id *oid,
 515                             int flag, void *cb_data)
 516{
 517        return mark_complete(oid->hash);
 518}
 519
 520static void mark_recent_complete_commits(struct fetch_pack_args *args,
 521                                         unsigned long cutoff)
 522{
 523        while (complete && cutoff <= complete->item->date) {
 524                if (args->verbose)
 525                        fprintf(stderr, "Marking %s as complete\n",
 526                                oid_to_hex(&complete->item->object.oid));
 527                pop_most_recent_commit(&complete, COMPLETE);
 528        }
 529}
 530
 531static void filter_refs(struct fetch_pack_args *args,
 532                        struct ref **refs,
 533                        struct ref **sought, int nr_sought)
 534{
 535        struct ref *newlist = NULL;
 536        struct ref **newtail = &newlist;
 537        struct ref *ref, *next;
 538        int i;
 539
 540        i = 0;
 541        for (ref = *refs; ref; ref = next) {
 542                int keep = 0;
 543                next = ref->next;
 544
 545                if (starts_with(ref->name, "refs/") &&
 546                    check_refname_format(ref->name, 0))
 547                        ; /* trash */
 548                else {
 549                        while (i < nr_sought) {
 550                                int cmp = strcmp(ref->name, sought[i]->name);
 551                                if (cmp < 0)
 552                                        break; /* definitely do not have it */
 553                                else if (cmp == 0) {
 554                                        keep = 1; /* definitely have it */
 555                                        sought[i]->matched = 1;
 556                                }
 557                                i++;
 558                        }
 559                }
 560
 561                if (!keep && args->fetch_all &&
 562                    (!args->depth || !starts_with(ref->name, "refs/tags/")))
 563                        keep = 1;
 564
 565                if (keep) {
 566                        *newtail = ref;
 567                        ref->next = NULL;
 568                        newtail = &ref->next;
 569                } else {
 570                        free(ref);
 571                }
 572        }
 573
 574        /* Append unmatched requests to the list */
 575        if ((allow_unadvertised_object_request &
 576            (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1))) {
 577                for (i = 0; i < nr_sought; i++) {
 578                        unsigned char sha1[20];
 579
 580                        ref = sought[i];
 581                        if (ref->matched)
 582                                continue;
 583                        if (get_sha1_hex(ref->name, sha1) ||
 584                            ref->name[40] != '\0' ||
 585                            hashcmp(sha1, ref->old_oid.hash))
 586                                continue;
 587
 588                        ref->matched = 1;
 589                        *newtail = copy_ref(ref);
 590                        newtail = &(*newtail)->next;
 591                }
 592        }
 593        *refs = newlist;
 594}
 595
 596static void mark_alternate_complete(const struct ref *ref, void *unused)
 597{
 598        mark_complete(ref->old_oid.hash);
 599}
 600
 601static int everything_local(struct fetch_pack_args *args,
 602                            struct ref **refs,
 603                            struct ref **sought, int nr_sought)
 604{
 605        struct ref *ref;
 606        int retval;
 607        unsigned long cutoff = 0;
 608
 609        save_commit_buffer = 0;
 610
 611        for (ref = *refs; ref; ref = ref->next) {
 612                struct object *o;
 613
 614                if (!has_object_file(&ref->old_oid))
 615                        continue;
 616
 617                o = parse_object(ref->old_oid.hash);
 618                if (!o)
 619                        continue;
 620
 621                /* We already have it -- which may mean that we were
 622                 * in sync with the other side at some time after
 623                 * that (it is OK if we guess wrong here).
 624                 */
 625                if (o->type == OBJ_COMMIT) {
 626                        struct commit *commit = (struct commit *)o;
 627                        if (!cutoff || cutoff < commit->date)
 628                                cutoff = commit->date;
 629                }
 630        }
 631
 632        if (!args->depth) {
 633                for_each_ref(mark_complete_oid, NULL);
 634                for_each_alternate_ref(mark_alternate_complete, NULL);
 635                commit_list_sort_by_date(&complete);
 636                if (cutoff)
 637                        mark_recent_complete_commits(args, cutoff);
 638        }
 639
 640        /*
 641         * Mark all complete remote refs as common refs.
 642         * Don't mark them common yet; the server has to be told so first.
 643         */
 644        for (ref = *refs; ref; ref = ref->next) {
 645                struct object *o = deref_tag(lookup_object(ref->old_oid.hash),
 646                                             NULL, 0);
 647
 648                if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
 649                        continue;
 650
 651                if (!(o->flags & SEEN)) {
 652                        rev_list_push((struct commit *)o, COMMON_REF | SEEN);
 653
 654                        mark_common((struct commit *)o, 1, 1);
 655                }
 656        }
 657
 658        filter_refs(args, refs, sought, nr_sought);
 659
 660        for (retval = 1, ref = *refs; ref ; ref = ref->next) {
 661                const unsigned char *remote = ref->old_oid.hash;
 662                struct object *o;
 663
 664                o = lookup_object(remote);
 665                if (!o || !(o->flags & COMPLETE)) {
 666                        retval = 0;
 667                        if (!args->verbose)
 668                                continue;
 669                        fprintf(stderr,
 670                                "want %s (%s)\n", sha1_to_hex(remote),
 671                                ref->name);
 672                        continue;
 673                }
 674                if (!args->verbose)
 675                        continue;
 676                fprintf(stderr,
 677                        "already have %s (%s)\n", sha1_to_hex(remote),
 678                        ref->name);
 679        }
 680        return retval;
 681}
 682
 683static int sideband_demux(int in, int out, void *data)
 684{
 685        int *xd = data;
 686        int ret;
 687
 688        ret = recv_sideband("fetch-pack", xd[0], out);
 689        close(out);
 690        return ret;
 691}
 692
 693static int get_pack(struct fetch_pack_args *args,
 694                    int xd[2], char **pack_lockfile)
 695{
 696        struct async demux;
 697        int do_keep = args->keep_pack;
 698        const char *cmd_name;
 699        struct pack_header header;
 700        int pass_header = 0;
 701        struct child_process cmd = CHILD_PROCESS_INIT;
 702        int ret;
 703
 704        memset(&demux, 0, sizeof(demux));
 705        if (use_sideband) {
 706                /* xd[] is talking with upload-pack; subprocess reads from
 707                 * xd[0], spits out band#2 to stderr, and feeds us band#1
 708                 * through demux->out.
 709                 */
 710                demux.proc = sideband_demux;
 711                demux.data = xd;
 712                demux.out = -1;
 713                demux.isolate_sigpipe = 1;
 714                if (start_async(&demux))
 715                        die("fetch-pack: unable to fork off sideband"
 716                            " demultiplexer");
 717        }
 718        else
 719                demux.out = xd[0];
 720
 721        if (!args->keep_pack && unpack_limit) {
 722
 723                if (read_pack_header(demux.out, &header))
 724                        die("protocol error: bad pack header");
 725                pass_header = 1;
 726                if (ntohl(header.hdr_entries) < unpack_limit)
 727                        do_keep = 0;
 728                else
 729                        do_keep = 1;
 730        }
 731
 732        if (alternate_shallow_file) {
 733                argv_array_push(&cmd.args, "--shallow-file");
 734                argv_array_push(&cmd.args, alternate_shallow_file);
 735        }
 736
 737        if (do_keep) {
 738                if (pack_lockfile)
 739                        cmd.out = -1;
 740                cmd_name = "index-pack";
 741                argv_array_push(&cmd.args, cmd_name);
 742                argv_array_push(&cmd.args, "--stdin");
 743                if (!args->quiet && !args->no_progress)
 744                        argv_array_push(&cmd.args, "-v");
 745                if (args->use_thin_pack)
 746                        argv_array_push(&cmd.args, "--fix-thin");
 747                if (args->lock_pack || unpack_limit) {
 748                        char hostname[256];
 749                        if (gethostname(hostname, sizeof(hostname)))
 750                                xsnprintf(hostname, sizeof(hostname), "localhost");
 751                        argv_array_pushf(&cmd.args,
 752                                        "--keep=fetch-pack %"PRIuMAX " on %s",
 753                                        (uintmax_t)getpid(), hostname);
 754                }
 755                if (args->check_self_contained_and_connected)
 756                        argv_array_push(&cmd.args, "--check-self-contained-and-connected");
 757        }
 758        else {
 759                cmd_name = "unpack-objects";
 760                argv_array_push(&cmd.args, cmd_name);
 761                if (args->quiet || args->no_progress)
 762                        argv_array_push(&cmd.args, "-q");
 763                args->check_self_contained_and_connected = 0;
 764        }
 765
 766        if (pass_header)
 767                argv_array_pushf(&cmd.args, "--pack_header=%"PRIu32",%"PRIu32,
 768                                 ntohl(header.hdr_version),
 769                                 ntohl(header.hdr_entries));
 770        if (fetch_fsck_objects >= 0
 771            ? fetch_fsck_objects
 772            : transfer_fsck_objects >= 0
 773            ? transfer_fsck_objects
 774            : 0)
 775                argv_array_push(&cmd.args, "--strict");
 776
 777        cmd.in = demux.out;
 778        cmd.git_cmd = 1;
 779        if (start_command(&cmd))
 780                die("fetch-pack: unable to fork off %s", cmd_name);
 781        if (do_keep && pack_lockfile) {
 782                *pack_lockfile = index_pack_lockfile(cmd.out);
 783                close(cmd.out);
 784        }
 785
 786        if (!use_sideband)
 787                /* Closed by start_command() */
 788                xd[0] = -1;
 789
 790        ret = finish_command(&cmd);
 791        if (!ret || (args->check_self_contained_and_connected && ret == 1))
 792                args->self_contained_and_connected =
 793                        args->check_self_contained_and_connected &&
 794                        ret == 0;
 795        else
 796                die("%s failed", cmd_name);
 797        if (use_sideband && finish_async(&demux))
 798                die("error in sideband demultiplexer");
 799        return 0;
 800}
 801
 802static int cmp_ref_by_name(const void *a_, const void *b_)
 803{
 804        const struct ref *a = *((const struct ref **)a_);
 805        const struct ref *b = *((const struct ref **)b_);
 806        return strcmp(a->name, b->name);
 807}
 808
 809static struct ref *do_fetch_pack(struct fetch_pack_args *args,
 810                                 int fd[2],
 811                                 const struct ref *orig_ref,
 812                                 struct ref **sought, int nr_sought,
 813                                 struct shallow_info *si,
 814                                 char **pack_lockfile)
 815{
 816        struct ref *ref = copy_ref_list(orig_ref);
 817        unsigned char sha1[20];
 818        const char *agent_feature;
 819        int agent_len;
 820
 821        sort_ref_list(&ref, ref_compare_name);
 822        qsort(sought, nr_sought, sizeof(*sought), cmp_ref_by_name);
 823
 824        if ((args->depth > 0 || is_repository_shallow()) && !server_supports("shallow"))
 825                die("Server does not support shallow clients");
 826        if (server_supports("multi_ack_detailed")) {
 827                if (args->verbose)
 828                        fprintf(stderr, "Server supports multi_ack_detailed\n");
 829                multi_ack = 2;
 830                if (server_supports("no-done")) {
 831                        if (args->verbose)
 832                                fprintf(stderr, "Server supports no-done\n");
 833                        if (args->stateless_rpc)
 834                                no_done = 1;
 835                }
 836        }
 837        else if (server_supports("multi_ack")) {
 838                if (args->verbose)
 839                        fprintf(stderr, "Server supports multi_ack\n");
 840                multi_ack = 1;
 841        }
 842        if (server_supports("side-band-64k")) {
 843                if (args->verbose)
 844                        fprintf(stderr, "Server supports side-band-64k\n");
 845                use_sideband = 2;
 846        }
 847        else if (server_supports("side-band")) {
 848                if (args->verbose)
 849                        fprintf(stderr, "Server supports side-band\n");
 850                use_sideband = 1;
 851        }
 852        if (server_supports("allow-tip-sha1-in-want")) {
 853                if (args->verbose)
 854                        fprintf(stderr, "Server supports allow-tip-sha1-in-want\n");
 855                allow_unadvertised_object_request |= ALLOW_TIP_SHA1;
 856        }
 857        if (server_supports("allow-reachable-sha1-in-want")) {
 858                if (args->verbose)
 859                        fprintf(stderr, "Server supports allow-reachable-sha1-in-want\n");
 860                allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1;
 861        }
 862        if (!server_supports("thin-pack"))
 863                args->use_thin_pack = 0;
 864        if (!server_supports("no-progress"))
 865                args->no_progress = 0;
 866        if (!server_supports("include-tag"))
 867                args->include_tag = 0;
 868        if (server_supports("ofs-delta")) {
 869                if (args->verbose)
 870                        fprintf(stderr, "Server supports ofs-delta\n");
 871        } else
 872                prefer_ofs_delta = 0;
 873
 874        if ((agent_feature = server_feature_value("agent", &agent_len))) {
 875                agent_supported = 1;
 876                if (args->verbose && agent_len)
 877                        fprintf(stderr, "Server version is %.*s\n",
 878                                agent_len, agent_feature);
 879        }
 880
 881        if (everything_local(args, &ref, sought, nr_sought)) {
 882                packet_flush(fd[1]);
 883                goto all_done;
 884        }
 885        if (find_common(args, fd, sha1, ref) < 0)
 886                if (!args->keep_pack)
 887                        /* When cloning, it is not unusual to have
 888                         * no common commit.
 889                         */
 890                        warning("no common commits");
 891
 892        if (args->stateless_rpc)
 893                packet_flush(fd[1]);
 894        if (args->depth > 0)
 895                setup_alternate_shallow(&shallow_lock, &alternate_shallow_file,
 896                                        NULL);
 897        else if (si->nr_ours || si->nr_theirs)
 898                alternate_shallow_file = setup_temporary_shallow(si->shallow);
 899        else
 900                alternate_shallow_file = NULL;
 901        if (get_pack(args, fd, pack_lockfile))
 902                die("git fetch-pack: fetch failed.");
 903
 904 all_done:
 905        return ref;
 906}
 907
 908static void fetch_pack_config(void)
 909{
 910        git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit);
 911        git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit);
 912        git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta);
 913        git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects);
 914        git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects);
 915
 916        git_config(git_default_config, NULL);
 917}
 918
 919static void fetch_pack_setup(void)
 920{
 921        static int did_setup;
 922        if (did_setup)
 923                return;
 924        fetch_pack_config();
 925        if (0 <= transfer_unpack_limit)
 926                unpack_limit = transfer_unpack_limit;
 927        else if (0 <= fetch_unpack_limit)
 928                unpack_limit = fetch_unpack_limit;
 929        did_setup = 1;
 930}
 931
 932static int remove_duplicates_in_refs(struct ref **ref, int nr)
 933{
 934        struct string_list names = STRING_LIST_INIT_NODUP;
 935        int src, dst;
 936
 937        for (src = dst = 0; src < nr; src++) {
 938                struct string_list_item *item;
 939                item = string_list_insert(&names, ref[src]->name);
 940                if (item->util)
 941                        continue; /* already have it */
 942                item->util = ref[src];
 943                if (src != dst)
 944                        ref[dst] = ref[src];
 945                dst++;
 946        }
 947        for (src = dst; src < nr; src++)
 948                ref[src] = NULL;
 949        string_list_clear(&names, 0);
 950        return dst;
 951}
 952
 953static void update_shallow(struct fetch_pack_args *args,
 954                           struct ref **sought, int nr_sought,
 955                           struct shallow_info *si)
 956{
 957        struct sha1_array ref = SHA1_ARRAY_INIT;
 958        int *status;
 959        int i;
 960
 961        if (args->depth > 0 && alternate_shallow_file) {
 962                if (*alternate_shallow_file == '\0') { /* --unshallow */
 963                        unlink_or_warn(git_path_shallow());
 964                        rollback_lock_file(&shallow_lock);
 965                } else
 966                        commit_lock_file(&shallow_lock);
 967                return;
 968        }
 969
 970        if (!si->shallow || !si->shallow->nr)
 971                return;
 972
 973        if (args->cloning) {
 974                /*
 975                 * remote is shallow, but this is a clone, there are
 976                 * no objects in repo to worry about. Accept any
 977                 * shallow points that exist in the pack (iow in repo
 978                 * after get_pack() and reprepare_packed_git())
 979                 */
 980                struct sha1_array extra = SHA1_ARRAY_INIT;
 981                unsigned char (*sha1)[20] = si->shallow->sha1;
 982                for (i = 0; i < si->shallow->nr; i++)
 983                        if (has_sha1_file(sha1[i]))
 984                                sha1_array_append(&extra, sha1[i]);
 985                if (extra.nr) {
 986                        setup_alternate_shallow(&shallow_lock,
 987                                                &alternate_shallow_file,
 988                                                &extra);
 989                        commit_lock_file(&shallow_lock);
 990                }
 991                sha1_array_clear(&extra);
 992                return;
 993        }
 994
 995        if (!si->nr_ours && !si->nr_theirs)
 996                return;
 997
 998        remove_nonexistent_theirs_shallow(si);
 999        if (!si->nr_ours && !si->nr_theirs)
1000                return;
1001        for (i = 0; i < nr_sought; i++)
1002                sha1_array_append(&ref, sought[i]->old_oid.hash);
1003        si->ref = &ref;
1004
1005        if (args->update_shallow) {
1006                /*
1007                 * remote is also shallow, .git/shallow may be updated
1008                 * so all refs can be accepted. Make sure we only add
1009                 * shallow roots that are actually reachable from new
1010                 * refs.
1011                 */
1012                struct sha1_array extra = SHA1_ARRAY_INIT;
1013                unsigned char (*sha1)[20] = si->shallow->sha1;
1014                assign_shallow_commits_to_refs(si, NULL, NULL);
1015                if (!si->nr_ours && !si->nr_theirs) {
1016                        sha1_array_clear(&ref);
1017                        return;
1018                }
1019                for (i = 0; i < si->nr_ours; i++)
1020                        sha1_array_append(&extra, sha1[si->ours[i]]);
1021                for (i = 0; i < si->nr_theirs; i++)
1022                        sha1_array_append(&extra, sha1[si->theirs[i]]);
1023                setup_alternate_shallow(&shallow_lock,
1024                                        &alternate_shallow_file,
1025                                        &extra);
1026                commit_lock_file(&shallow_lock);
1027                sha1_array_clear(&extra);
1028                sha1_array_clear(&ref);
1029                return;
1030        }
1031
1032        /*
1033         * remote is also shallow, check what ref is safe to update
1034         * without updating .git/shallow
1035         */
1036        status = xcalloc(nr_sought, sizeof(*status));
1037        assign_shallow_commits_to_refs(si, NULL, status);
1038        if (si->nr_ours || si->nr_theirs) {
1039                for (i = 0; i < nr_sought; i++)
1040                        if (status[i])
1041                                sought[i]->status = REF_STATUS_REJECT_SHALLOW;
1042        }
1043        free(status);
1044        sha1_array_clear(&ref);
1045}
1046
1047struct ref *fetch_pack(struct fetch_pack_args *args,
1048                       int fd[], struct child_process *conn,
1049                       const struct ref *ref,
1050                       const char *dest,
1051                       struct ref **sought, int nr_sought,
1052                       struct sha1_array *shallow,
1053                       char **pack_lockfile)
1054{
1055        struct ref *ref_cpy;
1056        struct shallow_info si;
1057
1058        fetch_pack_setup();
1059        if (nr_sought)
1060                nr_sought = remove_duplicates_in_refs(sought, nr_sought);
1061
1062        if (!ref) {
1063                packet_flush(fd[1]);
1064                die("no matching remote head");
1065        }
1066        prepare_shallow_info(&si, shallow);
1067        ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought,
1068                                &si, pack_lockfile);
1069        reprepare_packed_git();
1070        update_shallow(args, sought, nr_sought, &si);
1071        clear_shallow_info(&si);
1072        return ref_cpy;
1073}