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