builtin / receive-pack.con commit receive-pack: close sideband fd on early pack errors (49ecfa1)
   1#include "builtin.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#include "string-list.h"
  13#include "sha1-array.h"
  14#include "connected.h"
  15#include "version.h"
  16
  17static const char receive_pack_usage[] = "git receive-pack <git-dir>";
  18
  19enum deny_action {
  20        DENY_UNCONFIGURED,
  21        DENY_IGNORE,
  22        DENY_WARN,
  23        DENY_REFUSE
  24};
  25
  26static int deny_deletes;
  27static int deny_non_fast_forwards;
  28static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
  29static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
  30static int receive_fsck_objects = -1;
  31static int transfer_fsck_objects = -1;
  32static int receive_unpack_limit = -1;
  33static int transfer_unpack_limit = -1;
  34static int unpack_limit = 100;
  35static int report_status;
  36static int use_sideband;
  37static int quiet;
  38static int prefer_ofs_delta = 1;
  39static int auto_update_server_info;
  40static int auto_gc = 1;
  41static const char *head_name;
  42static void *head_name_to_free;
  43static int sent_capabilities;
  44
  45static enum deny_action parse_deny_action(const char *var, const char *value)
  46{
  47        if (value) {
  48                if (!strcasecmp(value, "ignore"))
  49                        return DENY_IGNORE;
  50                if (!strcasecmp(value, "warn"))
  51                        return DENY_WARN;
  52                if (!strcasecmp(value, "refuse"))
  53                        return DENY_REFUSE;
  54        }
  55        if (git_config_bool(var, value))
  56                return DENY_REFUSE;
  57        return DENY_IGNORE;
  58}
  59
  60static int receive_pack_config(const char *var, const char *value, void *cb)
  61{
  62        if (strcmp(var, "receive.denydeletes") == 0) {
  63                deny_deletes = git_config_bool(var, value);
  64                return 0;
  65        }
  66
  67        if (strcmp(var, "receive.denynonfastforwards") == 0) {
  68                deny_non_fast_forwards = git_config_bool(var, value);
  69                return 0;
  70        }
  71
  72        if (strcmp(var, "receive.unpacklimit") == 0) {
  73                receive_unpack_limit = git_config_int(var, value);
  74                return 0;
  75        }
  76
  77        if (strcmp(var, "transfer.unpacklimit") == 0) {
  78                transfer_unpack_limit = git_config_int(var, value);
  79                return 0;
  80        }
  81
  82        if (strcmp(var, "receive.fsckobjects") == 0) {
  83                receive_fsck_objects = git_config_bool(var, value);
  84                return 0;
  85        }
  86
  87        if (strcmp(var, "transfer.fsckobjects") == 0) {
  88                transfer_fsck_objects = git_config_bool(var, value);
  89                return 0;
  90        }
  91
  92        if (!strcmp(var, "receive.denycurrentbranch")) {
  93                deny_current_branch = parse_deny_action(var, value);
  94                return 0;
  95        }
  96
  97        if (strcmp(var, "receive.denydeletecurrent") == 0) {
  98                deny_delete_current = parse_deny_action(var, value);
  99                return 0;
 100        }
 101
 102        if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
 103                prefer_ofs_delta = git_config_bool(var, value);
 104                return 0;
 105        }
 106
 107        if (strcmp(var, "receive.updateserverinfo") == 0) {
 108                auto_update_server_info = git_config_bool(var, value);
 109                return 0;
 110        }
 111
 112        if (strcmp(var, "receive.autogc") == 0) {
 113                auto_gc = git_config_bool(var, value);
 114                return 0;
 115        }
 116
 117        return git_default_config(var, value, cb);
 118}
 119
 120static void show_ref(const char *path, const unsigned char *sha1)
 121{
 122        if (sent_capabilities)
 123                packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
 124        else
 125                packet_write(1, "%s %s%c%s%s agent=%s\n",
 126                             sha1_to_hex(sha1), path, 0,
 127                             " report-status delete-refs side-band-64k quiet",
 128                             prefer_ofs_delta ? " ofs-delta" : "",
 129                             git_user_agent_sanitized());
 130        sent_capabilities = 1;
 131}
 132
 133static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
 134{
 135        path = strip_namespace(path);
 136        /*
 137         * Advertise refs outside our current namespace as ".have"
 138         * refs, so that the client can use them to minimize data
 139         * transfer but will otherwise ignore them. This happens to
 140         * cover ".have" that are thrown in by add_one_alternate_ref()
 141         * to mark histories that are complete in our alternates as
 142         * well.
 143         */
 144        if (!path)
 145                path = ".have";
 146        show_ref(path, sha1);
 147        return 0;
 148}
 149
 150static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
 151{
 152        show_ref(".have", sha1);
 153}
 154
 155static void collect_one_alternate_ref(const struct ref *ref, void *data)
 156{
 157        struct sha1_array *sa = data;
 158        sha1_array_append(sa, ref->old_sha1);
 159}
 160
 161static void write_head_info(void)
 162{
 163        struct sha1_array sa = SHA1_ARRAY_INIT;
 164        for_each_alternate_ref(collect_one_alternate_ref, &sa);
 165        sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
 166        sha1_array_clear(&sa);
 167        for_each_ref(show_ref_cb, NULL);
 168        if (!sent_capabilities)
 169                show_ref("capabilities^{}", null_sha1);
 170
 171        /* EOF */
 172        packet_flush(1);
 173}
 174
 175struct command {
 176        struct command *next;
 177        const char *error_string;
 178        unsigned int skip_update:1,
 179                     did_not_exist:1;
 180        unsigned char old_sha1[20];
 181        unsigned char new_sha1[20];
 182        char ref_name[FLEX_ARRAY]; /* more */
 183};
 184
 185static const char pre_receive_hook[] = "hooks/pre-receive";
 186static const char post_receive_hook[] = "hooks/post-receive";
 187
 188static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 189static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 190
 191static void report_message(const char *prefix, const char *err, va_list params)
 192{
 193        int sz = strlen(prefix);
 194        char msg[4096];
 195
 196        strncpy(msg, prefix, sz);
 197        sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
 198        if (sz > (sizeof(msg) - 1))
 199                sz = sizeof(msg) - 1;
 200        msg[sz++] = '\n';
 201
 202        if (use_sideband)
 203                send_sideband(1, 2, msg, sz, use_sideband);
 204        else
 205                xwrite(2, msg, sz);
 206}
 207
 208static void rp_warning(const char *err, ...)
 209{
 210        va_list params;
 211        va_start(params, err);
 212        report_message("warning: ", err, params);
 213        va_end(params);
 214}
 215
 216static void rp_error(const char *err, ...)
 217{
 218        va_list params;
 219        va_start(params, err);
 220        report_message("error: ", err, params);
 221        va_end(params);
 222}
 223
 224static int copy_to_sideband(int in, int out, void *arg)
 225{
 226        char data[128];
 227        while (1) {
 228                ssize_t sz = xread(in, data, sizeof(data));
 229                if (sz <= 0)
 230                        break;
 231                send_sideband(1, 2, data, sz, use_sideband);
 232        }
 233        close(in);
 234        return 0;
 235}
 236
 237typedef int (*feed_fn)(void *, const char **, size_t *);
 238static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
 239{
 240        struct child_process proc;
 241        struct async muxer;
 242        const char *argv[2];
 243        int code;
 244
 245        if (access(hook_name, X_OK) < 0)
 246                return 0;
 247
 248        argv[0] = hook_name;
 249        argv[1] = NULL;
 250
 251        memset(&proc, 0, sizeof(proc));
 252        proc.argv = argv;
 253        proc.in = -1;
 254        proc.stdout_to_stderr = 1;
 255
 256        if (use_sideband) {
 257                memset(&muxer, 0, sizeof(muxer));
 258                muxer.proc = copy_to_sideband;
 259                muxer.in = -1;
 260                code = start_async(&muxer);
 261                if (code)
 262                        return code;
 263                proc.err = muxer.in;
 264        }
 265
 266        code = start_command(&proc);
 267        if (code) {
 268                if (use_sideband)
 269                        finish_async(&muxer);
 270                return code;
 271        }
 272
 273        while (1) {
 274                const char *buf;
 275                size_t n;
 276                if (feed(feed_state, &buf, &n))
 277                        break;
 278                if (write_in_full(proc.in, buf, n) != n)
 279                        break;
 280        }
 281        close(proc.in);
 282        if (use_sideband)
 283                finish_async(&muxer);
 284        return finish_command(&proc);
 285}
 286
 287struct receive_hook_feed_state {
 288        struct command *cmd;
 289        int skip_broken;
 290        struct strbuf buf;
 291};
 292
 293static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
 294{
 295        struct receive_hook_feed_state *state = state_;
 296        struct command *cmd = state->cmd;
 297
 298        while (cmd &&
 299               state->skip_broken && (cmd->error_string || cmd->did_not_exist))
 300                cmd = cmd->next;
 301        if (!cmd)
 302                return -1; /* EOF */
 303        strbuf_reset(&state->buf);
 304        strbuf_addf(&state->buf, "%s %s %s\n",
 305                    sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
 306                    cmd->ref_name);
 307        state->cmd = cmd->next;
 308        if (bufp) {
 309                *bufp = state->buf.buf;
 310                *sizep = state->buf.len;
 311        }
 312        return 0;
 313}
 314
 315static int run_receive_hook(struct command *commands, const char *hook_name,
 316                            int skip_broken)
 317{
 318        struct receive_hook_feed_state state;
 319        int status;
 320
 321        strbuf_init(&state.buf, 0);
 322        state.cmd = commands;
 323        state.skip_broken = skip_broken;
 324        if (feed_receive_hook(&state, NULL, NULL))
 325                return 0;
 326        state.cmd = commands;
 327        status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
 328        strbuf_release(&state.buf);
 329        return status;
 330}
 331
 332static int run_update_hook(struct command *cmd)
 333{
 334        static const char update_hook[] = "hooks/update";
 335        const char *argv[5];
 336        struct child_process proc;
 337        int code;
 338
 339        if (access(update_hook, X_OK) < 0)
 340                return 0;
 341
 342        argv[0] = update_hook;
 343        argv[1] = cmd->ref_name;
 344        argv[2] = sha1_to_hex(cmd->old_sha1);
 345        argv[3] = sha1_to_hex(cmd->new_sha1);
 346        argv[4] = NULL;
 347
 348        memset(&proc, 0, sizeof(proc));
 349        proc.no_stdin = 1;
 350        proc.stdout_to_stderr = 1;
 351        proc.err = use_sideband ? -1 : 0;
 352        proc.argv = argv;
 353
 354        code = start_command(&proc);
 355        if (code)
 356                return code;
 357        if (use_sideband)
 358                copy_to_sideband(proc.err, -1, NULL);
 359        return finish_command(&proc);
 360}
 361
 362static int is_ref_checked_out(const char *ref)
 363{
 364        if (is_bare_repository())
 365                return 0;
 366
 367        if (!head_name)
 368                return 0;
 369        return !strcmp(head_name, ref);
 370}
 371
 372static char *refuse_unconfigured_deny_msg[] = {
 373        "By default, updating the current branch in a non-bare repository",
 374        "is denied, because it will make the index and work tree inconsistent",
 375        "with what you pushed, and will require 'git reset --hard' to match",
 376        "the work tree to HEAD.",
 377        "",
 378        "You can set 'receive.denyCurrentBranch' configuration variable to",
 379        "'ignore' or 'warn' in the remote repository to allow pushing into",
 380        "its current branch; however, this is not recommended unless you",
 381        "arranged to update its work tree to match what you pushed in some",
 382        "other way.",
 383        "",
 384        "To squelch this message and still keep the default behaviour, set",
 385        "'receive.denyCurrentBranch' configuration variable to 'refuse'."
 386};
 387
 388static void refuse_unconfigured_deny(void)
 389{
 390        int i;
 391        for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
 392                rp_error("%s", refuse_unconfigured_deny_msg[i]);
 393}
 394
 395static char *refuse_unconfigured_deny_delete_current_msg[] = {
 396        "By default, deleting the current branch is denied, because the next",
 397        "'git clone' won't result in any file checked out, causing confusion.",
 398        "",
 399        "You can set 'receive.denyDeleteCurrent' configuration variable to",
 400        "'warn' or 'ignore' in the remote repository to allow deleting the",
 401        "current branch, with or without a warning message.",
 402        "",
 403        "To squelch this message, you can set it to 'refuse'."
 404};
 405
 406static void refuse_unconfigured_deny_delete_current(void)
 407{
 408        int i;
 409        for (i = 0;
 410             i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
 411             i++)
 412                rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
 413}
 414
 415static const char *update(struct command *cmd)
 416{
 417        const char *name = cmd->ref_name;
 418        struct strbuf namespaced_name_buf = STRBUF_INIT;
 419        const char *namespaced_name;
 420        unsigned char *old_sha1 = cmd->old_sha1;
 421        unsigned char *new_sha1 = cmd->new_sha1;
 422        struct ref_lock *lock;
 423
 424        /* only refs/... are allowed */
 425        if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
 426                rp_error("refusing to create funny ref '%s' remotely", name);
 427                return "funny refname";
 428        }
 429
 430        strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
 431        namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
 432
 433        if (is_ref_checked_out(namespaced_name)) {
 434                switch (deny_current_branch) {
 435                case DENY_IGNORE:
 436                        break;
 437                case DENY_WARN:
 438                        rp_warning("updating the current branch");
 439                        break;
 440                case DENY_REFUSE:
 441                case DENY_UNCONFIGURED:
 442                        rp_error("refusing to update checked out branch: %s", name);
 443                        if (deny_current_branch == DENY_UNCONFIGURED)
 444                                refuse_unconfigured_deny();
 445                        return "branch is currently checked out";
 446                }
 447        }
 448
 449        if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
 450                error("unpack should have generated %s, "
 451                      "but I can't find it!", sha1_to_hex(new_sha1));
 452                return "bad pack";
 453        }
 454
 455        if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
 456                if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
 457                        rp_error("denying ref deletion for %s", name);
 458                        return "deletion prohibited";
 459                }
 460
 461                if (!strcmp(namespaced_name, head_name)) {
 462                        switch (deny_delete_current) {
 463                        case DENY_IGNORE:
 464                                break;
 465                        case DENY_WARN:
 466                                rp_warning("deleting the current branch");
 467                                break;
 468                        case DENY_REFUSE:
 469                        case DENY_UNCONFIGURED:
 470                                if (deny_delete_current == DENY_UNCONFIGURED)
 471                                        refuse_unconfigured_deny_delete_current();
 472                                rp_error("refusing to delete the current branch: %s", name);
 473                                return "deletion of the current branch prohibited";
 474                        }
 475                }
 476        }
 477
 478        if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
 479            !is_null_sha1(old_sha1) &&
 480            !prefixcmp(name, "refs/heads/")) {
 481                struct object *old_object, *new_object;
 482                struct commit *old_commit, *new_commit;
 483
 484                old_object = parse_object(old_sha1);
 485                new_object = parse_object(new_sha1);
 486
 487                if (!old_object || !new_object ||
 488                    old_object->type != OBJ_COMMIT ||
 489                    new_object->type != OBJ_COMMIT) {
 490                        error("bad sha1 objects for %s", name);
 491                        return "bad ref";
 492                }
 493                old_commit = (struct commit *)old_object;
 494                new_commit = (struct commit *)new_object;
 495                if (!in_merge_bases(old_commit, new_commit)) {
 496                        rp_error("denying non-fast-forward %s"
 497                                 " (you should pull first)", name);
 498                        return "non-fast-forward";
 499                }
 500        }
 501        if (run_update_hook(cmd)) {
 502                rp_error("hook declined to update %s", name);
 503                return "hook declined";
 504        }
 505
 506        if (is_null_sha1(new_sha1)) {
 507                if (!parse_object(old_sha1)) {
 508                        old_sha1 = NULL;
 509                        if (ref_exists(name)) {
 510                                rp_warning("Allowing deletion of corrupt ref.");
 511                        } else {
 512                                rp_warning("Deleting a non-existent ref.");
 513                                cmd->did_not_exist = 1;
 514                        }
 515                }
 516                if (delete_ref(namespaced_name, old_sha1, 0)) {
 517                        rp_error("failed to delete %s", name);
 518                        return "failed to delete";
 519                }
 520                return NULL; /* good */
 521        }
 522        else {
 523                lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
 524                if (!lock) {
 525                        rp_error("failed to lock %s", name);
 526                        return "failed to lock";
 527                }
 528                if (write_ref_sha1(lock, new_sha1, "push")) {
 529                        return "failed to write"; /* error() already called */
 530                }
 531                return NULL; /* good */
 532        }
 533}
 534
 535static char update_post_hook[] = "hooks/post-update";
 536
 537static void run_update_post_hook(struct command *commands)
 538{
 539        struct command *cmd;
 540        int argc;
 541        const char **argv;
 542        struct child_process proc;
 543
 544        for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
 545                if (cmd->error_string || cmd->did_not_exist)
 546                        continue;
 547                argc++;
 548        }
 549        if (!argc || access(update_post_hook, X_OK) < 0)
 550                return;
 551        argv = xmalloc(sizeof(*argv) * (2 + argc));
 552        argv[0] = update_post_hook;
 553
 554        for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
 555                char *p;
 556                if (cmd->error_string || cmd->did_not_exist)
 557                        continue;
 558                p = xmalloc(strlen(cmd->ref_name) + 1);
 559                strcpy(p, cmd->ref_name);
 560                argv[argc] = p;
 561                argc++;
 562        }
 563        argv[argc] = NULL;
 564
 565        memset(&proc, 0, sizeof(proc));
 566        proc.no_stdin = 1;
 567        proc.stdout_to_stderr = 1;
 568        proc.err = use_sideband ? -1 : 0;
 569        proc.argv = argv;
 570
 571        if (!start_command(&proc)) {
 572                if (use_sideband)
 573                        copy_to_sideband(proc.err, -1, NULL);
 574                finish_command(&proc);
 575        }
 576}
 577
 578static void check_aliased_update(struct command *cmd, struct string_list *list)
 579{
 580        struct strbuf buf = STRBUF_INIT;
 581        const char *dst_name;
 582        struct string_list_item *item;
 583        struct command *dst_cmd;
 584        unsigned char sha1[20];
 585        char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
 586        int flag;
 587
 588        strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
 589        dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
 590        strbuf_release(&buf);
 591
 592        if (!(flag & REF_ISSYMREF))
 593                return;
 594
 595        dst_name = strip_namespace(dst_name);
 596        if (!dst_name) {
 597                rp_error("refusing update to broken symref '%s'", cmd->ref_name);
 598                cmd->skip_update = 1;
 599                cmd->error_string = "broken symref";
 600                return;
 601        }
 602
 603        if ((item = string_list_lookup(list, dst_name)) == NULL)
 604                return;
 605
 606        cmd->skip_update = 1;
 607
 608        dst_cmd = (struct command *) item->util;
 609
 610        if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
 611            !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
 612                return;
 613
 614        dst_cmd->skip_update = 1;
 615
 616        strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
 617        strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
 618        strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
 619        strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
 620        rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
 621                 " its target '%s' (%s..%s)",
 622                 cmd->ref_name, cmd_oldh, cmd_newh,
 623                 dst_cmd->ref_name, dst_oldh, dst_newh);
 624
 625        cmd->error_string = dst_cmd->error_string =
 626                "inconsistent aliased update";
 627}
 628
 629static void check_aliased_updates(struct command *commands)
 630{
 631        struct command *cmd;
 632        struct string_list ref_list = STRING_LIST_INIT_NODUP;
 633
 634        for (cmd = commands; cmd; cmd = cmd->next) {
 635                struct string_list_item *item =
 636                        string_list_append(&ref_list, cmd->ref_name);
 637                item->util = (void *)cmd;
 638        }
 639        sort_string_list(&ref_list);
 640
 641        for (cmd = commands; cmd; cmd = cmd->next) {
 642                if (!cmd->error_string)
 643                        check_aliased_update(cmd, &ref_list);
 644        }
 645
 646        string_list_clear(&ref_list, 0);
 647}
 648
 649static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
 650{
 651        struct command **cmd_list = cb_data;
 652        struct command *cmd = *cmd_list;
 653
 654        if (!cmd || is_null_sha1(cmd->new_sha1))
 655                return -1; /* end of list */
 656        *cmd_list = NULL; /* this returns only one */
 657        hashcpy(sha1, cmd->new_sha1);
 658        return 0;
 659}
 660
 661static void set_connectivity_errors(struct command *commands)
 662{
 663        struct command *cmd;
 664
 665        for (cmd = commands; cmd; cmd = cmd->next) {
 666                struct command *singleton = cmd;
 667                if (!check_everything_connected(command_singleton_iterator,
 668                                                0, &singleton))
 669                        continue;
 670                cmd->error_string = "missing necessary objects";
 671        }
 672}
 673
 674static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
 675{
 676        struct command **cmd_list = cb_data;
 677        struct command *cmd = *cmd_list;
 678
 679        while (cmd) {
 680                if (!is_null_sha1(cmd->new_sha1)) {
 681                        hashcpy(sha1, cmd->new_sha1);
 682                        *cmd_list = cmd->next;
 683                        return 0;
 684                }
 685                cmd = cmd->next;
 686        }
 687        *cmd_list = NULL;
 688        return -1; /* end of list */
 689}
 690
 691static void execute_commands(struct command *commands, const char *unpacker_error)
 692{
 693        struct command *cmd;
 694        unsigned char sha1[20];
 695
 696        if (unpacker_error) {
 697                for (cmd = commands; cmd; cmd = cmd->next)
 698                        cmd->error_string = "unpacker error";
 699                return;
 700        }
 701
 702        cmd = commands;
 703        if (check_everything_connected(iterate_receive_command_list,
 704                                       0, &cmd))
 705                set_connectivity_errors(commands);
 706
 707        if (run_receive_hook(commands, pre_receive_hook, 0)) {
 708                for (cmd = commands; cmd; cmd = cmd->next) {
 709                        if (!cmd->error_string)
 710                                cmd->error_string = "pre-receive hook declined";
 711                }
 712                return;
 713        }
 714
 715        check_aliased_updates(commands);
 716
 717        free(head_name_to_free);
 718        head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
 719
 720        for (cmd = commands; cmd; cmd = cmd->next) {
 721                if (cmd->error_string)
 722                        continue;
 723
 724                if (cmd->skip_update)
 725                        continue;
 726
 727                cmd->error_string = update(cmd);
 728        }
 729}
 730
 731static struct command *read_head_info(void)
 732{
 733        struct command *commands = NULL;
 734        struct command **p = &commands;
 735        for (;;) {
 736                static char line[1000];
 737                unsigned char old_sha1[20], new_sha1[20];
 738                struct command *cmd;
 739                char *refname;
 740                int len, reflen;
 741
 742                len = packet_read_line(0, line, sizeof(line));
 743                if (!len)
 744                        break;
 745                if (line[len-1] == '\n')
 746                        line[--len] = 0;
 747                if (len < 83 ||
 748                    line[40] != ' ' ||
 749                    line[81] != ' ' ||
 750                    get_sha1_hex(line, old_sha1) ||
 751                    get_sha1_hex(line + 41, new_sha1))
 752                        die("protocol error: expected old/new/ref, got '%s'",
 753                            line);
 754
 755                refname = line + 82;
 756                reflen = strlen(refname);
 757                if (reflen + 82 < len) {
 758                        const char *feature_list = refname + reflen + 1;
 759                        if (parse_feature_request(feature_list, "report-status"))
 760                                report_status = 1;
 761                        if (parse_feature_request(feature_list, "side-band-64k"))
 762                                use_sideband = LARGE_PACKET_MAX;
 763                        if (parse_feature_request(feature_list, "quiet"))
 764                                quiet = 1;
 765                }
 766                cmd = xcalloc(1, sizeof(struct command) + len - 80);
 767                hashcpy(cmd->old_sha1, old_sha1);
 768                hashcpy(cmd->new_sha1, new_sha1);
 769                memcpy(cmd->ref_name, line + 82, len - 81);
 770                *p = cmd;
 771                p = &cmd->next;
 772        }
 773        return commands;
 774}
 775
 776static const char *parse_pack_header(struct pack_header *hdr)
 777{
 778        switch (read_pack_header(0, hdr)) {
 779        case PH_ERROR_EOF:
 780                return "eof before pack header was fully read";
 781
 782        case PH_ERROR_PACK_SIGNATURE:
 783                return "protocol error (pack signature mismatch detected)";
 784
 785        case PH_ERROR_PROTOCOL:
 786                return "protocol error (pack version unsupported)";
 787
 788        default:
 789                return "unknown error in parse_pack_header";
 790
 791        case 0:
 792                return NULL;
 793        }
 794}
 795
 796static const char *pack_lockfile;
 797
 798static const char *unpack(int err_fd)
 799{
 800        struct pack_header hdr;
 801        const char *hdr_err;
 802        char hdr_arg[38];
 803        int fsck_objects = (receive_fsck_objects >= 0
 804                            ? receive_fsck_objects
 805                            : transfer_fsck_objects >= 0
 806                            ? transfer_fsck_objects
 807                            : 0);
 808
 809        hdr_err = parse_pack_header(&hdr);
 810        if (hdr_err) {
 811                if (err_fd > 0)
 812                        close(err_fd);
 813                return hdr_err;
 814        }
 815        snprintf(hdr_arg, sizeof(hdr_arg),
 816                        "--pack_header=%"PRIu32",%"PRIu32,
 817                        ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
 818
 819        if (ntohl(hdr.hdr_entries) < unpack_limit) {
 820                int code, i = 0;
 821                struct child_process child;
 822                const char *unpacker[5];
 823                unpacker[i++] = "unpack-objects";
 824                if (quiet)
 825                        unpacker[i++] = "-q";
 826                if (fsck_objects)
 827                        unpacker[i++] = "--strict";
 828                unpacker[i++] = hdr_arg;
 829                unpacker[i++] = NULL;
 830                memset(&child, 0, sizeof(child));
 831                child.argv = unpacker;
 832                child.no_stdout = 1;
 833                child.err = err_fd;
 834                child.git_cmd = 1;
 835                code = run_command(&child);
 836                if (!code)
 837                        return NULL;
 838                return "unpack-objects abnormal exit";
 839        } else {
 840                const char *keeper[7];
 841                int s, status, i = 0;
 842                char keep_arg[256];
 843                struct child_process ip;
 844
 845                s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
 846                if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
 847                        strcpy(keep_arg + s, "localhost");
 848
 849                keeper[i++] = "index-pack";
 850                keeper[i++] = "--stdin";
 851                if (fsck_objects)
 852                        keeper[i++] = "--strict";
 853                keeper[i++] = "--fix-thin";
 854                keeper[i++] = hdr_arg;
 855                keeper[i++] = keep_arg;
 856                keeper[i++] = NULL;
 857                memset(&ip, 0, sizeof(ip));
 858                ip.argv = keeper;
 859                ip.out = -1;
 860                ip.err = err_fd;
 861                ip.git_cmd = 1;
 862                status = start_command(&ip);
 863                if (status) {
 864                        return "index-pack fork failed";
 865                }
 866                pack_lockfile = index_pack_lockfile(ip.out);
 867                close(ip.out);
 868                status = finish_command(&ip);
 869                if (!status) {
 870                        reprepare_packed_git();
 871                        return NULL;
 872                }
 873                return "index-pack abnormal exit";
 874        }
 875}
 876
 877static const char *unpack_with_sideband(void)
 878{
 879        struct async muxer;
 880        const char *ret;
 881
 882        if (!use_sideband)
 883                return unpack(0);
 884
 885        memset(&muxer, 0, sizeof(muxer));
 886        muxer.proc = copy_to_sideband;
 887        muxer.in = -1;
 888        if (start_async(&muxer))
 889                return NULL;
 890
 891        ret = unpack(muxer.in);
 892
 893        finish_async(&muxer);
 894        return ret;
 895}
 896
 897static void report(struct command *commands, const char *unpack_status)
 898{
 899        struct command *cmd;
 900        struct strbuf buf = STRBUF_INIT;
 901
 902        packet_buf_write(&buf, "unpack %s\n",
 903                         unpack_status ? unpack_status : "ok");
 904        for (cmd = commands; cmd; cmd = cmd->next) {
 905                if (!cmd->error_string)
 906                        packet_buf_write(&buf, "ok %s\n",
 907                                         cmd->ref_name);
 908                else
 909                        packet_buf_write(&buf, "ng %s %s\n",
 910                                         cmd->ref_name, cmd->error_string);
 911        }
 912        packet_buf_flush(&buf);
 913
 914        if (use_sideband)
 915                send_sideband(1, 1, buf.buf, buf.len, use_sideband);
 916        else
 917                safe_write(1, buf.buf, buf.len);
 918        strbuf_release(&buf);
 919}
 920
 921static int delete_only(struct command *commands)
 922{
 923        struct command *cmd;
 924        for (cmd = commands; cmd; cmd = cmd->next) {
 925                if (!is_null_sha1(cmd->new_sha1))
 926                        return 0;
 927        }
 928        return 1;
 929}
 930
 931int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 932{
 933        int advertise_refs = 0;
 934        int stateless_rpc = 0;
 935        int i;
 936        char *dir = NULL;
 937        struct command *commands;
 938
 939        packet_trace_identity("receive-pack");
 940
 941        argv++;
 942        for (i = 1; i < argc; i++) {
 943                const char *arg = *argv++;
 944
 945                if (*arg == '-') {
 946                        if (!strcmp(arg, "--quiet")) {
 947                                quiet = 1;
 948                                continue;
 949                        }
 950
 951                        if (!strcmp(arg, "--advertise-refs")) {
 952                                advertise_refs = 1;
 953                                continue;
 954                        }
 955                        if (!strcmp(arg, "--stateless-rpc")) {
 956                                stateless_rpc = 1;
 957                                continue;
 958                        }
 959
 960                        usage(receive_pack_usage);
 961                }
 962                if (dir)
 963                        usage(receive_pack_usage);
 964                dir = xstrdup(arg);
 965        }
 966        if (!dir)
 967                usage(receive_pack_usage);
 968
 969        setup_path();
 970
 971        if (!enter_repo(dir, 0))
 972                die("'%s' does not appear to be a git repository", dir);
 973
 974        if (is_repository_shallow())
 975                die("attempt to push into a shallow repository");
 976
 977        git_config(receive_pack_config, NULL);
 978
 979        if (0 <= transfer_unpack_limit)
 980                unpack_limit = transfer_unpack_limit;
 981        else if (0 <= receive_unpack_limit)
 982                unpack_limit = receive_unpack_limit;
 983
 984        if (advertise_refs || !stateless_rpc) {
 985                write_head_info();
 986        }
 987        if (advertise_refs)
 988                return 0;
 989
 990        if ((commands = read_head_info()) != NULL) {
 991                const char *unpack_status = NULL;
 992
 993                if (!delete_only(commands))
 994                        unpack_status = unpack_with_sideband();
 995                execute_commands(commands, unpack_status);
 996                if (pack_lockfile)
 997                        unlink_or_warn(pack_lockfile);
 998                if (report_status)
 999                        report(commands, unpack_status);
1000                run_receive_hook(commands, post_receive_hook, 1);
1001                run_update_post_hook(commands);
1002                if (auto_gc) {
1003                        const char *argv_gc_auto[] = {
1004                                "gc", "--auto", "--quiet", NULL,
1005                        };
1006                        int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1007                        run_command_v_opt(argv_gc_auto, opt);
1008                }
1009                if (auto_update_server_info)
1010                        update_server_info(0);
1011        }
1012        if (use_sideband)
1013                packet_flush(1);
1014        return 0;
1015}