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