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