builtin-fetch-pack.con commit http: clear POSTFIELDS when initializing a slot (1e41827)
   1#include "cache.h"
   2#include "refs.h"
   3#include "pkt-line.h"
   4#include "commit.h"
   5#include "tag.h"
   6#include "exec_cmd.h"
   7#include "pack.h"
   8#include "sideband.h"
   9#include "fetch-pack.h"
  10#include "remote.h"
  11#include "run-command.h"
  12
  13static int transfer_unpack_limit = -1;
  14static int fetch_unpack_limit = -1;
  15static int unpack_limit = 100;
  16static int prefer_ofs_delta = 1;
  17static struct fetch_pack_args args = {
  18        /* .uploadpack = */ "git-upload-pack",
  19};
  20
  21static const char fetch_pack_usage[] =
  22"git fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
  23
  24#define COMPLETE        (1U << 0)
  25#define COMMON          (1U << 1)
  26#define COMMON_REF      (1U << 2)
  27#define SEEN            (1U << 3)
  28#define POPPED          (1U << 4)
  29
  30static int marked;
  31
  32/*
  33 * After sending this many "have"s if we do not get any new ACK , we
  34 * give up traversing our history.
  35 */
  36#define MAX_IN_VAIN 256
  37
  38static struct commit_list *rev_list;
  39static int non_common_revs, multi_ack, use_sideband;
  40
  41static void rev_list_push(struct commit *commit, int mark)
  42{
  43        if (!(commit->object.flags & mark)) {
  44                commit->object.flags |= mark;
  45
  46                if (!(commit->object.parsed))
  47                        if (parse_commit(commit))
  48                                return;
  49
  50                insert_by_date(commit, &rev_list);
  51
  52                if (!(commit->object.flags & COMMON))
  53                        non_common_revs++;
  54        }
  55}
  56
  57static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
  58{
  59        struct object *o = deref_tag(parse_object(sha1), path, 0);
  60
  61        if (o && o->type == OBJ_COMMIT)
  62                rev_list_push((struct commit *)o, SEEN);
  63
  64        return 0;
  65}
  66
  67static int clear_marks(const char *path, const unsigned char *sha1, int flag, void *cb_data)
  68{
  69        struct object *o = deref_tag(parse_object(sha1), path, 0);
  70
  71        if (o && o->type == OBJ_COMMIT)
  72                clear_commit_marks((struct commit *)o,
  73                                   COMMON | COMMON_REF | SEEN | POPPED);
  74        return 0;
  75}
  76
  77/*
  78   This function marks a rev and its ancestors as common.
  79   In some cases, it is desirable to mark only the ancestors (for example
  80   when only the server does not yet know that they are common).
  81*/
  82
  83static void mark_common(struct commit *commit,
  84                int ancestors_only, int dont_parse)
  85{
  86        if (commit != NULL && !(commit->object.flags & COMMON)) {
  87                struct object *o = (struct object *)commit;
  88
  89                if (!ancestors_only)
  90                        o->flags |= COMMON;
  91
  92                if (!(o->flags & SEEN))
  93                        rev_list_push(commit, SEEN);
  94                else {
  95                        struct commit_list *parents;
  96
  97                        if (!ancestors_only && !(o->flags & POPPED))
  98                                non_common_revs--;
  99                        if (!o->parsed && !dont_parse)
 100                                if (parse_commit(commit))
 101                                        return;
 102
 103                        for (parents = commit->parents;
 104                                        parents;
 105                                        parents = parents->next)
 106                                mark_common(parents->item, 0, dont_parse);
 107                }
 108        }
 109}
 110
 111/*
 112  Get the next rev to send, ignoring the common.
 113*/
 114
 115static const unsigned char *get_rev(void)
 116{
 117        struct commit *commit = NULL;
 118
 119        while (commit == NULL) {
 120                unsigned int mark;
 121                struct commit_list *parents;
 122
 123                if (rev_list == NULL || non_common_revs == 0)
 124                        return NULL;
 125
 126                commit = rev_list->item;
 127                if (!commit->object.parsed)
 128                        parse_commit(commit);
 129                parents = commit->parents;
 130
 131                commit->object.flags |= POPPED;
 132                if (!(commit->object.flags & COMMON))
 133                        non_common_revs--;
 134
 135                if (commit->object.flags & COMMON) {
 136                        /* do not send "have", and ignore ancestors */
 137                        commit = NULL;
 138                        mark = COMMON | SEEN;
 139                } else if (commit->object.flags & COMMON_REF)
 140                        /* send "have", and ignore ancestors */
 141                        mark = COMMON | SEEN;
 142                else
 143                        /* send "have", also for its ancestors */
 144                        mark = SEEN;
 145
 146                while (parents) {
 147                        if (!(parents->item->object.flags & SEEN))
 148                                rev_list_push(parents->item, mark);
 149                        if (mark & COMMON)
 150                                mark_common(parents->item, 1, 0);
 151                        parents = parents->next;
 152                }
 153
 154                rev_list = rev_list->next;
 155        }
 156
 157        return commit->object.sha1;
 158}
 159
 160enum ack_type {
 161        NAK = 0,
 162        ACK,
 163        ACK_continue,
 164        ACK_common,
 165        ACK_ready
 166};
 167
 168static enum ack_type get_ack(int fd, unsigned char *result_sha1)
 169{
 170        static char line[1000];
 171        int len = packet_read_line(fd, line, sizeof(line));
 172
 173        if (!len)
 174                die("git fetch-pack: expected ACK/NAK, got EOF");
 175        if (line[len-1] == '\n')
 176                line[--len] = 0;
 177        if (!strcmp(line, "NAK"))
 178                return NAK;
 179        if (!prefixcmp(line, "ACK ")) {
 180                if (!get_sha1_hex(line+4, result_sha1)) {
 181                        if (strstr(line+45, "continue"))
 182                                return ACK_continue;
 183                        if (strstr(line+45, "common"))
 184                                return ACK_common;
 185                        if (strstr(line+45, "ready"))
 186                                return ACK_ready;
 187                        return ACK;
 188                }
 189        }
 190        die("git fetch_pack: expected ACK/NAK, got '%s'", line);
 191}
 192
 193static int find_common(int fd[2], unsigned char *result_sha1,
 194                       struct ref *refs)
 195{
 196        int fetching;
 197        int count = 0, flushes = 0, retval;
 198        const unsigned char *sha1;
 199        unsigned in_vain = 0;
 200        int got_continue = 0;
 201        struct strbuf req_buf = STRBUF_INIT;
 202
 203        if (marked)
 204                for_each_ref(clear_marks, NULL);
 205        marked = 1;
 206
 207        for_each_ref(rev_list_insert_ref, NULL);
 208
 209        fetching = 0;
 210        for ( ; refs ; refs = refs->next) {
 211                unsigned char *remote = refs->old_sha1;
 212                const char *remote_hex;
 213                struct object *o;
 214
 215                /*
 216                 * If that object is complete (i.e. it is an ancestor of a
 217                 * local ref), we tell them we have it but do not have to
 218                 * tell them about its ancestors, which they already know
 219                 * about.
 220                 *
 221                 * We use lookup_object here because we are only
 222                 * interested in the case we *know* the object is
 223                 * reachable and we have already scanned it.
 224                 */
 225                if (((o = lookup_object(remote)) != NULL) &&
 226                                (o->flags & COMPLETE)) {
 227                        continue;
 228                }
 229
 230                remote_hex = sha1_to_hex(remote);
 231                if (!fetching) {
 232                        struct strbuf c = STRBUF_INIT;
 233                        if (multi_ack == 2)     strbuf_addstr(&c, " multi_ack_detailed");
 234                        if (multi_ack == 1)     strbuf_addstr(&c, " multi_ack");
 235                        if (use_sideband == 2)  strbuf_addstr(&c, " side-band-64k");
 236                        if (use_sideband == 1)  strbuf_addstr(&c, " side-band");
 237                        if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
 238                        if (args.no_progress)   strbuf_addstr(&c, " no-progress");
 239                        if (args.include_tag)   strbuf_addstr(&c, " include-tag");
 240                        if (prefer_ofs_delta)   strbuf_addstr(&c, " ofs-delta");
 241                        packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
 242                        strbuf_release(&c);
 243                } else
 244                        packet_buf_write(&req_buf, "want %s\n", remote_hex);
 245                fetching++;
 246        }
 247
 248        if (!fetching) {
 249                strbuf_release(&req_buf);
 250                packet_flush(fd[1]);
 251                return 1;
 252        }
 253
 254        if (is_repository_shallow())
 255                write_shallow_commits(&req_buf, 1);
 256        if (args.depth > 0)
 257                packet_buf_write(&req_buf, "deepen %d", args.depth);
 258        packet_buf_flush(&req_buf);
 259
 260        safe_write(fd[1], req_buf.buf, req_buf.len);
 261
 262        if (args.depth > 0) {
 263                char line[1024];
 264                unsigned char sha1[20];
 265
 266                while (packet_read_line(fd[0], line, sizeof(line))) {
 267                        if (!prefixcmp(line, "shallow ")) {
 268                                if (get_sha1_hex(line + 8, sha1))
 269                                        die("invalid shallow line: %s", line);
 270                                register_shallow(sha1);
 271                                continue;
 272                        }
 273                        if (!prefixcmp(line, "unshallow ")) {
 274                                if (get_sha1_hex(line + 10, sha1))
 275                                        die("invalid unshallow line: %s", line);
 276                                if (!lookup_object(sha1))
 277                                        die("object not found: %s", line);
 278                                /* make sure that it is parsed as shallow */
 279                                if (!parse_object(sha1))
 280                                        die("error in object: %s", line);
 281                                if (unregister_shallow(sha1))
 282                                        die("no shallow found: %s", line);
 283                                continue;
 284                        }
 285                        die("expected shallow/unshallow, got %s", line);
 286                }
 287        }
 288
 289        flushes = 0;
 290        retval = -1;
 291        while ((sha1 = get_rev())) {
 292                packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
 293                if (args.verbose)
 294                        fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
 295                in_vain++;
 296                if (!(31 & ++count)) {
 297                        int ack;
 298
 299                        packet_flush(fd[1]);
 300                        flushes++;
 301
 302                        /*
 303                         * We keep one window "ahead" of the other side, and
 304                         * will wait for an ACK only on the next one
 305                         */
 306                        if (count == 32)
 307                                continue;
 308
 309                        do {
 310                                ack = get_ack(fd[0], result_sha1);
 311                                if (args.verbose && ack)
 312                                        fprintf(stderr, "got ack %d %s\n", ack,
 313                                                        sha1_to_hex(result_sha1));
 314                                switch (ack) {
 315                                case ACK:
 316                                        flushes = 0;
 317                                        multi_ack = 0;
 318                                        retval = 0;
 319                                        goto done;
 320                                case ACK_common:
 321                                case ACK_ready:
 322                                case ACK_continue: {
 323                                        struct commit *commit =
 324                                                lookup_commit(result_sha1);
 325                                        mark_common(commit, 0, 1);
 326                                        retval = 0;
 327                                        in_vain = 0;
 328                                        got_continue = 1;
 329                                        break;
 330                                        }
 331                                }
 332                        } while (ack);
 333                        flushes--;
 334                        if (got_continue && MAX_IN_VAIN < in_vain) {
 335                                if (args.verbose)
 336                                        fprintf(stderr, "giving up\n");
 337                                break; /* give up */
 338                        }
 339                }
 340        }
 341done:
 342        packet_write(fd[1], "done\n");
 343        if (args.verbose)
 344                fprintf(stderr, "done\n");
 345        if (retval != 0) {
 346                multi_ack = 0;
 347                flushes++;
 348        }
 349        strbuf_release(&req_buf);
 350
 351        while (flushes || multi_ack) {
 352                int ack = get_ack(fd[0], result_sha1);
 353                if (ack) {
 354                        if (args.verbose)
 355                                fprintf(stderr, "got ack (%d) %s\n", ack,
 356                                        sha1_to_hex(result_sha1));
 357                        if (ack == ACK)
 358                                return 0;
 359                        multi_ack = 1;
 360                        continue;
 361                }
 362                flushes--;
 363        }
 364        /* it is no error to fetch into a completely empty repo */
 365        return count ? retval : 0;
 366}
 367
 368static struct commit_list *complete;
 369
 370static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 371{
 372        struct object *o = parse_object(sha1);
 373
 374        while (o && o->type == OBJ_TAG) {
 375                struct tag *t = (struct tag *) o;
 376                if (!t->tagged)
 377                        break; /* broken repository */
 378                o->flags |= COMPLETE;
 379                o = parse_object(t->tagged->sha1);
 380        }
 381        if (o && o->type == OBJ_COMMIT) {
 382                struct commit *commit = (struct commit *)o;
 383                commit->object.flags |= COMPLETE;
 384                insert_by_date(commit, &complete);
 385        }
 386        return 0;
 387}
 388
 389static void mark_recent_complete_commits(unsigned long cutoff)
 390{
 391        while (complete && cutoff <= complete->item->date) {
 392                if (args.verbose)
 393                        fprintf(stderr, "Marking %s as complete\n",
 394                                sha1_to_hex(complete->item->object.sha1));
 395                pop_most_recent_commit(&complete, COMPLETE);
 396        }
 397}
 398
 399static void filter_refs(struct ref **refs, int nr_match, char **match)
 400{
 401        struct ref **return_refs;
 402        struct ref *newlist = NULL;
 403        struct ref **newtail = &newlist;
 404        struct ref *ref, *next;
 405        struct ref *fastarray[32];
 406
 407        if (nr_match && !args.fetch_all) {
 408                if (ARRAY_SIZE(fastarray) < nr_match)
 409                        return_refs = xcalloc(nr_match, sizeof(struct ref *));
 410                else {
 411                        return_refs = fastarray;
 412                        memset(return_refs, 0, sizeof(struct ref *) * nr_match);
 413                }
 414        }
 415        else
 416                return_refs = NULL;
 417
 418        for (ref = *refs; ref; ref = next) {
 419                next = ref->next;
 420                if (!memcmp(ref->name, "refs/", 5) &&
 421                    check_ref_format(ref->name + 5))
 422                        ; /* trash */
 423                else if (args.fetch_all &&
 424                         (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
 425                        *newtail = ref;
 426                        ref->next = NULL;
 427                        newtail = &ref->next;
 428                        continue;
 429                }
 430                else {
 431                        int order = path_match(ref->name, nr_match, match);
 432                        if (order) {
 433                                return_refs[order-1] = ref;
 434                                continue; /* we will link it later */
 435                        }
 436                }
 437                free(ref);
 438        }
 439
 440        if (!args.fetch_all) {
 441                int i;
 442                for (i = 0; i < nr_match; i++) {
 443                        ref = return_refs[i];
 444                        if (ref) {
 445                                *newtail = ref;
 446                                ref->next = NULL;
 447                                newtail = &ref->next;
 448                        }
 449                }
 450                if (return_refs != fastarray)
 451                        free(return_refs);
 452        }
 453        *refs = newlist;
 454}
 455
 456static int everything_local(struct ref **refs, int nr_match, char **match)
 457{
 458        struct ref *ref;
 459        int retval;
 460        unsigned long cutoff = 0;
 461
 462        save_commit_buffer = 0;
 463
 464        for (ref = *refs; ref; ref = ref->next) {
 465                struct object *o;
 466
 467                o = parse_object(ref->old_sha1);
 468                if (!o)
 469                        continue;
 470
 471                /* We already have it -- which may mean that we were
 472                 * in sync with the other side at some time after
 473                 * that (it is OK if we guess wrong here).
 474                 */
 475                if (o->type == OBJ_COMMIT) {
 476                        struct commit *commit = (struct commit *)o;
 477                        if (!cutoff || cutoff < commit->date)
 478                                cutoff = commit->date;
 479                }
 480        }
 481
 482        if (!args.depth) {
 483                for_each_ref(mark_complete, NULL);
 484                if (cutoff)
 485                        mark_recent_complete_commits(cutoff);
 486        }
 487
 488        /*
 489         * Mark all complete remote refs as common refs.
 490         * Don't mark them common yet; the server has to be told so first.
 491         */
 492        for (ref = *refs; ref; ref = ref->next) {
 493                struct object *o = deref_tag(lookup_object(ref->old_sha1),
 494                                             NULL, 0);
 495
 496                if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
 497                        continue;
 498
 499                if (!(o->flags & SEEN)) {
 500                        rev_list_push((struct commit *)o, COMMON_REF | SEEN);
 501
 502                        mark_common((struct commit *)o, 1, 1);
 503                }
 504        }
 505
 506        filter_refs(refs, nr_match, match);
 507
 508        for (retval = 1, ref = *refs; ref ; ref = ref->next) {
 509                const unsigned char *remote = ref->old_sha1;
 510                unsigned char local[20];
 511                struct object *o;
 512
 513                o = lookup_object(remote);
 514                if (!o || !(o->flags & COMPLETE)) {
 515                        retval = 0;
 516                        if (!args.verbose)
 517                                continue;
 518                        fprintf(stderr,
 519                                "want %s (%s)\n", sha1_to_hex(remote),
 520                                ref->name);
 521                        continue;
 522                }
 523
 524                hashcpy(ref->new_sha1, local);
 525                if (!args.verbose)
 526                        continue;
 527                fprintf(stderr,
 528                        "already have %s (%s)\n", sha1_to_hex(remote),
 529                        ref->name);
 530        }
 531        return retval;
 532}
 533
 534static int sideband_demux(int fd, void *data)
 535{
 536        int *xd = data;
 537
 538        int ret = recv_sideband("fetch-pack", xd[0], fd);
 539        close(fd);
 540        return ret;
 541}
 542
 543static int get_pack(int xd[2], char **pack_lockfile)
 544{
 545        struct async demux;
 546        const char *argv[20];
 547        char keep_arg[256];
 548        char hdr_arg[256];
 549        const char **av;
 550        int do_keep = args.keep_pack;
 551        struct child_process cmd;
 552
 553        memset(&demux, 0, sizeof(demux));
 554        if (use_sideband) {
 555                /* xd[] is talking with upload-pack; subprocess reads from
 556                 * xd[0], spits out band#2 to stderr, and feeds us band#1
 557                 * through demux->out.
 558                 */
 559                demux.proc = sideband_demux;
 560                demux.data = xd;
 561                if (start_async(&demux))
 562                        die("fetch-pack: unable to fork off sideband"
 563                            " demultiplexer");
 564        }
 565        else
 566                demux.out = xd[0];
 567
 568        memset(&cmd, 0, sizeof(cmd));
 569        cmd.argv = argv;
 570        av = argv;
 571        *hdr_arg = 0;
 572        if (!args.keep_pack && unpack_limit) {
 573                struct pack_header header;
 574
 575                if (read_pack_header(demux.out, &header))
 576                        die("protocol error: bad pack header");
 577                snprintf(hdr_arg, sizeof(hdr_arg),
 578                         "--pack_header=%"PRIu32",%"PRIu32,
 579                         ntohl(header.hdr_version), ntohl(header.hdr_entries));
 580                if (ntohl(header.hdr_entries) < unpack_limit)
 581                        do_keep = 0;
 582                else
 583                        do_keep = 1;
 584        }
 585
 586        if (do_keep) {
 587                if (pack_lockfile)
 588                        cmd.out = -1;
 589                *av++ = "index-pack";
 590                *av++ = "--stdin";
 591                if (!args.quiet && !args.no_progress)
 592                        *av++ = "-v";
 593                if (args.use_thin_pack)
 594                        *av++ = "--fix-thin";
 595                if (args.lock_pack || unpack_limit) {
 596                        int s = sprintf(keep_arg,
 597                                        "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
 598                        if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
 599                                strcpy(keep_arg + s, "localhost");
 600                        *av++ = keep_arg;
 601                }
 602        }
 603        else {
 604                *av++ = "unpack-objects";
 605                if (args.quiet)
 606                        *av++ = "-q";
 607        }
 608        if (*hdr_arg)
 609                *av++ = hdr_arg;
 610        *av++ = NULL;
 611
 612        cmd.in = demux.out;
 613        cmd.git_cmd = 1;
 614        if (start_command(&cmd))
 615                die("fetch-pack: unable to fork off %s", argv[0]);
 616        if (do_keep && pack_lockfile) {
 617                *pack_lockfile = index_pack_lockfile(cmd.out);
 618                close(cmd.out);
 619        }
 620
 621        if (finish_command(&cmd))
 622                die("%s failed", argv[0]);
 623        if (use_sideband && finish_async(&demux))
 624                die("error in sideband demultiplexer");
 625        return 0;
 626}
 627
 628static struct ref *do_fetch_pack(int fd[2],
 629                const struct ref *orig_ref,
 630                int nr_match,
 631                char **match,
 632                char **pack_lockfile)
 633{
 634        struct ref *ref = copy_ref_list(orig_ref);
 635        unsigned char sha1[20];
 636
 637        if (is_repository_shallow() && !server_supports("shallow"))
 638                die("Server does not support shallow clients");
 639        if (server_supports("multi_ack_detailed")) {
 640                if (args.verbose)
 641                        fprintf(stderr, "Server supports multi_ack_detailed\n");
 642                multi_ack = 2;
 643        }
 644        else if (server_supports("multi_ack")) {
 645                if (args.verbose)
 646                        fprintf(stderr, "Server supports multi_ack\n");
 647                multi_ack = 1;
 648        }
 649        if (server_supports("side-band-64k")) {
 650                if (args.verbose)
 651                        fprintf(stderr, "Server supports side-band-64k\n");
 652                use_sideband = 2;
 653        }
 654        else if (server_supports("side-band")) {
 655                if (args.verbose)
 656                        fprintf(stderr, "Server supports side-band\n");
 657                use_sideband = 1;
 658        }
 659        if (server_supports("ofs-delta")) {
 660                if (args.verbose)
 661                        fprintf(stderr, "Server supports ofs-delta\n");
 662        } else
 663                prefer_ofs_delta = 0;
 664        if (everything_local(&ref, nr_match, match)) {
 665                packet_flush(fd[1]);
 666                goto all_done;
 667        }
 668        if (find_common(fd, sha1, ref) < 0)
 669                if (!args.keep_pack)
 670                        /* When cloning, it is not unusual to have
 671                         * no common commit.
 672                         */
 673                        warning("no common commits");
 674
 675        if (get_pack(fd, pack_lockfile))
 676                die("git fetch-pack: fetch failed.");
 677
 678 all_done:
 679        return ref;
 680}
 681
 682static int remove_duplicates(int nr_heads, char **heads)
 683{
 684        int src, dst;
 685
 686        for (src = dst = 0; src < nr_heads; src++) {
 687                /* If heads[src] is different from any of
 688                 * heads[0..dst], push it in.
 689                 */
 690                int i;
 691                for (i = 0; i < dst; i++) {
 692                        if (!strcmp(heads[i], heads[src]))
 693                                break;
 694                }
 695                if (i < dst)
 696                        continue;
 697                if (src != dst)
 698                        heads[dst] = heads[src];
 699                dst++;
 700        }
 701        return dst;
 702}
 703
 704static int fetch_pack_config(const char *var, const char *value, void *cb)
 705{
 706        if (strcmp(var, "fetch.unpacklimit") == 0) {
 707                fetch_unpack_limit = git_config_int(var, value);
 708                return 0;
 709        }
 710
 711        if (strcmp(var, "transfer.unpacklimit") == 0) {
 712                transfer_unpack_limit = git_config_int(var, value);
 713                return 0;
 714        }
 715
 716        if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
 717                prefer_ofs_delta = git_config_bool(var, value);
 718                return 0;
 719        }
 720
 721        return git_default_config(var, value, cb);
 722}
 723
 724static struct lock_file lock;
 725
 726static void fetch_pack_setup(void)
 727{
 728        static int did_setup;
 729        if (did_setup)
 730                return;
 731        git_config(fetch_pack_config, NULL);
 732        if (0 <= transfer_unpack_limit)
 733                unpack_limit = transfer_unpack_limit;
 734        else if (0 <= fetch_unpack_limit)
 735                unpack_limit = fetch_unpack_limit;
 736        did_setup = 1;
 737}
 738
 739int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
 740{
 741        int i, ret, nr_heads;
 742        struct ref *ref = NULL;
 743        char *dest = NULL, **heads;
 744        int fd[2];
 745        struct child_process *conn;
 746
 747        nr_heads = 0;
 748        heads = NULL;
 749        for (i = 1; i < argc; i++) {
 750                const char *arg = argv[i];
 751
 752                if (*arg == '-') {
 753                        if (!prefixcmp(arg, "--upload-pack=")) {
 754                                args.uploadpack = arg + 14;
 755                                continue;
 756                        }
 757                        if (!prefixcmp(arg, "--exec=")) {
 758                                args.uploadpack = arg + 7;
 759                                continue;
 760                        }
 761                        if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
 762                                args.quiet = 1;
 763                                continue;
 764                        }
 765                        if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
 766                                args.lock_pack = args.keep_pack;
 767                                args.keep_pack = 1;
 768                                continue;
 769                        }
 770                        if (!strcmp("--thin", arg)) {
 771                                args.use_thin_pack = 1;
 772                                continue;
 773                        }
 774                        if (!strcmp("--include-tag", arg)) {
 775                                args.include_tag = 1;
 776                                continue;
 777                        }
 778                        if (!strcmp("--all", arg)) {
 779                                args.fetch_all = 1;
 780                                continue;
 781                        }
 782                        if (!strcmp("-v", arg)) {
 783                                args.verbose = 1;
 784                                continue;
 785                        }
 786                        if (!prefixcmp(arg, "--depth=")) {
 787                                args.depth = strtol(arg + 8, NULL, 0);
 788                                continue;
 789                        }
 790                        if (!strcmp("--no-progress", arg)) {
 791                                args.no_progress = 1;
 792                                continue;
 793                        }
 794                        usage(fetch_pack_usage);
 795                }
 796                dest = (char *)arg;
 797                heads = (char **)(argv + i + 1);
 798                nr_heads = argc - i - 1;
 799                break;
 800        }
 801        if (!dest)
 802                usage(fetch_pack_usage);
 803
 804        conn = git_connect(fd, (char *)dest, args.uploadpack,
 805                           args.verbose ? CONNECT_VERBOSE : 0);
 806        if (conn) {
 807                get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
 808
 809                ref = fetch_pack(&args, fd, conn, ref, dest, nr_heads, heads, NULL);
 810                close(fd[0]);
 811                close(fd[1]);
 812                if (finish_connect(conn))
 813                        ref = NULL;
 814        } else {
 815                ref = NULL;
 816        }
 817        ret = !ref;
 818
 819        if (!ret && nr_heads) {
 820                /* If the heads to pull were given, we should have
 821                 * consumed all of them by matching the remote.
 822                 * Otherwise, 'git fetch remote no-such-ref' would
 823                 * silently succeed without issuing an error.
 824                 */
 825                for (i = 0; i < nr_heads; i++)
 826                        if (heads[i] && heads[i][0]) {
 827                                error("no such remote ref %s", heads[i]);
 828                                ret = 1;
 829                        }
 830        }
 831        while (ref) {
 832                printf("%s %s\n",
 833                       sha1_to_hex(ref->old_sha1), ref->name);
 834                ref = ref->next;
 835        }
 836
 837        return ret;
 838}
 839
 840struct ref *fetch_pack(struct fetch_pack_args *my_args,
 841                       int fd[], struct child_process *conn,
 842                       const struct ref *ref,
 843                const char *dest,
 844                int nr_heads,
 845                char **heads,
 846                char **pack_lockfile)
 847{
 848        struct stat st;
 849        struct ref *ref_cpy;
 850
 851        fetch_pack_setup();
 852        if (&args != my_args)
 853                memcpy(&args, my_args, sizeof(args));
 854        if (args.depth > 0) {
 855                if (stat(git_path("shallow"), &st))
 856                        st.st_mtime = 0;
 857        }
 858
 859        if (heads && nr_heads)
 860                nr_heads = remove_duplicates(nr_heads, heads);
 861        if (!ref) {
 862                packet_flush(fd[1]);
 863                die("no matching remote head");
 864        }
 865        ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
 866
 867        if (args.depth > 0) {
 868                struct cache_time mtime;
 869                struct strbuf sb = STRBUF_INIT;
 870                char *shallow = git_path("shallow");
 871                int fd;
 872
 873                mtime.sec = st.st_mtime;
 874                mtime.nsec = ST_MTIME_NSEC(st);
 875                if (stat(shallow, &st)) {
 876                        if (mtime.sec)
 877                                die("shallow file was removed during fetch");
 878                } else if (st.st_mtime != mtime.sec
 879#ifdef USE_NSEC
 880                                || ST_MTIME_NSEC(st) != mtime.nsec
 881#endif
 882                          )
 883                        die("shallow file was changed during fetch");
 884
 885                fd = hold_lock_file_for_update(&lock, shallow,
 886                                               LOCK_DIE_ON_ERROR);
 887                if (!write_shallow_commits(&sb, 0)
 888                 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
 889                        unlink_or_warn(shallow);
 890                        rollback_lock_file(&lock);
 891                } else {
 892                        commit_lock_file(&lock);
 893                }
 894                strbuf_release(&sb);
 895        }
 896
 897        reprepare_packed_git();
 898        return ref_cpy;
 899}