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