builtin / fetch-pack.con commit fetch-pack: avoid repeatedly re-scanning pack directory (b495697)
   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 void filter_refs(struct ref **refs, int nr_match, char **match)
 529{
 530        struct ref **return_refs;
 531        struct ref *newlist = NULL;
 532        struct ref **newtail = &newlist;
 533        struct ref *ref, *next;
 534        struct ref *fastarray[32];
 535        int match_pos;
 536
 537        if (nr_match && !args.fetch_all) {
 538                if (ARRAY_SIZE(fastarray) < nr_match)
 539                        return_refs = xcalloc(nr_match, sizeof(struct ref *));
 540                else {
 541                        return_refs = fastarray;
 542                        memset(return_refs, 0, sizeof(struct ref *) * nr_match);
 543                }
 544        }
 545        else
 546                return_refs = NULL;
 547
 548        match_pos = 0;
 549        for (ref = *refs; ref; ref = next) {
 550                next = ref->next;
 551                if (!memcmp(ref->name, "refs/", 5) &&
 552                    check_refname_format(ref->name + 5, 0))
 553                        ; /* trash */
 554                else if (args.fetch_all &&
 555                         (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
 556                        *newtail = ref;
 557                        ref->next = NULL;
 558                        newtail = &ref->next;
 559                        continue;
 560                }
 561                else {
 562                        int cmp = -1;
 563                        while (match_pos < nr_match) {
 564                                cmp = strcmp(ref->name, match[match_pos]);
 565                                if (cmp < 0) /* definitely do not have it */
 566                                        break;
 567                                else if (cmp == 0) { /* definitely have it */
 568                                        match[match_pos][0] = '\0';
 569                                        return_refs[match_pos] = ref;
 570                                        break;
 571                                }
 572                                else /* might have it; keep looking */
 573                                        match_pos++;
 574                        }
 575                        if (!cmp)
 576                                continue; /* we will link it later */
 577                }
 578                free(ref);
 579        }
 580
 581        if (!args.fetch_all) {
 582                int i;
 583                for (i = 0; i < nr_match; i++) {
 584                        ref = return_refs[i];
 585                        if (ref) {
 586                                *newtail = ref;
 587                                ref->next = NULL;
 588                                newtail = &ref->next;
 589                        }
 590                }
 591                if (return_refs != fastarray)
 592                        free(return_refs);
 593        }
 594        *refs = newlist;
 595}
 596
 597static void mark_alternate_complete(const struct ref *ref, void *unused)
 598{
 599        mark_complete(NULL, ref->old_sha1, 0, NULL);
 600}
 601
 602static int everything_local(struct ref **refs, int nr_match, char **match)
 603{
 604        struct ref *ref;
 605        int retval;
 606        unsigned long cutoff = 0;
 607
 608        save_commit_buffer = 0;
 609
 610        for (ref = *refs; ref; ref = ref->next) {
 611                struct object *o;
 612
 613                if (!has_sha1_file(ref->old_sha1))
 614                        continue;
 615
 616                o = parse_object(ref->old_sha1);
 617                if (!o)
 618                        continue;
 619
 620                /* We already have it -- which may mean that we were
 621                 * in sync with the other side at some time after
 622                 * that (it is OK if we guess wrong here).
 623                 */
 624                if (o->type == OBJ_COMMIT) {
 625                        struct commit *commit = (struct commit *)o;
 626                        if (!cutoff || cutoff < commit->date)
 627                                cutoff = commit->date;
 628                }
 629        }
 630
 631        if (!args.depth) {
 632                for_each_ref(mark_complete, NULL);
 633                for_each_alternate_ref(mark_alternate_complete, NULL);
 634                if (cutoff)
 635                        mark_recent_complete_commits(cutoff);
 636        }
 637
 638        /*
 639         * Mark all complete remote refs as common refs.
 640         * Don't mark them common yet; the server has to be told so first.
 641         */
 642        for (ref = *refs; ref; ref = ref->next) {
 643                struct object *o = deref_tag(lookup_object(ref->old_sha1),
 644                                             NULL, 0);
 645
 646                if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
 647                        continue;
 648
 649                if (!(o->flags & SEEN)) {
 650                        rev_list_push((struct commit *)o, COMMON_REF | SEEN);
 651
 652                        mark_common((struct commit *)o, 1, 1);
 653                }
 654        }
 655
 656        filter_refs(refs, nr_match, match);
 657
 658        for (retval = 1, ref = *refs; ref ; ref = ref->next) {
 659                const unsigned char *remote = ref->old_sha1;
 660                unsigned char local[20];
 661                struct object *o;
 662
 663                o = lookup_object(remote);
 664                if (!o || !(o->flags & COMPLETE)) {
 665                        retval = 0;
 666                        if (!args.verbose)
 667                                continue;
 668                        fprintf(stderr,
 669                                "want %s (%s)\n", sha1_to_hex(remote),
 670                                ref->name);
 671                        continue;
 672                }
 673
 674                hashcpy(ref->new_sha1, local);
 675                if (!args.verbose)
 676                        continue;
 677                fprintf(stderr,
 678                        "already have %s (%s)\n", sha1_to_hex(remote),
 679                        ref->name);
 680        }
 681        return retval;
 682}
 683
 684static int sideband_demux(int in, int out, void *data)
 685{
 686        int *xd = data;
 687
 688        int ret = recv_sideband("fetch-pack", xd[0], out);
 689        close(out);
 690        return ret;
 691}
 692
 693static int get_pack(int xd[2], char **pack_lockfile)
 694{
 695        struct async demux;
 696        const char *argv[20];
 697        char keep_arg[256];
 698        char hdr_arg[256];
 699        const char **av;
 700        int do_keep = args.keep_pack;
 701        struct child_process cmd;
 702
 703        memset(&demux, 0, sizeof(demux));
 704        if (use_sideband) {
 705                /* xd[] is talking with upload-pack; subprocess reads from
 706                 * xd[0], spits out band#2 to stderr, and feeds us band#1
 707                 * through demux->out.
 708                 */
 709                demux.proc = sideband_demux;
 710                demux.data = xd;
 711                demux.out = -1;
 712                if (start_async(&demux))
 713                        die("fetch-pack: unable to fork off sideband"
 714                            " demultiplexer");
 715        }
 716        else
 717                demux.out = xd[0];
 718
 719        memset(&cmd, 0, sizeof(cmd));
 720        cmd.argv = argv;
 721        av = argv;
 722        *hdr_arg = 0;
 723        if (!args.keep_pack && unpack_limit) {
 724                struct pack_header header;
 725
 726                if (read_pack_header(demux.out, &header))
 727                        die("protocol error: bad pack header");
 728                snprintf(hdr_arg, sizeof(hdr_arg),
 729                         "--pack_header=%"PRIu32",%"PRIu32,
 730                         ntohl(header.hdr_version), ntohl(header.hdr_entries));
 731                if (ntohl(header.hdr_entries) < unpack_limit)
 732                        do_keep = 0;
 733                else
 734                        do_keep = 1;
 735        }
 736
 737        if (do_keep) {
 738                if (pack_lockfile)
 739                        cmd.out = -1;
 740                *av++ = "index-pack";
 741                *av++ = "--stdin";
 742                if (!args.quiet && !args.no_progress)
 743                        *av++ = "-v";
 744                if (args.use_thin_pack)
 745                        *av++ = "--fix-thin";
 746                if (args.lock_pack || unpack_limit) {
 747                        int s = sprintf(keep_arg,
 748                                        "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
 749                        if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
 750                                strcpy(keep_arg + s, "localhost");
 751                        *av++ = keep_arg;
 752                }
 753        }
 754        else {
 755                *av++ = "unpack-objects";
 756                if (args.quiet || args.no_progress)
 757                        *av++ = "-q";
 758        }
 759        if (*hdr_arg)
 760                *av++ = hdr_arg;
 761        if (fetch_fsck_objects >= 0
 762            ? fetch_fsck_objects
 763            : transfer_fsck_objects >= 0
 764            ? transfer_fsck_objects
 765            : 0)
 766                *av++ = "--strict";
 767        *av++ = NULL;
 768
 769        cmd.in = demux.out;
 770        cmd.git_cmd = 1;
 771        if (start_command(&cmd))
 772                die("fetch-pack: unable to fork off %s", argv[0]);
 773        if (do_keep && pack_lockfile) {
 774                *pack_lockfile = index_pack_lockfile(cmd.out);
 775                close(cmd.out);
 776        }
 777
 778        if (finish_command(&cmd))
 779                die("%s failed", argv[0]);
 780        if (use_sideband && finish_async(&demux))
 781                die("error in sideband demultiplexer");
 782        return 0;
 783}
 784
 785static struct ref *do_fetch_pack(int fd[2],
 786                const struct ref *orig_ref,
 787                int nr_match,
 788                char **match,
 789                char **pack_lockfile)
 790{
 791        struct ref *ref = copy_ref_list(orig_ref);
 792        unsigned char sha1[20];
 793        const char *agent_feature;
 794        int agent_len;
 795
 796        sort_ref_list(&ref, ref_compare_name);
 797
 798        if (is_repository_shallow() && !server_supports("shallow"))
 799                die("Server does not support shallow clients");
 800        if (server_supports("multi_ack_detailed")) {
 801                if (args.verbose)
 802                        fprintf(stderr, "Server supports multi_ack_detailed\n");
 803                multi_ack = 2;
 804                if (server_supports("no-done")) {
 805                        if (args.verbose)
 806                                fprintf(stderr, "Server supports no-done\n");
 807                        if (args.stateless_rpc)
 808                                no_done = 1;
 809                }
 810        }
 811        else if (server_supports("multi_ack")) {
 812                if (args.verbose)
 813                        fprintf(stderr, "Server supports multi_ack\n");
 814                multi_ack = 1;
 815        }
 816        if (server_supports("side-band-64k")) {
 817                if (args.verbose)
 818                        fprintf(stderr, "Server supports side-band-64k\n");
 819                use_sideband = 2;
 820        }
 821        else if (server_supports("side-band")) {
 822                if (args.verbose)
 823                        fprintf(stderr, "Server supports side-band\n");
 824                use_sideband = 1;
 825        }
 826        if (!server_supports("thin-pack"))
 827                args.use_thin_pack = 0;
 828        if (!server_supports("no-progress"))
 829                args.no_progress = 0;
 830        if (!server_supports("include-tag"))
 831                args.include_tag = 0;
 832        if (server_supports("ofs-delta")) {
 833                if (args.verbose)
 834                        fprintf(stderr, "Server supports ofs-delta\n");
 835        } else
 836                prefer_ofs_delta = 0;
 837
 838        if ((agent_feature = server_feature_value("agent", &agent_len))) {
 839                agent_supported = 1;
 840                if (args.verbose && agent_len)
 841                        fprintf(stderr, "Server version is %.*s\n",
 842                                agent_len, agent_feature);
 843        }
 844
 845        if (everything_local(&ref, nr_match, match)) {
 846                packet_flush(fd[1]);
 847                goto all_done;
 848        }
 849        if (find_common(fd, sha1, ref) < 0)
 850                if (!args.keep_pack)
 851                        /* When cloning, it is not unusual to have
 852                         * no common commit.
 853                         */
 854                        warning("no common commits");
 855
 856        if (args.stateless_rpc)
 857                packet_flush(fd[1]);
 858        if (get_pack(fd, pack_lockfile))
 859                die("git fetch-pack: fetch failed.");
 860
 861 all_done:
 862        return ref;
 863}
 864
 865static int remove_duplicates(int nr_heads, char **heads)
 866{
 867        int src, dst;
 868
 869        if (!nr_heads)
 870                return 0;
 871
 872        for (src = dst = 1; src < nr_heads; src++)
 873                if (strcmp(heads[src], heads[dst-1]))
 874                        heads[dst++] = heads[src];
 875        return dst;
 876}
 877
 878static int fetch_pack_config(const char *var, const char *value, void *cb)
 879{
 880        if (strcmp(var, "fetch.unpacklimit") == 0) {
 881                fetch_unpack_limit = git_config_int(var, value);
 882                return 0;
 883        }
 884
 885        if (strcmp(var, "transfer.unpacklimit") == 0) {
 886                transfer_unpack_limit = git_config_int(var, value);
 887                return 0;
 888        }
 889
 890        if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
 891                prefer_ofs_delta = git_config_bool(var, value);
 892                return 0;
 893        }
 894
 895        if (!strcmp(var, "fetch.fsckobjects")) {
 896                fetch_fsck_objects = git_config_bool(var, value);
 897                return 0;
 898        }
 899
 900        if (!strcmp(var, "transfer.fsckobjects")) {
 901                transfer_fsck_objects = git_config_bool(var, value);
 902                return 0;
 903        }
 904
 905        return git_default_config(var, value, cb);
 906}
 907
 908static struct lock_file lock;
 909
 910static void fetch_pack_setup(void)
 911{
 912        static int did_setup;
 913        if (did_setup)
 914                return;
 915        git_config(fetch_pack_config, NULL);
 916        if (0 <= transfer_unpack_limit)
 917                unpack_limit = transfer_unpack_limit;
 918        else if (0 <= fetch_unpack_limit)
 919                unpack_limit = fetch_unpack_limit;
 920        did_setup = 1;
 921}
 922
 923int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
 924{
 925        int i, ret;
 926        struct ref *ref = NULL;
 927        const char *dest = NULL;
 928        int alloc_heads = 0, nr_heads = 0;
 929        char **heads = NULL;
 930        int fd[2];
 931        char *pack_lockfile = NULL;
 932        char **pack_lockfile_ptr = NULL;
 933        struct child_process *conn;
 934
 935        packet_trace_identity("fetch-pack");
 936
 937        for (i = 1; i < argc && *argv[i] == '-'; i++) {
 938                const char *arg = argv[i];
 939
 940                if (!prefixcmp(arg, "--upload-pack=")) {
 941                        args.uploadpack = arg + 14;
 942                        continue;
 943                }
 944                if (!prefixcmp(arg, "--exec=")) {
 945                        args.uploadpack = arg + 7;
 946                        continue;
 947                }
 948                if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
 949                        args.quiet = 1;
 950                        continue;
 951                }
 952                if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
 953                        args.lock_pack = args.keep_pack;
 954                        args.keep_pack = 1;
 955                        continue;
 956                }
 957                if (!strcmp("--thin", arg)) {
 958                        args.use_thin_pack = 1;
 959                        continue;
 960                }
 961                if (!strcmp("--include-tag", arg)) {
 962                        args.include_tag = 1;
 963                        continue;
 964                }
 965                if (!strcmp("--all", arg)) {
 966                        args.fetch_all = 1;
 967                        continue;
 968                }
 969                if (!strcmp("--stdin", arg)) {
 970                        args.stdin_refs = 1;
 971                        continue;
 972                }
 973                if (!strcmp("-v", arg)) {
 974                        args.verbose = 1;
 975                        continue;
 976                }
 977                if (!prefixcmp(arg, "--depth=")) {
 978                        args.depth = strtol(arg + 8, NULL, 0);
 979                        continue;
 980                }
 981                if (!strcmp("--no-progress", arg)) {
 982                        args.no_progress = 1;
 983                        continue;
 984                }
 985                if (!strcmp("--stateless-rpc", arg)) {
 986                        args.stateless_rpc = 1;
 987                        continue;
 988                }
 989                if (!strcmp("--lock-pack", arg)) {
 990                        args.lock_pack = 1;
 991                        pack_lockfile_ptr = &pack_lockfile;
 992                        continue;
 993                }
 994                usage(fetch_pack_usage);
 995        }
 996
 997        if (i < argc)
 998                dest = argv[i++];
 999        else
