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