fetch-pack.con commit fetch-pack: Do not fetch tags for shallow clones. (4bcb310)
   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 "sideband.h"
   8#include <sys/wait.h>
   9
  10static int keep_pack;
  11static int quiet;
  12static int verbose;
  13static int fetch_all;
  14static int depth;
  15static const char fetch_pack_usage[] =
  16"git-fetch-pack [--all] [-q] [-v] [-k] [--thin] [--exec=upload-pack] [--depth=<n>] [host:]directory <refs>...";
  17static const char *exec = "git-upload-pack";
  18
  19#define COMPLETE        (1U << 0)
  20#define COMMON          (1U << 1)
  21#define COMMON_REF      (1U << 2)
  22#define SEEN            (1U << 3)
  23#define POPPED          (1U << 4)
  24
  25/*
  26 * After sending this many "have"s if we do not get any new ACK , we
  27 * give up traversing our history.
  28 */
  29#define MAX_IN_VAIN 256
  30
  31static struct commit_list *rev_list;
  32static int non_common_revs, multi_ack, use_thin_pack, use_sideband;
  33
  34static void rev_list_push(struct commit *commit, int mark)
  35{
  36        if (!(commit->object.flags & mark)) {
  37                commit->object.flags |= mark;
  38
  39                if (!(commit->object.parsed))
  40                        parse_commit(commit);
  41
  42                insert_by_date(commit, &rev_list);
  43
  44                if (!(commit->object.flags & COMMON))
  45                        non_common_revs++;
  46        }
  47}
  48
  49static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
  50{
  51        struct object *o = deref_tag(parse_object(sha1), path, 0);
  52
  53        if (o && o->type == OBJ_COMMIT)
  54                rev_list_push((struct commit *)o, SEEN);
  55
  56        return 0;
  57}
  58
  59/*
  60   This function marks a rev and its ancestors as common.
  61   In some cases, it is desirable to mark only the ancestors (for example
  62   when only the server does not yet know that they are common).
  63*/
  64
  65static void mark_common(struct commit *commit,
  66                int ancestors_only, int dont_parse)
  67{
  68        if (commit != NULL && !(commit->object.flags & COMMON)) {
  69                struct object *o = (struct object *)commit;
  70
  71                if (!ancestors_only)
  72                        o->flags |= COMMON;
  73
  74                if (!(o->flags & SEEN))
  75                        rev_list_push(commit, SEEN);
  76                else {
  77                        struct commit_list *parents;
  78
  79                        if (!ancestors_only && !(o->flags & POPPED))
  80                                non_common_revs--;
  81                        if (!o->parsed && !dont_parse)
  82                                parse_commit(commit);
  83
  84                        for (parents = commit->parents;
  85                                        parents;
  86                                        parents = parents->next)
  87                                mark_common(parents->item, 0, dont_parse);
  88                }
  89        }
  90}
  91
  92/*
  93  Get the next rev to send, ignoring the common.
  94*/
  95
  96static const unsigned char* get_rev(void)
  97{
  98        struct commit *commit = NULL;
  99
 100        while (commit == NULL) {
 101                unsigned int mark;
 102                struct commit_list* parents;
 103
 104                if (rev_list == NULL || non_common_revs == 0)
 105                        return NULL;
 106
 107                commit = rev_list->item;
 108                if (!(commit->object.parsed))
 109                        parse_commit(commit);
 110                commit->object.flags |= POPPED;
 111                if (!(commit->object.flags & COMMON))
 112                        non_common_revs--;
 113        
 114                parents = commit->parents;
 115
 116                if (commit->object.flags & COMMON) {
 117                        /* do not send "have", and ignore ancestors */
 118                        commit = NULL;
 119                        mark = COMMON | SEEN;
 120                } else if (commit->object.flags & COMMON_REF)
 121                        /* send "have", and ignore ancestors */
 122                        mark = COMMON | SEEN;
 123                else
 124                        /* send "have", also for its ancestors */
 125                        mark = SEEN;
 126
 127                while (parents) {
 128                        if (!(parents->item->object.flags & SEEN))
 129                                rev_list_push(parents->item, mark);
 130                        if (mark & COMMON)
 131                                mark_common(parents->item, 1, 0);
 132                        parents = parents->next;
 133                }
 134
 135                rev_list = rev_list->next;
 136        }
 137
 138        return commit->object.sha1;
 139}
 140
 141static int find_common(int fd[2], unsigned char *result_sha1,
 142                       struct ref *refs)
 143{
 144        int fetching;
 145        int count = 0, flushes = 0, retval;
 146        const unsigned char *sha1;
 147        unsigned in_vain = 0;
 148        int got_continue = 0;
 149
 150        for_each_ref(rev_list_insert_ref, NULL);
 151
 152        fetching = 0;
 153        for ( ; refs ; refs = refs->next) {
 154                unsigned char *remote = refs->old_sha1;
 155                struct object *o;
 156
 157                /*
 158                 * If that object is complete (i.e. it is an ancestor of a
 159                 * local ref), we tell them we have it but do not have to
 160                 * tell them about its ancestors, which they already know
 161                 * about.
 162                 *
 163                 * We use lookup_object here because we are only
 164                 * interested in the case we *know* the object is
 165                 * reachable and we have already scanned it.
 166                 */
 167                if (((o = lookup_object(remote)) != NULL) &&
 168                                (o->flags & COMPLETE)) {
 169                        continue;
 170                }
 171
 172                if (!fetching)
 173                        packet_write(fd[1], "want %s%s%s%s%s%s\n",
 174                                     sha1_to_hex(remote),
 175                                     (multi_ack ? " multi_ack" : ""),
 176                                     (use_sideband == 2 ? " side-band-64k" : ""),
 177                                     (use_sideband == 1 ? " side-band" : ""),
 178                                     (use_thin_pack ? " thin-pack" : ""),
 179                                     " ofs-delta");
 180                else
 181                        packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
 182                fetching++;
 183        }
 184        if (is_repository_shallow())
 185                write_shallow_commits(fd[1], 1);
 186        if (depth > 0)
 187                packet_write(fd[1], "deepen %d", depth);
 188        packet_flush(fd[1]);
 189        if (!fetching)
 190                return 1;
 191
 192        if (depth > 0) {
 193                char line[1024];
 194                unsigned char sha1[20];
 195                int len;
 196
 197                while ((len = packet_read_line(fd[0], line, sizeof(line)))) {
 198                        if (!strncmp("shallow ", line, 8)) {
 199                                if (get_sha1_hex(line + 8, sha1))
 200                                        die("invalid shallow line: %s", line);
 201                                register_shallow(sha1);
 202                                continue;
 203                        }
 204                        if (!strncmp("unshallow ", line, 10)) {
 205                                if (get_sha1_hex(line + 10, sha1))
 206                                        die("invalid unshallow line: %s", line);
 207                                if (!lookup_object(sha1))
 208                                        die("object not found: %s", line);
 209                                /* make sure that it is parsed as shallow */
 210                                parse_object(sha1);
 211                                if (unregister_shallow(sha1))
 212                                        die("no shallow found: %s", line);
 213                                continue;
 214                        }
 215                        die("expected shallow/unshallow, got %s", line);
 216                }
 217        }
 218
 219        flushes = 0;
 220        retval = -1;
 221        while ((sha1 = get_rev())) {
 222                packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
 223                if (verbose)
 224                        fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
 225                in_vain++;
 226                if (!(31 & ++count)) {
 227                        int ack;
 228
 229                        packet_flush(fd[1]);
 230                        flushes++;
 231
 232                        /*
 233                         * We keep one window "ahead" of the other side, and
 234                         * will wait for an ACK only on the next one
 235                         */
 236                        if (count == 32)
 237                                continue;
 238
 239                        do {
 240                                ack = get_ack(fd[0], result_sha1);
 241                                if (verbose && ack)
 242                                        fprintf(stderr, "got ack %d %s\n", ack,
 243                                                        sha1_to_hex(result_sha1));
 244                                if (ack == 1) {
 245                                        flushes = 0;
 246                                        multi_ack = 0;
 247                                        retval = 0;
 248                                        goto done;
 249                                } else if (ack == 2) {
 250                                        struct commit *commit =
 251                                                lookup_commit(result_sha1);
 252                                        mark_common(commit, 0, 1);
 253                                        retval = 0;
 254                                        in_vain = 0;
 255                                        got_continue = 1;
 256                                }
 257                        } while (ack);
 258                        flushes--;
 259                        if (got_continue && MAX_IN_VAIN < in_vain) {
 260                                if (verbose)
 261                                        fprintf(stderr, "giving up\n");
 262                                break; /* give up */
 263                        }
 264                }
 265        }
 266done:
 267        packet_write(fd[1], "done\n");
 268        if (verbose)
 269                fprintf(stderr, "done\n");
 270        if (retval != 0) {
 271                multi_ack = 0;
 272                flushes++;
 273        }
 274        while (flushes || multi_ack) {
 275                int ack = get_ack(fd[0], result_sha1);
 276                if (ack) {
 277                        if (verbose)
 278                                fprintf(stderr, "got ack (%d) %s\n", ack,
 279                                        sha1_to_hex(result_sha1));
 280                        if (ack == 1)
 281                                return 0;
 282                        multi_ack = 1;
 283                        continue;
 284                }
 285                flushes--;
 286        }
 287        return retval;
 288}
 289
 290static struct commit_list *complete;
 291
 292static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 293{
 294        struct object *o = parse_object(sha1);
 295
 296        while (o && o->type == OBJ_TAG) {
 297                struct tag *t = (struct tag *) o;
 298                if (!t->tagged)
 299                        break; /* broken repository */
 300                o->flags |= COMPLETE;
 301                o = parse_object(t->tagged->sha1);
 302        }
 303        if (o && o->type == OBJ_COMMIT) {
 304                struct commit *commit = (struct commit *)o;
 305                commit->object.flags |= COMPLETE;
 306                insert_by_date(commit, &complete);
 307        }
 308        return 0;
 309}
 310
 311static void mark_recent_complete_commits(unsigned long cutoff)
 312{
 313        while (complete && cutoff <= complete->item->date) {
 314                if (verbose)
 315                        fprintf(stderr, "Marking %s as complete\n",
 316                                sha1_to_hex(complete->item->object.sha1));
 317                pop_most_recent_commit(&complete, COMPLETE);
 318        }
 319}
 320
 321static void filter_refs(struct ref **refs, int nr_match, char **match)
 322{
 323        struct ref **return_refs;
 324        struct ref *newlist = NULL;
 325        struct ref **newtail = &newlist;
 326        struct ref *ref, *next;
 327        struct ref *fastarray[32];
 328
 329        if (nr_match && !fetch_all) {
 330                if (ARRAY_SIZE(fastarray) < nr_match)
 331                        return_refs = xcalloc(nr_match, sizeof(struct ref *));
 332                else {
 333                        return_refs = fastarray;
 334                        memset(return_refs, 0, sizeof(struct ref *) * nr_match);
 335                }
 336        }
 337        else
 338                return_refs = NULL;
 339
 340        for (ref = *refs; ref; ref = next) {
 341                next = ref->next;
 342                if (!memcmp(ref->name, "refs/", 5) &&
 343                    check_ref_format(ref->name + 5))
 344                        ; /* trash */
 345                else if (fetch_all &&
 346                         (!depth || strncmp(ref->name, "refs/tags/", 10) )) {
 347                        *newtail = ref;
 348                        ref->next = NULL;
 349                        newtail = &ref->next;
 350                        continue;
 351                }
 352                else {
 353                        int order = path_match(ref->name, nr_match, match);
 354                        if (order) {
 355                                return_refs[order-1] = ref;
 356                                continue; /* we will link it later */
 357                        }
 358                }
 359                free(ref);
 360        }
 361
 362        if (!fetch_all) {
 363                int i;
 364                for (i = 0; i < nr_match; i++) {
 365                        ref = return_refs[i];
 366                        if (ref) {
 367                                *newtail = ref;
 368                                ref->next = NULL;
 369                                newtail = &ref->next;
 370                        }
 371                }
 372                if (return_refs != fastarray)
 373                        free(return_refs);
 374        }
 375        *refs = newlist;
 376}
 377
 378static int everything_local(struct ref **refs, int nr_match, char **match)
 379{
 380        struct ref *ref;
 381        int retval;
 382        unsigned long cutoff = 0;
 383
 384        track_object_refs = 0;
 385        save_commit_buffer = 0;
 386
 387        for (ref = *refs; ref; ref = ref->next) {
 388                struct object *o;
 389
 390                o = parse_object(ref->old_sha1);
 391                if (!o)
 392                        continue;
 393
 394                /* We already have it -- which may mean that we were
 395                 * in sync with the other side at some time after
 396                 * that (it is OK if we guess wrong here).
 397                 */
 398                if (o->type == OBJ_COMMIT) {
 399                        struct commit *commit = (struct commit *)o;
 400                        if (!cutoff || cutoff < commit->date)
 401                                cutoff = commit->date;
 402                }
 403        }
 404
 405        if (!depth) {
 406                for_each_ref(mark_complete, NULL);
 407                if (cutoff)
 408                        mark_recent_complete_commits(cutoff);
 409        }
 410
 411        /*
 412         * Mark all complete remote refs as common refs.
 413         * Don't mark them common yet; the server has to be told so first.
 414         */
 415        for (ref = *refs; ref; ref = ref->next) {
 416                struct object *o = deref_tag(lookup_object(ref->old_sha1),
 417                                             NULL, 0);
 418
 419                if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
 420                        continue;
 421
 422                if (!(o->flags & SEEN)) {
 423                        rev_list_push((struct commit *)o, COMMON_REF | SEEN);
 424
 425                        mark_common((struct commit *)o, 1, 1);
 426                }
 427        }
 428
 429        filter_refs(refs, nr_match, match);
 430
 431        for (retval = 1, ref = *refs; ref ; ref = ref->next) {
 432                const unsigned char *remote = ref->old_sha1;
 433                unsigned char local[20];
 434                struct object *o;
 435
 436                o = lookup_object(remote);
 437                if (!o || !(o->flags & COMPLETE)) {
 438                        retval = 0;
 439                        if (!verbose)
 440                                continue;
 441                        fprintf(stderr,
 442                                "want %s (%s)\n", sha1_to_hex(remote),
 443                                ref->name);
 444                        continue;
 445                }
 446
 447                hashcpy(ref->new_sha1, local);
 448                if (!verbose)
 449                        continue;
 450                fprintf(stderr,
 451                        "already have %s (%s)\n", sha1_to_hex(remote),
 452                        ref->name);
 453        }
 454        return retval;
 455}
 456
 457static pid_t setup_sideband(int fd[2], int xd[2])
 458{
 459        pid_t side_pid;
 460
 461        if (!use_sideband) {
 462                fd[0] = xd[0];
 463                fd[1] = xd[1];
 464                return 0;
 465        }
 466        /* xd[] is talking with upload-pack; subprocess reads from
 467         * xd[0], spits out band#2 to stderr, and feeds us band#1
 468         * through our fd[0].
 469         */
 470        if (pipe(fd) < 0)
 471                die("fetch-pack: unable to set up pipe");
 472        side_pid = fork();
 473        if (side_pid < 0)
 474                die("fetch-pack: unable to fork off sideband demultiplexer");
 475        if (!side_pid) {
 476                /* subprocess */
 477                close(fd[0]);
 478                if (xd[0] != xd[1])
 479                        close(xd[1]);
 480                if (recv_sideband("fetch-pack", xd[0], fd[1], 2))
 481                        exit(1);
 482                exit(0);
 483        }
 484        close(xd[0]);
 485        close(fd[1]);
 486        fd[1] = xd[1];
 487        return side_pid;
 488}
 489
 490static int get_pack(int xd[2], const char **argv)
 491{
 492        int status;
 493        pid_t pid, side_pid;
 494        int fd[2];
 495
 496        side_pid = setup_sideband(fd, xd);
 497        pid = fork();
 498        if (pid < 0)
 499                die("fetch-pack: unable to fork off %s", argv[0]);
 500        if (!pid) {
 501                dup2(fd[0], 0);
 502                close(fd[0]);
 503                close(fd[1]);
 504                execv_git_cmd(argv);
 505                die("%s exec failed", argv[0]);
 506        }
 507        close(fd[0]);
 508        close(fd[1]);
 509        while (waitpid(pid, &status, 0) < 0) {
 510                if (errno != EINTR)
 511                        die("waiting for %s: %s", argv[0], strerror(errno));
 512        }
 513        if (WIFEXITED(status)) {
 514                int code = WEXITSTATUS(status);
 515                if (code)
 516                        die("%s died with error code %d", argv[0], code);
 517                return 0;
 518        }
 519        if (WIFSIGNALED(status)) {
 520                int sig = WTERMSIG(status);
 521                die("%s died of signal %d", argv[0], sig);
 522        }
 523        die("%s died of unnatural causes %d", argv[0], status);
 524}
 525
 526static int explode_rx_pack(int xd[2])
 527{
 528        const char *argv[3] = { "unpack-objects", quiet ? "-q" : NULL, NULL };
 529        return get_pack(xd, argv);
 530}
 531
 532static int keep_rx_pack(int xd[2])
 533{
 534        const char *argv[6];
 535        char keep_arg[256];
 536        int n = 0;
 537
 538        argv[n++] = "index-pack";
 539        argv[n++] = "--stdin";
 540        if (!quiet)
 541                argv[n++] = "-v";
 542        if (use_thin_pack)
 543                argv[n++] = "--fix-thin";
 544        if (keep_pack > 1) {
 545                int s = sprintf(keep_arg, "--keep=fetch-pack %i on ", getpid());
 546                if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
 547                        strcpy(keep_arg + s, "localhost");
 548                argv[n++] = keep_arg;
 549        }
 550        argv[n] = NULL;
 551        return get_pack(xd, argv);
 552}
 553
 554static int fetch_pack(int fd[2], int nr_match, char **match)
 555{
 556        struct ref *ref;
 557        unsigned char sha1[20];
 558        int status;
 559
 560        get_remote_heads(fd[0], &ref, 0, NULL, 0);
 561        if (is_repository_shallow() && !server_supports("shallow"))
 562                die("Server does not support shallow clients");
 563        if (server_supports("multi_ack")) {
 564                if (verbose)
 565                        fprintf(stderr, "Server supports multi_ack\n");
 566                multi_ack = 1;
 567        }
 568        if (server_supports("side-band-64k")) {
 569                if (verbose)
 570                        fprintf(stderr, "Server supports side-band-64k\n");
 571                use_sideband = 2;
 572        }
 573        else if (server_supports("side-band")) {
 574                if (verbose)
 575                        fprintf(stderr, "Server supports side-band\n");
 576                use_sideband = 1;
 577        }
 578        if (!ref) {
 579                packet_flush(fd[1]);
 580                die("no matching remote head");
 581        }
 582        if (everything_local(&ref, nr_match, match)) {
 583                packet_flush(fd[1]);
 584                goto all_done;
 585        }
 586        if (find_common(fd, sha1, ref) < 0)
 587                if (keep_pack != 1)
 588                        /* When cloning, it is not unusual to have
 589                         * no common commit.
 590                         */
 591                        fprintf(stderr, "warning: no common commits\n");
 592
 593        status = (keep_pack) ? keep_rx_pack(fd) : explode_rx_pack(fd);
 594        if (status)
 595                die("git-fetch-pack: fetch failed.");
 596
 597 all_done:
 598        while (ref) {
 599                printf("%s %s\n",
 600                       sha1_to_hex(ref->old_sha1), ref->name);
 601                ref = ref->next;
 602        }
 603        return 0;
 604}
 605
 606int main(int argc, char **argv)
 607{
 608        int i, ret, nr_heads;
 609        char *dest = NULL, **heads;
 610        int fd[2];
 611        pid_t pid;
 612        struct stat st;
 613        struct lock_file lock;
 614
 615        setup_git_directory();
 616
 617        nr_heads = 0;
 618        heads = NULL;
 619        for (i = 1; i < argc; i++) {
 620                char *arg = argv[i];
 621
 622                if (*arg == '-') {
 623                        if (!strncmp("--exec=", arg, 7)) {
 624                                exec = arg + 7;
 625                                continue;
 626                        }
 627                        if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
 628                                quiet = 1;
 629                                continue;
 630                        }
 631                        if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
 632                                keep_pack++;
 633                                continue;
 634                        }
 635                        if (!strcmp("--thin", arg)) {
 636                                use_thin_pack = 1;
 637                                continue;
 638                        }
 639                        if (!strcmp("--all", arg)) {
 640                                fetch_all = 1;
 641                                continue;
 642                        }
 643                        if (!strcmp("-v", arg)) {
 644                                verbose = 1;
 645                                continue;
 646                        }
 647                        if (!strncmp("--depth=", arg, 8)) {
 648                                depth = strtol(arg + 8, NULL, 0);
 649                                if (stat(git_path("shallow"), &st))
 650                                        st.st_mtime = 0;
 651                                continue;
 652                        }
 653                        usage(fetch_pack_usage);
 654                }
 655                dest = arg;
 656                heads = argv + i + 1;
 657                nr_heads = argc - i - 1;
 658                break;
 659        }
 660        if (!dest)
 661                usage(fetch_pack_usage);
 662        pid = git_connect(fd, dest, exec);
 663        if (pid < 0)
 664                return 1;
 665        ret = fetch_pack(fd, nr_heads, heads);
 666        close(fd[0]);
 667        close(fd[1]);
 668        ret |= finish_connect(pid);
 669
 670        if (!ret && nr_heads) {
 671                /* If the heads to pull were given, we should have
 672                 * consumed all of them by matching the remote.
 673                 * Otherwise, 'git-fetch remote no-such-ref' would
 674                 * silently succeed without issuing an error.
 675                 */
 676                for (i = 0; i < nr_heads; i++)
 677                        if (heads[i] && heads[i][0]) {
 678                                error("no such remote ref %s", heads[i]);
 679                                ret = 1;
 680                        }
 681        }
 682
 683        if (!ret && depth > 0) {
 684                struct cache_time mtime;
 685                char *shallow = git_path("shallow");
 686                int fd;
 687
 688                mtime.sec = st.st_mtime;
 689#ifdef USE_NSEC
 690                mtime.usec = st.st_mtim.usec;
 691#endif
 692                if (stat(shallow, &st)) {
 693                        if (mtime.sec)
 694                                die("shallow file was removed during fetch");
 695                } else if (st.st_mtime != mtime.sec
 696#ifdef USE_NSEC
 697                                || st.st_mtim.usec != mtime.usec
 698#endif
 699                          )
 700                        die("shallow file was changed during fetch");
 701
 702                fd = hold_lock_file_for_update(&lock, shallow, 1);
 703                if (!write_shallow_commits(fd, 0)) {
 704                        unlink(shallow);
 705                        rollback_lock_file(&lock);
 706                } else {
 707                        close(fd);
 708                        commit_lock_file(&lock);
 709                }
 710        }
 711
 712        return !!ret;
 713}