fffb6eac881a536ea7fa4a94a0790a117d8b4cf2
   1#include "cache.h"
   2#include "pack.h"
   3#include "refs.h"
   4#include "pkt-line.h"
   5#include "sideband.h"
   6#include "run-command.h"
   7#include "exec_cmd.h"
   8#include "commit.h"
   9#include "object.h"
  10#include "remote.h"
  11#include "transport.h"
  12
  13static const char receive_pack_usage[] = "git receive-pack <git-dir>";
  14
  15enum deny_action {
  16        DENY_UNCONFIGURED,
  17        DENY_IGNORE,
  18        DENY_WARN,
  19        DENY_REFUSE,
  20};
  21
  22static int deny_deletes;
  23static int deny_non_fast_forwards;
  24static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
  25static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
  26static int receive_fsck_objects;
  27static int receive_unpack_limit = -1;
  28static int transfer_unpack_limit = -1;
  29static int unpack_limit = 100;
  30static int report_status;
  31static int use_sideband;
  32static int prefer_ofs_delta = 1;
  33static int auto_update_server_info;
  34static int auto_gc = 1;
  35static const char *head_name;
  36static int sent_capabilities;
  37
  38static enum deny_action parse_deny_action(const char *var, const char *value)
  39{
  40        if (value) {
  41                if (!strcasecmp(value, "ignore"))
  42                        return DENY_IGNORE;
  43                if (!strcasecmp(value, "warn"))
  44                        return DENY_WARN;
  45                if (!strcasecmp(value, "refuse"))
  46                        return DENY_REFUSE;
  47        }
  48        if (git_config_bool(var, value))
  49                return DENY_REFUSE;
  50        return DENY_IGNORE;
  51}
  52
  53static int receive_pack_config(const char *var, const char *value, void *cb)
  54{
  55        if (strcmp(var, "receive.denydeletes") == 0) {
  56                deny_deletes = git_config_bool(var, value);
  57                return 0;
  58        }
  59
  60        if (strcmp(var, "receive.denynonfastforwards") == 0) {
  61                deny_non_fast_forwards = git_config_bool(var, value);
  62                return 0;
  63        }
  64
  65        if (strcmp(var, "receive.unpacklimit") == 0) {
  66                receive_unpack_limit = git_config_int(var, value);
  67                return 0;
  68        }
  69
  70        if (strcmp(var, "transfer.unpacklimit") == 0) {
  71                transfer_unpack_limit = git_config_int(var, value);
  72                return 0;
  73        }
  74
  75        if (strcmp(var, "receive.fsckobjects") == 0) {
  76                receive_fsck_objects = git_config_bool(var, value);
  77                return 0;
  78        }
  79
  80        if (!strcmp(var, "receive.denycurrentbranch")) {
  81                deny_current_branch = parse_deny_action(var, value);
  82                return 0;
  83        }
  84
  85        if (strcmp(var, "receive.denydeletecurrent") == 0) {
  86                deny_delete_current = parse_deny_action(var, value);
  87                return 0;
  88        }
  89
  90        if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
  91                prefer_ofs_delta = git_config_bool(var, value);
  92                return 0;
  93        }
  94
  95        if (strcmp(var, "receive.updateserverinfo") == 0) {
  96                auto_update_server_info = git_config_bool(var, value);
  97                return 0;
  98        }
  99
 100        if (strcmp(var, "receive.autogc") == 0) {
 101                auto_gc = git_config_bool(var, value);
 102                return 0;
 103        }
 104
 105        return git_default_config(var, value, cb);
 106}
 107
 108static int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 109{
 110        if (sent_capabilities)
 111                packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
 112        else
 113                packet_write(1, "%s %s%c%s%s\n",
 114                             sha1_to_hex(sha1), path, 0,
 115                             " report-status delete-refs side-band-64k",
 116                             prefer_ofs_delta ? " ofs-delta" : "");
 117        sent_capabilities = 1;
 118        return 0;
 119}
 120
 121static void write_head_info(void)
 122{
 123        for_each_ref(show_ref, NULL);
 124        if (!sent_capabilities)
 125                show_ref("capabilities^{}", null_sha1, 0, NULL);
 126
 127}
 128
 129struct command {
 130        struct command *next;
 131        const char *error_string;
 132        unsigned char old_sha1[20];
 133        unsigned char new_sha1[20];
 134        char ref_name[FLEX_ARRAY]; /* more */
 135};
 136
 137static const char pre_receive_hook[] = "hooks/pre-receive";
 138static const char post_receive_hook[] = "hooks/post-receive";
 139
 140static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 141static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 142
 143static void report_message(const char *prefix, const char *err, va_list params)
 144{
 145        int sz = strlen(prefix);
 146        char msg[4096];
 147
 148        strncpy(msg, prefix, sz);
 149        sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
 150        if (sz > (sizeof(msg) - 1))
 151                sz = sizeof(msg) - 1;
 152        msg[sz++] = '\n';
 153
 154        if (use_sideband)
 155                send_sideband(1, 2, msg, sz, use_sideband);
 156        else
 157                xwrite(2, msg, sz);
 158}
 159
 160static void rp_warning(const char *err, ...)
 161{
 162        va_list params;
 163        va_start(params, err);
 164        report_message("warning: ", err, params);
 165        va_end(params);
 166}
 167
 168static void rp_error(const char *err, ...)
 169{
 170        va_list params;
 171        va_start(params, err);
 172        report_message("error: ", err, params);
 173        va_end(params);
 174}
 175
 176static int copy_to_sideband(int in, int out, void *arg)
 177{
 178        char data[128];
 179        while (1) {
 180                ssize_t sz = xread(in, data, sizeof(data));
 181                if (sz <= 0)
 182                        break;
 183                send_sideband(1, 2, data, sz, use_sideband);
 184        }
 185        close(in);
 186        return 0;
 187}
 188
 189static int run_receive_hook(struct command *commands, const char *hook_name)
 190{
 191        static char buf[sizeof(commands->old_sha1) * 2 + PATH_MAX + 4];
 192        struct command *cmd;
 193        struct child_process proc;
 194        struct async muxer;
 195        const char *argv[2];
 196        int have_input = 0, code;
 197
 198        for (cmd = commands; !have_input && cmd; cmd = cmd->next) {
 199                if (!cmd->error_string)
 200                        have_input = 1;
 201        }
 202
 203        if (!have_input || access(hook_name, X_OK) < 0)
 204                return 0;
 205
 206        argv[0] = hook_name;
 207        argv[1] = NULL;
 208
 209        memset(&proc, 0, sizeof(proc));
 210        proc.argv = argv;
 211        proc.in = -1;
 212        proc.stdout_to_stderr = 1;
 213
 214        if (use_sideband) {
 215                memset(&muxer, 0, sizeof(muxer));
 216                muxer.proc = copy_to_sideband;
 217                muxer.in = -1;
 218                code = start_async(&muxer);
 219                if (code)
 220                        return code;
 221                proc.err = muxer.in;
 222        }
 223
 224        code = start_command(&proc);
 225        if (code) {
 226                if (use_sideband)
 227                        finish_async(&muxer);
 228                return code;
 229        }
 230
 231        for (cmd = commands; cmd; cmd = cmd->next) {
 232                if (!cmd->error_string) {
 233                        size_t n = snprintf(buf, sizeof(buf), "%s %s %s\n",
 234                                sha1_to_hex(cmd->old_sha1),
 235                                sha1_to_hex(cmd->new_sha1),
 236                                cmd->ref_name);
 237                        if (write_in_full(proc.in, buf, n) != n)
 238                                break;
 239                }
 240        }
 241        close(proc.in);
 242        if (use_sideband)
 243                finish_async(&muxer);
 244        return finish_command(&proc);
 245}
 246
 247static int run_update_hook(struct command *cmd)
 248{
 249        static const char update_hook[] = "hooks/update";
 250        const char *argv[5];
 251        struct child_process proc;
 252        int code;
 253
 254        if (access(update_hook, X_OK) < 0)
 255                return 0;
 256
 257        argv[0] = update_hook;
 258        argv[1] = cmd->ref_name;
 259        argv[2] = sha1_to_hex(cmd->old_sha1);
 260        argv[3] = sha1_to_hex(cmd->new_sha1);
 261        argv[4] = NULL;
 262
 263        memset(&proc, 0, sizeof(proc));
 264        proc.no_stdin = 1;
 265        proc.stdout_to_stderr = 1;
 266        proc.err = use_sideband ? -1 : 0;
 267        proc.argv = argv;
 268
 269        code = start_command(&proc);
 270        if (code)
 271                return code;
 272        if (use_sideband)
 273                copy_to_sideband(proc.err, -1, NULL);
 274        return finish_command(&proc);
 275}
 276
 277static int is_ref_checked_out(const char *ref)
 278{
 279        if (is_bare_repository())
 280                return 0;
 281
 282        if (!head_name)
 283                return 0;
 284        return !strcmp(head_name, ref);
 285}
 286
 287static char *refuse_unconfigured_deny_msg[] = {
 288        "By default, updating the current branch in a non-bare repository",
 289        "is denied, because it will make the index and work tree inconsistent",
 290        "with what you pushed, and will require 'git reset --hard' to match",
 291        "the work tree to HEAD.",
 292        "",
 293        "You can set 'receive.denyCurrentBranch' configuration variable to",
 294        "'ignore' or 'warn' in the remote repository to allow pushing into",
 295        "its current branch; however, this is not recommended unless you",
 296        "arranged to update its work tree to match what you pushed in some",
 297        "other way.",
 298        "",
 299        "To squelch this message and still keep the default behaviour, set",
 300        "'receive.denyCurrentBranch' configuration variable to 'refuse'."
 301};
 302
 303static void refuse_unconfigured_deny(void)
 304{
 305        int i;
 306        for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
 307                rp_error("%s", refuse_unconfigured_deny_msg[i]);
 308}
 309
 310static char *refuse_unconfigured_deny_delete_current_msg[] = {
 311        "By default, deleting the current branch is denied, because the next",
 312        "'git clone' won't result in any file checked out, causing confusion.",
 313        "",
 314        "You can set 'receive.denyDeleteCurrent' configuration variable to",
 315        "'warn' or 'ignore' in the remote repository to allow deleting the",
 316        "current branch, with or without a warning message.",
 317        "",
 318        "To squelch this message, you can set it to 'refuse'."
 319};
 320
 321static void refuse_unconfigured_deny_delete_current(void)
 322{
 323        int i;
 324        for (i = 0;
 325             i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
 326             i++)
 327                rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
 328}
 329
 330static const char *update(struct command *cmd)
 331{
 332        const char *name = cmd->ref_name;
 333        unsigned char *old_sha1 = cmd->old_sha1;
 334        unsigned char *new_sha1 = cmd->new_sha1;
 335        struct ref_lock *lock;
 336
 337        /* only refs/... are allowed */
 338        if (prefixcmp(name, "refs/") || check_ref_format(name + 5)) {
 339                rp_error("refusing to create funny ref '%s' remotely", name);
 340                return "funny refname";
 341        }
 342
 343        if (is_ref_checked_out(name)) {
 344                switch (deny_current_branch) {
 345                case DENY_IGNORE:
 346                        break;
 347                case DENY_WARN:
 348                        rp_warning("updating the current branch");
 349                        break;
 350                case DENY_REFUSE:
 351                case DENY_UNCONFIGURED:
 352                        rp_error("refusing to update checked out branch: %s", name);
 353                        if (deny_current_branch == DENY_UNCONFIGURED)
 354                                refuse_unconfigured_deny();
 355                        return "branch is currently checked out";
 356                }
 357        }
 358
 359        if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
 360                error("unpack should have generated %s, "
 361                      "but I can't find it!", sha1_to_hex(new_sha1));
 362                return "bad pack";
 363        }
 364
 365        if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
 366                if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
 367                        rp_error("denying ref deletion for %s", name);
 368                        return "deletion prohibited";
 369                }
 370
 371                if (!strcmp(name, head_name)) {
 372                        switch (deny_delete_current) {
 373                        case DENY_IGNORE:
 374                                break;
 375                        case DENY_WARN:
 376                                rp_warning("deleting the current branch");
 377                                break;
 378                        case DENY_REFUSE:
 379                        case DENY_UNCONFIGURED:
 380                                if (deny_delete_current == DENY_UNCONFIGURED)
 381                                        refuse_unconfigured_deny_delete_current();
 382                                rp_error("refusing to delete the current branch: %s", name);
 383                                return "deletion of the current branch prohibited";
 384                        }
 385                }
 386        }
 387
 388        if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
 389            !is_null_sha1(old_sha1) &&
 390            !prefixcmp(name, "refs/heads/")) {
 391                struct object *old_object, *new_object;
 392                struct commit *old_commit, *new_commit;
 393                struct commit_list *bases, *ent;
 394
 395                old_object = parse_object(old_sha1);
 396                new_object = parse_object(new_sha1);
 397
 398                if (!old_object || !new_object ||
 399                    old_object->type != OBJ_COMMIT ||
 400                    new_object->type != OBJ_COMMIT) {
 401                        error("bad sha1 objects for %s", name);
 402                        return "bad ref";
 403                }
 404                old_commit = (struct commit *)old_object;
 405                new_commit = (struct commit *)new_object;
 406                bases = get_merge_bases(old_commit, new_commit, 1);
 407                for (ent = bases; ent; ent = ent->next)
 408                        if (!hashcmp(old_sha1, ent->item->object.sha1))
 409                                break;
 410                free_commit_list(bases);
 411                if (!ent) {
 412                        rp_error("denying non-fast-forward %s"
 413                                 " (you should pull first)", name);
 414                        return "non-fast-forward";
 415                }
 416        }
 417        if (run_update_hook(cmd)) {
 418                rp_error("hook declined to update %s", name);
 419                return "hook declined";
 420        }
 421
 422        if (is_null_sha1(new_sha1)) {
 423                if (!parse_object(old_sha1)) {
 424                        rp_warning("Allowing deletion of corrupt ref.");
 425                        old_sha1 = NULL;
 426                }
 427                if (delete_ref(name, old_sha1, 0)) {
 428                        rp_error("failed to delete %s", name);
 429                        return "failed to delete";
 430                }
 431                return NULL; /* good */
 432        }
 433        else {
 434                lock = lock_any_ref_for_update(name, old_sha1, 0);
 435                if (!lock) {
 436                        rp_error("failed to lock %s", name);
 437                        return "failed to lock";
 438                }
 439                if (write_ref_sha1(lock, new_sha1, "push")) {
 440                        return "failed to write"; /* error() already called */
 441                }
 442                return NULL; /* good */
 443        }
 444}
 445
 446static char update_post_hook[] = "hooks/post-update";
 447
 448static void run_update_post_hook(struct command *commands)
 449{
 450        struct command *cmd;
 451        int argc;
 452        const char **argv;
 453        struct child_process proc;
 454
 455        for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
 456                if (cmd->error_string)
 457                        continue;
 458                argc++;
 459        }
 460        if (!argc || access(update_post_hook, X_OK) < 0)
 461                return;
 462        argv = xmalloc(sizeof(*argv) * (2 + argc));
 463        argv[0] = update_post_hook;
 464
 465        for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
 466                char *p;
 467                if (cmd->error_string)
 468                        continue;
 469                p = xmalloc(strlen(cmd->ref_name) + 1);
 470                strcpy(p, cmd->ref_name);
 471                argv[argc] = p;
 472                argc++;
 473        }
 474        argv[argc] = NULL;
 475
 476        memset(&proc, 0, sizeof(proc));
 477        proc.no_stdin = 1;
 478        proc.stdout_to_stderr = 1;
 479        proc.err = use_sideband ? -1 : 0;
 480        proc.argv = argv;
 481
 482        if (!start_command(&proc)) {
 483                if (use_sideband)
 484                        copy_to_sideband(proc.err, -1, NULL);
 485                finish_command(&proc);
 486        }
 487}
 488
 489static void execute_commands(struct command *commands, const char *unpacker_error)
 490{
 491        struct command *cmd;
 492        unsigned char sha1[20];
 493
 494        if (unpacker_error) {
 495                for (cmd = commands; cmd; cmd = cmd->next)
 496                        cmd->error_string = "n/a (unpacker error)";
 497                return;
 498        }
 499
 500        if (run_receive_hook(commands, pre_receive_hook)) {
 501                for (cmd = commands; cmd; cmd = cmd->next)
 502                        cmd->error_string = "pre-receive hook declined";
 503                return;
 504        }
 505
 506        head_name = resolve_ref("HEAD", sha1, 0, NULL);
 507
 508        for (cmd = commands; cmd; cmd = cmd->next)
 509                cmd->error_string = update(cmd);
 510}
 511
 512static struct command *read_head_info(void)
 513{
 514        struct command *commands = NULL;
 515        struct command **p = &commands;
 516        for (;;) {
 517                static char line[1000];
 518                unsigned char old_sha1[20], new_sha1[20];
 519                struct command *cmd;
 520                char *refname;
 521                int len, reflen;
 522
 523                len = packet_read_line(0, line, sizeof(line));
 524                if (!len)
 525                        break;
 526                if (line[len-1] == '\n')
 527                        line[--len] = 0;
 528                if (len < 83 ||
 529                    line[40] != ' ' ||
 530                    line[81] != ' ' ||
 531                    get_sha1_hex(line, old_sha1) ||
 532                    get_sha1_hex(line + 41, new_sha1))
 533                        die("protocol error: expected old/new/ref, got '%s'",
 534                            line);
 535
 536                refname = line + 82;
 537                reflen = strlen(refname);
 538                if (reflen + 82 < len) {
 539                        if (strstr(refname + reflen + 1, "report-status"))
 540                                report_status = 1;
 541                        if (strstr(refname + reflen + 1, "side-band-64k"))
 542                                use_sideband = LARGE_PACKET_MAX;
 543                }
 544                cmd = xmalloc(sizeof(struct command) + len - 80);
 545                hashcpy(cmd->old_sha1, old_sha1);
 546                hashcpy(cmd->new_sha1, new_sha1);
 547                memcpy(cmd->ref_name, line + 82, len - 81);
 548                cmd->error_string = NULL;
 549                cmd->next = NULL;
 550                *p = cmd;
 551                p = &cmd->next;
 552        }
 553        return commands;
 554}
 555
 556static const char *parse_pack_header(struct pack_header *hdr)
 557{
 558        switch (read_pack_header(0, hdr)) {
 559        case PH_ERROR_EOF:
 560                return "eof before pack header was fully read";
 561
 562        case PH_ERROR_PACK_SIGNATURE:
 563                return "protocol error (pack signature mismatch detected)";
 564
 565        case PH_ERROR_PROTOCOL:
 566                return "protocol error (pack version unsupported)";
 567
 568        default:
 569                return "unknown error in parse_pack_header";
 570
 571        case 0:
 572                return NULL;
 573        }
 574}
 575
 576static const char *pack_lockfile;
 577
 578static const char *unpack(void)
 579{
 580        struct pack_header hdr;
 581        const char *hdr_err;
 582        char hdr_arg[38];
 583
 584        hdr_err = parse_pack_header(&hdr);
 585        if (hdr_err)
 586                return hdr_err;
 587        snprintf(hdr_arg, sizeof(hdr_arg),
 588                        "--pack_header=%"PRIu32",%"PRIu32,
 589                        ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
 590
 591        if (ntohl(hdr.hdr_entries) < unpack_limit) {
 592                int code, i = 0;
 593                const char *unpacker[4];
 594                unpacker[i++] = "unpack-objects";
 595                if (receive_fsck_objects)
 596                        unpacker[i++] = "--strict";
 597                unpacker[i++] = hdr_arg;
 598                unpacker[i++] = NULL;
 599                code = run_command_v_opt(unpacker, RUN_GIT_CMD);
 600                if (!code)
 601                        return NULL;
 602                return "unpack-objects abnormal exit";
 603        } else {
 604                const char *keeper[7];
 605                int s, status, i = 0;
 606                char keep_arg[256];
 607                struct child_process ip;
 608
 609                s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
 610                if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
 611                        strcpy(keep_arg + s, "localhost");
 612
 613                keeper[i++] = "index-pack";
 614                keeper[i++] = "--stdin";
 615                if (receive_fsck_objects)
 616                        keeper[i++] = "--strict";
 617                keeper[i++] = "--fix-thin";
 618                keeper[i++] = hdr_arg;
 619                keeper[i++] = keep_arg;
 620                keeper[i++] = NULL;
 621                memset(&ip, 0, sizeof(ip));
 622                ip.argv = keeper;
 623                ip.out = -1;
 624                ip.git_cmd = 1;
 625                status = start_command(&ip);
 626                if (status) {
 627                        return "index-pack fork failed";
 628                }
 629                pack_lockfile = index_pack_lockfile(ip.out);
 630                close(ip.out);
 631                status = finish_command(&ip);
 632                if (!status) {
 633                        reprepare_packed_git();
 634                        return NULL;
 635                }
 636                return "index-pack abnormal exit";
 637        }
 638}
 639
 640static void report(struct command *commands, const char *unpack_status)
 641{
 642        struct command *cmd;
 643        struct strbuf buf = STRBUF_INIT;
 644
 645        packet_buf_write(&buf, "unpack %s\n",
 646                         unpack_status ? unpack_status : "ok");
 647        for (cmd = commands; cmd; cmd = cmd->next) {
 648                if (!cmd->error_string)
 649                        packet_buf_write(&buf, "ok %s\n",
 650                                         cmd->ref_name);
 651                else
 652                        packet_buf_write(&buf, "ng %s %s\n",
 653                                         cmd->ref_name, cmd->error_string);
 654        }
 655        packet_buf_flush(&buf);
 656
 657        if (use_sideband)
 658                send_sideband(1, 1, buf.buf, buf.len, use_sideband);
 659        else
 660                safe_write(1, buf.buf, buf.len);
 661        strbuf_release(&buf);
 662}
 663
 664static int delete_only(struct command *commands)
 665{
 666        struct command *cmd;
 667        for (cmd = commands; cmd; cmd = cmd->next) {
 668                if (!is_null_sha1(cmd->new_sha1))
 669                        return 0;
 670        }
 671        return 1;
 672}
 673
 674static int add_refs_from_alternate(struct alternate_object_database *e, void *unused)
 675{
 676        char *other;
 677        size_t len;
 678        struct remote *remote;
 679        struct transport *transport;
 680        const struct ref *extra;
 681
 682        e->name[-1] = '\0';
 683        other = xstrdup(make_absolute_path(e->base));
 684        e->name[-1] = '/';
 685        len = strlen(other);
 686
 687        while (other[len-1] == '/')
 688                other[--len] = '\0';
 689        if (len < 8 || memcmp(other + len - 8, "/objects", 8))
 690                return 0;
 691        /* Is this a git repository with refs? */
 692        memcpy(other + len - 8, "/refs", 6);
 693        if (!is_directory(other))
 694                return 0;
 695        other[len - 8] = '\0';
 696        remote = remote_get(other);
 697        transport = transport_get(remote, other);
 698        for (extra = transport_get_remote_refs(transport);
 699             extra;
 700             extra = extra->next) {
 701                add_extra_ref(".have", extra->old_sha1, 0);
 702        }
 703        transport_disconnect(transport);
 704        free(other);
 705        return 0;
 706}
 707
 708static void add_alternate_refs(void)
 709{
 710        foreach_alt_odb(add_refs_from_alternate, NULL);
 711}
 712
 713int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 714{
 715        int advertise_refs = 0;
 716        int stateless_rpc = 0;
 717        int i;
 718        char *dir = NULL;
 719        struct command *commands;
 720
 721        argv++;
 722        for (i = 1; i < argc; i++) {
 723                const char *arg = *argv++;
 724
 725                if (*arg == '-') {
 726                        if (!strcmp(arg, "--advertise-refs")) {
 727                                advertise_refs = 1;
 728                                continue;
 729                        }
 730                        if (!strcmp(arg, "--stateless-rpc")) {
 731                                stateless_rpc = 1;
 732                                continue;
 733                        }
 734
 735                        usage(receive_pack_usage);
 736                }
 737                if (dir)
 738                        usage(receive_pack_usage);
 739                dir = xstrdup(arg);
 740        }
 741        if (!dir)
 742                usage(receive_pack_usage);
 743
 744        setup_path();
 745
 746        if (!enter_repo(dir, 0))
 747                die("'%s' does not appear to be a git repository", dir);
 748
 749        if (is_repository_shallow())
 750                die("attempt to push into a shallow repository");
 751
 752        git_config(receive_pack_config, NULL);
 753
 754        if (0 <= transfer_unpack_limit)
 755                unpack_limit = transfer_unpack_limit;
 756        else if (0 <= receive_unpack_limit)
 757                unpack_limit = receive_unpack_limit;
 758
 759        if (advertise_refs || !stateless_rpc) {
 760                add_alternate_refs();
 761                write_head_info();
 762                clear_extra_refs();
 763
 764                /* EOF */
 765                packet_flush(1);
 766        }
 767        if (advertise_refs)
 768                return 0;
 769
 770        if ((commands = read_head_info()) != NULL) {
 771                const char *unpack_status = NULL;
 772
 773                if (!delete_only(commands))
 774                        unpack_status = unpack();
 775                execute_commands(commands, unpack_status);
 776                if (pack_lockfile)
 777                        unlink_or_warn(pack_lockfile);
 778                if (report_status)
 779                        report(commands, unpack_status);
 780                run_receive_hook(commands, post_receive_hook);
 781                run_update_post_hook(commands);
 782                if (auto_gc) {
 783                        const char *argv_gc_auto[] = {
 784                                "gc", "--auto", "--quiet", NULL,
 785                        };
 786                        run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
 787                }
 788                if (auto_update_server_info)
 789                        update_server_info(0);
 790        }
 791        if (use_sideband)
 792                packet_flush(1);
 793        return 0;
 794}