1000                usage(fetch_pack_usage);
1001
1002        /*
1003         * Copy refs from cmdline to growable list, then append any
1004         * refs from the standard input:
1005         */
1006        ALLOC_GROW(heads, argc - i, alloc_heads);
1007        for (; i < argc; i++)
1008                heads[nr_heads++] = xstrdup(argv[i]);
1009        if (args.stdin_refs) {
1010                if (args.stateless_rpc) {
1011                        /* in stateless RPC mode we use pkt-line to read
1012                         * from stdin, until we get a flush packet
1013                         */
1014                        static char line[1000];
1015                        for (;;) {
1016                                int n = packet_read_line(0, line, sizeof(line));
1017                                if (!n)
1018                                        break;
1019                                if (line[n-1] == '\n')
1020                                        n--;
1021                                ALLOC_GROW(heads, nr_heads + 1, alloc_heads);
1022                                heads[nr_heads++] = xmemdupz(line, n);
1023                        }
1024                }
1025                else {
1026                        /* read from stdin one ref per line, until EOF */
1027                        struct strbuf line = STRBUF_INIT;
1028                        while (strbuf_getline(&line, stdin, '\n') != EOF) {
1029                                ALLOC_GROW(heads, nr_heads + 1, alloc_heads);
1030                                heads[nr_heads++] = strbuf_detach(&line, NULL);
1031                        }
1032                        strbuf_release(&line);
1033                }
1034        }
1035
1036        if (args.stateless_rpc) {
1037                conn = NULL;
1038                fd[0] = 0;
1039                fd[1] = 1;
1040        } else {
1041                conn = git_connect(fd, dest, args.uploadpack,
1042                                   args.verbose ? CONNECT_VERBOSE : 0);
1043        }
1044
1045        get_remote_heads(fd[0], &ref, 0, NULL);
1046
1047        ref = fetch_pack(&args, fd, conn, ref, dest,
1048                nr_heads, heads, pack_lockfile_ptr);
1049        if (pack_lockfile) {
1050                printf("lock %s\n", pack_lockfile);
1051                fflush(stdout);
1052        }
1053        close(fd[0]);
1054        close(fd[1]);
1055        if (finish_connect(conn))
1056                ref = NULL;
1057        ret = !ref;
1058
1059        if (!ret && nr_heads) {
1060                /* If the heads to pull were given, we should have
1061                 * consumed all of them by matching the remote.
1062                 * Otherwise, 'git fetch remote no-such-ref' would
1063                 * silently succeed without issuing an error.
1064                 */
1065                for (i = 0; i < nr_heads; i++)
1066                        if (heads[i] && heads[i][0]) {
1067                                error("no such remote ref %s", heads[i]);
1068                                ret = 1;
1069                        }
1070        }
1071        while (ref) {
1072                printf("%s %s\n",
1073                       sha1_to_hex(ref->old_sha1), ref->name);
1074                ref = ref->next;
1075        }
1076
1077        return ret;
1078}
1079
1080static int compare_heads(const void *a, const void *b)
1081{
1082        return strcmp(*(const char **)a, *(const char **)b);
1083}
1084
1085struct ref *fetch_pack(struct fetch_pack_args *my_args,
1086                       int fd[], struct child_process *conn,
1087                       const struct ref *ref,
1088                const char *dest,
1089                int nr_heads,
1090                char **heads,
1091                char **pack_lockfile)
1092{
1093        struct stat st;
1094        struct ref *ref_cpy;
1095
1096        fetch_pack_setup();
1097        if (&args != my_args)
1098                memcpy(&args, my_args, sizeof(args));
1099        if (args.depth > 0) {
1100                if (stat(git_path("shallow"), &st))
1101                        st.st_mtime = 0;
1102        }
1103
1104        if (heads && nr_heads) {
1105                qsort(heads, nr_heads, sizeof(*heads), compare_heads);
1106                nr_heads = remove_duplicates(nr_heads, heads);
1107        }
1108
1109        if (!ref) {
1110                packet_flush(fd[1]);
1111                die("no matching remote head");
1112        }
1113        ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
1114
1115        if (args.depth > 0) {
1116                struct cache_time mtime;
1117                struct strbuf sb = STRBUF_INIT;
1118                char *shallow = git_path("shallow");
1119                int fd;
1120
1121                mtime.sec = st.st_mtime;
1122                mtime.nsec = ST_MTIME_NSEC(st);
1123                if (stat(shallow, &st)) {
1124                        if (mtime.sec)
1125                                die("shallow file was removed during fetch");
1126                } else if (st.st_mtime != mtime.sec
1127#ifdef USE_NSEC
1128                                || ST_MTIME_NSEC(st) != mtime.nsec
1129#endif
1130                          )
1131                        die("shallow file was changed during fetch");
1132
1133                fd = hold_lock_file_for_update(&lock, shallow,
1134                                               LOCK_DIE_ON_ERROR);
1135                if (!write_shallow_commits(&sb, 0)
1136                 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
1137                        unlink_or_warn(shallow);
1138                        rollback_lock_file(&lock);
1139                } else {
1140                        commit_lock_file(&lock);
1141                }
1142                strbuf_release(&sb);
1143        }
1144
1145        reprepare_packed_git();
1146        return ref_cpy;
1147}