builtin / receive-pack.con commit Merge branch 'jk/gitweb-with-newer-cgi-multi-param' into maint (0b5c641)
   1#include "builtin.h"
   2#include "lockfile.h"
   3#include "pack.h"
   4#include "refs.h"
   5#include "pkt-line.h"
   6#include "sideband.h"
   7#include "run-command.h"
   8#include "exec_cmd.h"
   9#include "commit.h"
  10#include "object.h"
  11#include "remote.h"
  12#include "connect.h"
  13#include "transport.h"
  14#include "string-list.h"
  15#include "sha1-array.h"
  16#include "connected.h"
  17#include "argv-array.h"
  18#include "version.h"
  19#include "tag.h"
  20#include "gpg-interface.h"
  21#include "sigchain.h"
  22
  23static const char receive_pack_usage[] = "git receive-pack <git-dir>";
  24
  25enum deny_action {
  26        DENY_UNCONFIGURED,
  27        DENY_IGNORE,
  28        DENY_WARN,
  29        DENY_REFUSE
  30};
  31
  32static int deny_deletes;
  33static int deny_non_fast_forwards;
  34static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
  35static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
  36static int receive_fsck_objects = -1;
  37static int transfer_fsck_objects = -1;
  38static int receive_unpack_limit = -1;
  39static int transfer_unpack_limit = -1;
  40static int unpack_limit = 100;
  41static int report_status;
  42static int use_sideband;
  43static int quiet;
  44static int prefer_ofs_delta = 1;
  45static int auto_update_server_info;
  46static int auto_gc = 1;
  47static int fix_thin = 1;
  48static int stateless_rpc;
  49static const char *service_dir;
  50static const char *head_name;
  51static void *head_name_to_free;
  52static int sent_capabilities;
  53static int shallow_update;
  54static const char *alt_shallow_file;
  55static struct strbuf push_cert = STRBUF_INIT;
  56static unsigned char push_cert_sha1[20];
  57static struct signature_check sigcheck;
  58static const char *push_cert_nonce;
  59static const char *cert_nonce_seed;
  60
  61static const char *NONCE_UNSOLICITED = "UNSOLICITED";
  62static const char *NONCE_BAD = "BAD";
  63static const char *NONCE_MISSING = "MISSING";
  64static const char *NONCE_OK = "OK";
  65static const char *NONCE_SLOP = "SLOP";
  66static const char *nonce_status;
  67static long nonce_stamp_slop;
  68static unsigned long nonce_stamp_slop_limit;
  69
  70static enum deny_action parse_deny_action(const char *var, const char *value)
  71{
  72        if (value) {
  73                if (!strcasecmp(value, "ignore"))
  74                        return DENY_IGNORE;
  75                if (!strcasecmp(value, "warn"))
  76                        return DENY_WARN;
  77                if (!strcasecmp(value, "refuse"))
  78                        return DENY_REFUSE;
  79        }
  80        if (git_config_bool(var, value))
  81                return DENY_REFUSE;
  82        return DENY_IGNORE;
  83}
  84
  85static int receive_pack_config(const char *var, const char *value, void *cb)
  86{
  87        int status = parse_hide_refs_config(var, value, "receive");
  88
  89        if (status)
  90                return status;
  91
  92        if (strcmp(var, "receive.denydeletes") == 0) {
  93                deny_deletes = git_config_bool(var, value);
  94                return 0;
  95        }
  96
  97        if (strcmp(var, "receive.denynonfastforwards") == 0) {
  98                deny_non_fast_forwards = git_config_bool(var, value);
  99                return 0;
 100        }
 101
 102        if (strcmp(var, "receive.unpacklimit") == 0) {
 103                receive_unpack_limit = git_config_int(var, value);
 104                return 0;
 105        }
 106
 107        if (strcmp(var, "transfer.unpacklimit") == 0) {
 108                transfer_unpack_limit = git_config_int(var, value);
 109                return 0;
 110        }
 111
 112        if (strcmp(var, "receive.fsckobjects") == 0) {
 113                receive_fsck_objects = git_config_bool(var, value);
 114                return 0;
 115        }
 116
 117        if (strcmp(var, "transfer.fsckobjects") == 0) {
 118                transfer_fsck_objects = git_config_bool(var, value);
 119                return 0;
 120        }
 121
 122        if (!strcmp(var, "receive.denycurrentbranch")) {
 123                deny_current_branch = parse_deny_action(var, value);
 124                return 0;
 125        }
 126
 127        if (strcmp(var, "receive.denydeletecurrent") == 0) {
 128                deny_delete_current = parse_deny_action(var, value);
 129                return 0;
 130        }
 131
 132        if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
 133                prefer_ofs_delta = git_config_bool(var, value);
 134                return 0;
 135        }
 136
 137        if (strcmp(var, "receive.updateserverinfo") == 0) {
 138                auto_update_server_info = git_config_bool(var, value);
 139                return 0;
 140        }
 141
 142        if (strcmp(var, "receive.autogc") == 0) {
 143                auto_gc = git_config_bool(var, value);
 144                return 0;
 145        }
 146
 147        if (strcmp(var, "receive.shallowupdate") == 0) {
 148                shallow_update = git_config_bool(var, value);
 149                return 0;
 150        }
 151
 152        if (strcmp(var, "receive.certnonceseed") == 0)
 153                return git_config_string(&cert_nonce_seed, var, value);
 154
 155        if (strcmp(var, "receive.certnonceslop") == 0) {
 156                nonce_stamp_slop_limit = git_config_ulong(var, value);
 157                return 0;
 158        }
 159
 160        return git_default_config(var, value, cb);
 161}
 162
 163static void show_ref(const char *path, const unsigned char *sha1)
 164{
 165        if (ref_is_hidden(path))
 166                return;
 167
 168        if (sent_capabilities) {
 169                packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
 170        } else {
 171                struct strbuf cap = STRBUF_INIT;
 172
 173                strbuf_addstr(&cap,
 174                              "report-status delete-refs side-band-64k quiet");
 175                if (prefer_ofs_delta)
 176                        strbuf_addstr(&cap, " ofs-delta");
 177                if (push_cert_nonce)
 178                        strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
 179                strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
 180                packet_write(1, "%s %s%c%s\n",
 181                             sha1_to_hex(sha1), path, 0, cap.buf);
 182                strbuf_release(&cap);
 183                sent_capabilities = 1;
 184        }
 185}
 186
 187static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
 188{
 189        path = strip_namespace(path);
 190        /*
 191         * Advertise refs outside our current namespace as ".have"
 192         * refs, so that the client can use them to minimize data
 193         * transfer but will otherwise ignore them. This happens to
 194         * cover ".have" that are thrown in by add_one_alternate_ref()
 195         * to mark histories that are complete in our alternates as
 196         * well.
 197         */
 198        if (!path)
 199                path = ".have";
 200        show_ref(path, sha1);
 201        return 0;
 202}
 203
 204static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
 205{
 206        show_ref(".have", sha1);
 207}
 208
 209static void collect_one_alternate_ref(const struct ref *ref, void *data)
 210{
 211        struct sha1_array *sa = data;
 212        sha1_array_append(sa, ref->old_sha1);
 213}
 214
 215static void write_head_info(void)
 216{
 217        struct sha1_array sa = SHA1_ARRAY_INIT;
 218        for_each_alternate_ref(collect_one_alternate_ref, &sa);
 219        sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
 220        sha1_array_clear(&sa);
 221        for_each_ref(show_ref_cb, NULL);
 222        if (!sent_capabilities)
 223                show_ref("capabilities^{}", null_sha1);
 224
 225        advertise_shallow_grafts(1);
 226
 227        /* EOF */
 228        packet_flush(1);
 229}
 230
 231struct command {
 232        struct command *next;
 233        const char *error_string;
 234        unsigned int skip_update:1,
 235                     did_not_exist:1;
 236        int index;
 237        unsigned char old_sha1[20];
 238        unsigned char new_sha1[20];
 239        char ref_name[FLEX_ARRAY]; /* more */
 240};
 241
 242static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 243static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 244
 245static void report_message(const char *prefix, const char *err, va_list params)
 246{
 247        int sz = strlen(prefix);
 248        char msg[4096];
 249
 250        strncpy(msg, prefix, sz);
 251        sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
 252        if (sz > (sizeof(msg) - 1))
 253                sz = sizeof(msg) - 1;
 254        msg[sz++] = '\n';
 255
 256        if (use_sideband)
 257                send_sideband(1, 2, msg, sz, use_sideband);
 258        else
 259                xwrite(2, msg, sz);
 260}
 261
 262static void rp_warning(const char *err, ...)
 263{
 264        va_list params;
 265        va_start(params, err);
 266        report_message("warning: ", err, params);
 267        va_end(params);
 268}
 269
 270static void rp_error(const char *err, ...)
 271{
 272        va_list params;
 273        va_start(params, err);
 274        report_message("error: ", err, params);
 275        va_end(params);
 276}
 277
 278static int copy_to_sideband(int in, int out, void *arg)
 279{
 280        char data[128];
 281        while (1) {
 282                ssize_t sz = xread(in, data, sizeof(data));
 283                if (sz <= 0)
 284                        break;
 285                send_sideband(1, 2, data, sz, use_sideband);
 286        }
 287        close(in);
 288        return 0;
 289}
 290
 291#define HMAC_BLOCK_SIZE 64
 292
 293static void hmac_sha1(unsigned char *out,
 294                      const char *key_in, size_t key_len,
 295                      const char *text, size_t text_len)
 296{
 297        unsigned char key[HMAC_BLOCK_SIZE];
 298        unsigned char k_ipad[HMAC_BLOCK_SIZE];
 299        unsigned char k_opad[HMAC_BLOCK_SIZE];
 300        int i;
 301        git_SHA_CTX ctx;
 302
 303        /* RFC 2104 2. (1) */
 304        memset(key, '\0', HMAC_BLOCK_SIZE);
 305        if (HMAC_BLOCK_SIZE < key_len) {
 306                git_SHA1_Init(&ctx);
 307                git_SHA1_Update(&ctx, key_in, key_len);
 308                git_SHA1_Final(key, &ctx);
 309        } else {
 310                memcpy(key, key_in, key_len);
 311        }
 312
 313        /* RFC 2104 2. (2) & (5) */
 314        for (i = 0; i < sizeof(key); i++) {
 315                k_ipad[i] = key[i] ^ 0x36;
 316                k_opad[i] = key[i] ^ 0x5c;
 317        }
 318
 319        /* RFC 2104 2. (3) & (4) */
 320        git_SHA1_Init(&ctx);
 321        git_SHA1_Update(&ctx, k_ipad, sizeof(k_ipad));
 322        git_SHA1_Update(&ctx, text, text_len);
 323        git_SHA1_Final(out, &ctx);
 324
 325        /* RFC 2104 2. (6) & (7) */
 326        git_SHA1_Init(&ctx);
 327        git_SHA1_Update(&ctx, k_opad, sizeof(k_opad));
 328        git_SHA1_Update(&ctx, out, 20);
 329        git_SHA1_Final(out, &ctx);
 330}
 331
 332static char *prepare_push_cert_nonce(const char *path, unsigned long stamp)
 333{
 334        struct strbuf buf = STRBUF_INIT;
 335        unsigned char sha1[20];
 336
 337        strbuf_addf(&buf, "%s:%lu", path, stamp);
 338        hmac_sha1(sha1, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));;
 339        strbuf_release(&buf);
 340
 341        /* RFC 2104 5. HMAC-SHA1-80 */
 342        strbuf_addf(&buf, "%lu-%.*s", stamp, 20, sha1_to_hex(sha1));
 343        return strbuf_detach(&buf, NULL);
 344}
 345
 346/*
 347 * NEEDSWORK: reuse find_commit_header() from jk/commit-author-parsing
 348 * after dropping "_commit" from its name and possibly moving it out
 349 * of commit.c
 350 */
 351static char *find_header(const char *msg, size_t len, const char *key)
 352{
 353        int key_len = strlen(key);
 354        const char *line = msg;
 355
 356        while (line && line < msg + len) {
 357                const char *eol = strchrnul(line, '\n');
 358
 359                if ((msg + len <= eol) || line == eol)
 360                        return NULL;
 361                if (line + key_len < eol &&
 362                    !memcmp(line, key, key_len) && line[key_len] == ' ') {
 363                        int offset = key_len + 1;
 364                        return xmemdupz(line + offset, (eol - line) - offset);
 365                }
 366                line = *eol ? eol + 1 : NULL;
 367        }
 368        return NULL;
 369}
 370
 371static const char *check_nonce(const char *buf, size_t len)
 372{
 373        char *nonce = find_header(buf, len, "nonce");
 374        unsigned long stamp, ostamp;
 375        char *bohmac, *expect = NULL;
 376        const char *retval = NONCE_BAD;
 377
 378        if (!nonce) {
 379                retval = NONCE_MISSING;
 380                goto leave;
 381        } else if (!push_cert_nonce) {
 382                retval = NONCE_UNSOLICITED;
 383                goto leave;
 384        } else if (!strcmp(push_cert_nonce, nonce)) {
 385                retval = NONCE_OK;
 386                goto leave;
 387        }
 388
 389        if (!stateless_rpc) {
 390                /* returned nonce MUST match what we gave out earlier */
 391                retval = NONCE_BAD;
 392                goto leave;
 393        }
 394
 395        /*
 396         * In stateless mode, we may be receiving a nonce issued by
 397         * another instance of the server that serving the same
 398         * repository, and the timestamps may not match, but the
 399         * nonce-seed and dir should match, so we can recompute and
 400         * report the time slop.
 401         *
 402         * In addition, when a nonce issued by another instance has
 403         * timestamp within receive.certnonceslop seconds, we pretend
 404         * as if we issued that nonce when reporting to the hook.
 405         */
 406
 407        /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
 408        if (*nonce <= '0' || '9' < *nonce) {
 409                retval = NONCE_BAD;
 410                goto leave;
 411        }
 412        stamp = strtoul(nonce, &bohmac, 10);
 413        if (bohmac == nonce || bohmac[0] != '-') {
 414                retval = NONCE_BAD;
 415                goto leave;
 416        }
 417
 418        expect = prepare_push_cert_nonce(service_dir, stamp);
 419        if (strcmp(expect, nonce)) {
 420                /* Not what we would have signed earlier */
 421                retval = NONCE_BAD;
 422                goto leave;
 423        }
 424
 425        /*
 426         * By how many seconds is this nonce stale?  Negative value
 427         * would mean it was issued by another server with its clock
 428         * skewed in the future.
 429         */
 430        ostamp = strtoul(push_cert_nonce, NULL, 10);
 431        nonce_stamp_slop = (long)ostamp - (long)stamp;
 432
 433        if (nonce_stamp_slop_limit &&
 434            labs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
 435                /*
 436                 * Pretend as if the received nonce (which passes the
 437                 * HMAC check, so it is not a forged by third-party)
 438                 * is what we issued.
 439                 */
 440                free((void *)push_cert_nonce);
 441                push_cert_nonce = xstrdup(nonce);
 442                retval = NONCE_OK;
 443        } else {
 444                retval = NONCE_SLOP;
 445        }
 446
 447leave:
 448        free(nonce);
 449        free(expect);
 450        return retval;
 451}
 452
 453static void prepare_push_cert_sha1(struct child_process *proc)
 454{
 455        static int already_done;
 456
 457        if (!push_cert.len)
 458                return;
 459
 460        if (!already_done) {
 461                struct strbuf gpg_output = STRBUF_INIT;
 462                struct strbuf gpg_status = STRBUF_INIT;
 463                int bogs /* beginning_of_gpg_sig */;
 464
 465                already_done = 1;
 466                if (write_sha1_file(push_cert.buf, push_cert.len, "blob", push_cert_sha1))
 467                        hashclr(push_cert_sha1);
 468
 469                memset(&sigcheck, '\0', sizeof(sigcheck));
 470                sigcheck.result = 'N';
 471
 472                bogs = parse_signature(push_cert.buf, push_cert.len);
 473                if (verify_signed_buffer(push_cert.buf, bogs,
 474                                         push_cert.buf + bogs, push_cert.len - bogs,
 475                                         &gpg_output, &gpg_status) < 0) {
 476                        ; /* error running gpg */
 477                } else {
 478                        sigcheck.payload = push_cert.buf;
 479                        sigcheck.gpg_output = gpg_output.buf;
 480                        sigcheck.gpg_status = gpg_status.buf;
 481                        parse_gpg_output(&sigcheck);
 482                }
 483
 484                strbuf_release(&gpg_output);
 485                strbuf_release(&gpg_status);
 486                nonce_status = check_nonce(push_cert.buf, bogs);
 487        }
 488        if (!is_null_sha1(push_cert_sha1)) {
 489                argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT=%s",
 490                                 sha1_to_hex(push_cert_sha1));
 491                argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s",
 492                                 sigcheck.signer ? sigcheck.signer : "");
 493                argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s",
 494                                 sigcheck.key ? sigcheck.key : "");
 495                argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_STATUS=%c",
 496                                 sigcheck.result);
 497                if (push_cert_nonce) {
 498                        argv_array_pushf(&proc->env_array,
 499                                         "GIT_PUSH_CERT_NONCE=%s",
 500                                         push_cert_nonce);
 501                        argv_array_pushf(&proc->env_array,
 502                                         "GIT_PUSH_CERT_NONCE_STATUS=%s",
 503                                         nonce_status);
 504                        if (nonce_status == NONCE_SLOP)
 505                                argv_array_pushf(&proc->env_array,
 506                                                 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
 507                                                 nonce_stamp_slop);
 508                }
 509        }
 510}
 511
 512typedef int (*feed_fn)(void *, const char **, size_t *);
 513static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
 514{
 515        struct child_process proc = CHILD_PROCESS_INIT;
 516        struct async muxer;
 517        const char *argv[2];
 518        int code;
 519
 520        argv[0] = find_hook(hook_name);
 521        if (!argv[0])
 522                return 0;
 523
 524        argv[1] = NULL;
 525
 526        proc.argv = argv;
 527        proc.in = -1;
 528        proc.stdout_to_stderr = 1;
 529
 530        if (use_sideband) {
 531                memset(&muxer, 0, sizeof(muxer));
 532                muxer.proc = copy_to_sideband;
 533                muxer.in = -1;
 534                code = start_async(&muxer);
 535                if (code)
 536                        return code;
 537                proc.err = muxer.in;
 538        }
 539
 540        prepare_push_cert_sha1(&proc);
 541
 542        code = start_command(&proc);
 543        if (code) {
 544                if (use_sideband)
 545                        finish_async(&muxer);
 546                return code;
 547        }
 548
 549        sigchain_push(SIGPIPE, SIG_IGN);
 550
 551        while (1) {
 552                const char *buf;
 553                size_t n;
 554                if (feed(feed_state, &buf, &n))
 555                        break;
 556                if (write_in_full(proc.in, buf, n) != n)
 557                        break;
 558        }
 559        close(proc.in);
 560        if (use_sideband)
 561                finish_async(&muxer);
 562
 563        sigchain_pop(SIGPIPE);
 564
 565        return finish_command(&proc);
 566}
 567
 568struct receive_hook_feed_state {
 569        struct command *cmd;
 570        int skip_broken;
 571        struct strbuf buf;
 572};
 573
 574static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
 575{
 576        struct receive_hook_feed_state *state = state_;
 577        struct command *cmd = state->cmd;
 578
 579        while (cmd &&
 580               state->skip_broken && (cmd->error_string || cmd->did_not_exist))
 581                cmd = cmd->next;
 582        if (!cmd)
 583                return -1; /* EOF */
 584        strbuf_reset(&state->buf);
 585        strbuf_addf(&state->buf, "%s %s %s\n",
 586                    sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
 587                    cmd->ref_name);
 588        state->cmd = cmd->next;
 589        if (bufp) {
 590                *bufp = state->buf.buf;
 591                *sizep = state->buf.len;
 592        }
 593        return 0;
 594}
 595
 596static int run_receive_hook(struct command *commands, const char *hook_name,
 597                            int skip_broken)
 598{
 599        struct receive_hook_feed_state state;
 600        int status;
 601
 602        strbuf_init(&state.buf, 0);
 603        state.cmd = commands;
 604        state.skip_broken = skip_broken;
 605        if (feed_receive_hook(&state, NULL, NULL))
 606                return 0;
 607        state.cmd = commands;
 608        status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
 609        strbuf_release(&state.buf);
 610        return status;
 611}
 612
 613static int run_update_hook(struct command *cmd)
 614{
 615        const char *argv[5];
 616        struct child_process proc = CHILD_PROCESS_INIT;
 617        int code;
 618
 619        argv[0] = find_hook("update");
 620        if (!argv[0])
 621                return 0;
 622
 623        argv[1] = cmd->ref_name;
 624        argv[2] = sha1_to_hex(cmd->old_sha1);
 625        argv[3] = sha1_to_hex(cmd->new_sha1);
 626        argv[4] = NULL;
 627
 628        proc.no_stdin = 1;
 629        proc.stdout_to_stderr = 1;
 630        proc.err = use_sideband ? -1 : 0;
 631        proc.argv = argv;
 632
 633        code = start_command(&proc);
 634        if (code)
 635                return code;
 636        if (use_sideband)
 637                copy_to_sideband(proc.err, -1, NULL);
 638        return finish_command(&proc);
 639}
 640
 641static int is_ref_checked_out(const char *ref)
 642{
 643        if (is_bare_repository())
 644                return 0;
 645
 646        if (!head_name)
 647                return 0;
 648        return !strcmp(head_name, ref);
 649}
 650
 651static char *refuse_unconfigured_deny_msg[] = {
 652        "By default, updating the current branch in a non-bare repository",
 653        "is denied, because it will make the index and work tree inconsistent",
 654        "with what you pushed, and will require 'git reset --hard' to match",
 655        "the work tree to HEAD.",
 656        "",
 657        "You can set 'receive.denyCurrentBranch' configuration variable to",
 658        "'ignore' or 'warn' in the remote repository to allow pushing into",
 659        "its current branch; however, this is not recommended unless you",
 660        "arranged to update its work tree to match what you pushed in some",
 661        "other way.",
 662        "",
 663        "To squelch this message and still keep the default behaviour, set",
 664        "'receive.denyCurrentBranch' configuration variable to 'refuse'."
 665};
 666
 667static void refuse_unconfigured_deny(void)
 668{
 669        int i;
 670        for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
 671                rp_error("%s", refuse_unconfigured_deny_msg[i]);
 672}
 673
 674static char *refuse_unconfigured_deny_delete_current_msg[] = {
 675        "By default, deleting the current branch is denied, because the next",
 676        "'git clone' won't result in any file checked out, causing confusion.",
 677        "",
 678        "You can set 'receive.denyDeleteCurrent' configuration variable to",
 679        "'warn' or 'ignore' in the remote repository to allow deleting the",
 680        "current branch, with or without a warning message.",
 681        "",
 682        "To squelch this message, you can set it to 'refuse'."
 683};
 684
 685static void refuse_unconfigured_deny_delete_current(void)
 686{
 687        int i;
 688        for (i = 0;
 689             i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
 690             i++)
 691                rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
 692}
 693
 694static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
 695static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
 696{
 697        static struct lock_file shallow_lock;
 698        struct sha1_array extra = SHA1_ARRAY_INIT;
 699        const char *alt_file;
 700        uint32_t mask = 1 << (cmd->index % 32);
 701        int i;
 702
 703        trace_printf_key(&trace_shallow,
 704                         "shallow: update_shallow_ref %s\n", cmd->ref_name);
 705        for (i = 0; i < si->shallow->nr; i++)
 706                if (si->used_shallow[i] &&
 707                    (si->used_shallow[i][cmd->index / 32] & mask) &&
 708                    !delayed_reachability_test(si, i))
 709                        sha1_array_append(&extra, si->shallow->sha1[i]);
 710
 711        setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
 712        if (check_shallow_connected(command_singleton_iterator,
 713                                    0, cmd, alt_file)) {
 714                rollback_lock_file(&shallow_lock);
 715                sha1_array_clear(&extra);
 716                return -1;
 717        }
 718
 719        commit_lock_file(&shallow_lock);
 720
 721        /*
 722         * Make sure setup_alternate_shallow() for the next ref does
 723         * not lose these new roots..
 724         */
 725        for (i = 0; i < extra.nr; i++)
 726                register_shallow(extra.sha1[i]);
 727
 728        si->shallow_ref[cmd->index] = 0;
 729        sha1_array_clear(&extra);
 730        return 0;
 731}
 732
 733static const char *update(struct command *cmd, struct shallow_info *si)
 734{
 735        const char *name = cmd->ref_name;
 736        struct strbuf namespaced_name_buf = STRBUF_INIT;
 737        const char *namespaced_name;
 738        unsigned char *old_sha1 = cmd->old_sha1;
 739        unsigned char *new_sha1 = cmd->new_sha1;
 740
 741        /* only refs/... are allowed */
 742        if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
 743                rp_error("refusing to create funny ref '%s' remotely", name);
 744                return "funny refname";
 745        }
 746
 747        strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
 748        namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
 749
 750        if (is_ref_checked_out(namespaced_name)) {
 751                switch (deny_current_branch) {
 752                case DENY_IGNORE:
 753                        break;
 754                case DENY_WARN:
 755                        rp_warning("updating the current branch");
 756                        break;
 757                case DENY_REFUSE:
 758                case DENY_UNCONFIGURED:
 759                        rp_error("refusing to update checked out branch: %s", name);
 760                        if (deny_current_branch == DENY_UNCONFIGURED)
 761                                refuse_unconfigured_deny();
 762                        return "branch is currently checked out";
 763                }
 764        }
 765
 766        if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
 767                error("unpack should have generated %s, "
 768                      "but I can't find it!", sha1_to_hex(new_sha1));
 769                return "bad pack";
 770        }
 771
 772        if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
 773                if (deny_deletes && starts_with(name, "refs/heads/")) {
 774                        rp_error("denying ref deletion for %s", name);
 775                        return "deletion prohibited";
 776                }
 777
 778                if (!strcmp(namespaced_name, head_name)) {
 779                        switch (deny_delete_current) {
 780                        case DENY_IGNORE:
 781                                break;
 782                        case DENY_WARN:
 783                                rp_warning("deleting the current branch");
 784                                break;
 785                        case DENY_REFUSE:
 786                        case DENY_UNCONFIGURED:
 787                                if (deny_delete_current == DENY_UNCONFIGURED)
 788                                        refuse_unconfigured_deny_delete_current();
 789                                rp_error("refusing to delete the current branch: %s", name);
 790                                return "deletion of the current branch prohibited";
 791                        }
 792                }
 793        }
 794
 795        if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
 796            !is_null_sha1(old_sha1) &&
 797            starts_with(name, "refs/heads/")) {
 798                struct object *old_object, *new_object;
 799                struct commit *old_commit, *new_commit;
 800
 801                old_object = parse_object(old_sha1);
 802                new_object = parse_object(new_sha1);
 803
 804                if (!old_object || !new_object ||
 805                    old_object->type != OBJ_COMMIT ||
 806                    new_object->type != OBJ_COMMIT) {
 807                        error("bad sha1 objects for %s", name);
 808                        return "bad ref";
 809                }
 810                old_commit = (struct commit *)old_object;
 811                new_commit = (struct commit *)new_object;
 812                if (!in_merge_bases(old_commit, new_commit)) {
 813                        rp_error("denying non-fast-forward %s"
 814                                 " (you should pull first)", name);
 815                        return "non-fast-forward";
 816                }
 817        }
 818        if (run_update_hook(cmd)) {
 819                rp_error("hook declined to update %s", name);
 820                return "hook declined";
 821        }
 822
 823        if (is_null_sha1(new_sha1)) {
 824                if (!parse_object(old_sha1)) {
 825                        old_sha1 = NULL;
 826                        if (ref_exists(name)) {
 827                                rp_warning("Allowing deletion of corrupt ref.");
 828                        } else {
 829                                rp_warning("Deleting a non-existent ref.");
 830                                cmd->did_not_exist = 1;
 831                        }
 832                }
 833                if (delete_ref(namespaced_name, old_sha1, 0)) {
 834                        rp_error("failed to delete %s", name);
 835                        return "failed to delete";
 836                }
 837                return NULL; /* good */
 838        }
 839        else {
 840                struct strbuf err = STRBUF_INIT;
 841                struct ref_transaction *transaction;
 842
 843                if (shallow_update && si->shallow_ref[cmd->index] &&
 844                    update_shallow_ref(cmd, si))
 845                        return "shallow error";
 846
 847                transaction = ref_transaction_begin(&err);
 848                if (!transaction ||
 849                    ref_transaction_update(transaction, namespaced_name,
 850                                           new_sha1, old_sha1, 0, 1, "push",
 851                                           &err) ||
 852                    ref_transaction_commit(transaction, &err)) {
 853                        ref_transaction_free(transaction);
 854
 855                        rp_error("%s", err.buf);
 856                        strbuf_release(&err);
 857                        return "failed to update ref";
 858                }
 859
 860                ref_transaction_free(transaction);
 861                strbuf_release(&err);
 862                return NULL; /* good */
 863        }
 864}
 865
 866static void run_update_post_hook(struct command *commands)
 867{
 868        struct command *cmd;
 869        int argc;
 870        const char **argv;
 871        struct child_process proc = CHILD_PROCESS_INIT;
 872        char *hook;
 873
 874        hook = find_hook("post-update");
 875        for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
 876                if (cmd->error_string || cmd->did_not_exist)
 877                        continue;
 878                argc++;
 879        }
 880        if (!argc || !hook)
 881                return;
 882
 883        argv = xmalloc(sizeof(*argv) * (2 + argc));
 884        argv[0] = hook;
 885
 886        for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
 887                if (cmd->error_string || cmd->did_not_exist)
 888                        continue;
 889                argv[argc] = xstrdup(cmd->ref_name);
 890                argc++;
 891        }
 892        argv[argc] = NULL;
 893
 894        proc.no_stdin = 1;
 895        proc.stdout_to_stderr = 1;
 896        proc.err = use_sideband ? -1 : 0;
 897        proc.argv = argv;
 898
 899        if (!start_command(&proc)) {
 900                if (use_sideband)
 901                        copy_to_sideband(proc.err, -1, NULL);
 902                finish_command(&proc);
 903        }
 904}
 905
 906static void check_aliased_update(struct command *cmd, struct string_list *list)
 907{
 908        struct strbuf buf = STRBUF_INIT;
 909        const char *dst_name;
 910        struct string_list_item *item;
 911        struct command *dst_cmd;
 912        unsigned char sha1[20];
 913        char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
 914        int flag;
 915
 916        strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
 917        dst_name = resolve_ref_unsafe(buf.buf, 0, sha1, &flag);
 918        strbuf_release(&buf);
 919
 920        if (!(flag & REF_ISSYMREF))
 921                return;
 922
 923        dst_name = strip_namespace(dst_name);
 924        if (!dst_name) {
 925                rp_error("refusing update to broken symref '%s'", cmd->ref_name);
 926                cmd->skip_update = 1;
 927                cmd->error_string = "broken symref";
 928                return;
 929        }
 930
 931        if ((item = string_list_lookup(list, dst_name)) == NULL)
 932                return;
 933
 934        cmd->skip_update = 1;
 935
 936        dst_cmd = (struct command *) item->util;
 937
 938        if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
 939            !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
 940                return;
 941
 942        dst_cmd->skip_update = 1;
 943
 944        strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
 945        strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
 946        strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
 947        strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
 948        rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
 949                 " its target '%s' (%s..%s)",
 950                 cmd->ref_name, cmd_oldh, cmd_newh,
 951                 dst_cmd->ref_name, dst_oldh, dst_newh);
 952
 953        cmd->error_string = dst_cmd->error_string =
 954                "inconsistent aliased update";
 955}
 956
 957static void check_aliased_updates(struct command *commands)
 958{
 959        struct command *cmd;
 960        struct string_list ref_list = STRING_LIST_INIT_NODUP;
 961
 962        for (cmd = commands; cmd; cmd = cmd->next) {
 963                struct string_list_item *item =
 964                        string_list_append(&ref_list, cmd->ref_name);
 965                item->util = (void *)cmd;
 966        }
 967        sort_string_list(&ref_list);
 968
 969        for (cmd = commands; cmd; cmd = cmd->next) {
 970                if (!cmd->error_string)
 971                        check_aliased_update(cmd, &ref_list);
 972        }
 973
 974        string_list_clear(&ref_list, 0);
 975}
 976
 977static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
 978{
 979        struct command **cmd_list = cb_data;
 980        struct command *cmd = *cmd_list;
 981
 982        if (!cmd || is_null_sha1(cmd->new_sha1))
 983                return -1; /* end of list */
 984        *cmd_list = NULL; /* this returns only one */
 985        hashcpy(sha1, cmd->new_sha1);
 986        return 0;
 987}
 988
 989static void set_connectivity_errors(struct command *commands,
 990                                    struct shallow_info *si)
 991{
 992        struct command *cmd;
 993
 994        for (cmd = commands; cmd; cmd = cmd->next) {
 995                struct command *singleton = cmd;
 996                if (shallow_update && si->shallow_ref[cmd->index])
 997                        /* to be checked in update_shallow_ref() */
 998                        continue;
 999                if (!check_everything_connected(command_singleton_iterator,
1000                                                0, &singleton))
1001                        continue;
1002                cmd->error_string = "missing necessary objects";
1003        }
1004}
1005
1006struct iterate_data {
1007        struct command *cmds;
1008        struct shallow_info *si;
1009};
1010
1011static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
1012{
1013        struct iterate_data *data = cb_data;
1014        struct command **cmd_list = &data->cmds;
1015        struct command *cmd = *cmd_list;
1016
1017        for (; cmd; cmd = cmd->next) {
1018                if (shallow_update && data->si->shallow_ref[cmd->index])
1019                        /* to be checked in update_shallow_ref() */
1020                        continue;
1021                if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
1022                        hashcpy(sha1, cmd->new_sha1);
1023                        *cmd_list = cmd->next;
1024                        return 0;
1025                }
1026        }
1027        *cmd_list = NULL;
1028        return -1; /* end of list */
1029}
1030
1031static void reject_updates_to_hidden(struct command *commands)
1032{
1033        struct command *cmd;
1034
1035        for (cmd = commands; cmd; cmd = cmd->next) {
1036                if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
1037                        continue;
1038                if (is_null_sha1(cmd->new_sha1))
1039                        cmd->error_string = "deny deleting a hidden ref";
1040                else
1041                        cmd->error_string = "deny updating a hidden ref";
1042        }
1043}
1044
1045static void execute_commands(struct command *commands,
1046                             const char *unpacker_error,
1047                             struct shallow_info *si)
1048{
1049        int checked_connectivity;
1050        struct command *cmd;
1051        unsigned char sha1[20];
1052        struct iterate_data data;
1053
1054        if (unpacker_error) {
1055                for (cmd = commands; cmd; cmd = cmd->next)
1056                        cmd->error_string = "unpacker error";
1057                return;
1058        }
1059
1060        data.cmds = commands;
1061        data.si = si;
1062        if (check_everything_connected(iterate_receive_command_list, 0, &data))
1063                set_connectivity_errors(commands, si);
1064
1065        reject_updates_to_hidden(commands);
1066
1067        if (run_receive_hook(commands, "pre-receive", 0)) {
1068                for (cmd = commands; cmd; cmd = cmd->next) {
1069                        if (!cmd->error_string)
1070                                cmd->error_string = "pre-receive hook declined";
1071                }
1072                return;
1073        }
1074
1075        check_aliased_updates(commands);
1076
1077        free(head_name_to_free);
1078        head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
1079
1080        checked_connectivity = 1;
1081        for (cmd = commands; cmd; cmd = cmd->next) {
1082                if (cmd->error_string)
1083                        continue;
1084
1085                if (cmd->skip_update)
1086                        continue;
1087
1088                cmd->error_string = update(cmd, si);
1089                if (shallow_update && !cmd->error_string &&
1090                    si->shallow_ref[cmd->index]) {
1091                        error("BUG: connectivity check has not been run on ref %s",
1092                              cmd->ref_name);
1093                        checked_connectivity = 0;
1094                }
1095        }
1096
1097        if (shallow_update && !checked_connectivity)
1098                error("BUG: run 'git fsck' for safety.\n"
1099                      "If there are errors, try to remove "
1100                      "the reported refs above");
1101}
1102
1103static struct command **queue_command(struct command **tail,
1104                                      const char *line,
1105                                      int linelen)
1106{
1107        unsigned char old_sha1[20], new_sha1[20];
1108        struct command *cmd;
1109        const char *refname;
1110        int reflen;
1111
1112        if (linelen < 83 ||
1113            line[40] != ' ' ||
1114            line[81] != ' ' ||
1115            get_sha1_hex(line, old_sha1) ||
1116            get_sha1_hex(line + 41, new_sha1))
1117                die("protocol error: expected old/new/ref, got '%s'", line);
1118
1119        refname = line + 82;
1120        reflen = linelen - 82;
1121        cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
1122        hashcpy(cmd->old_sha1, old_sha1);
1123        hashcpy(cmd->new_sha1, new_sha1);
1124        memcpy(cmd->ref_name, refname, reflen);
1125        cmd->ref_name[reflen] = '\0';
1126        *tail = cmd;
1127        return &cmd->next;
1128}
1129
1130static void queue_commands_from_cert(struct command **tail,
1131                                     struct strbuf *push_cert)
1132{
1133        const char *boc, *eoc;
1134
1135        if (*tail)
1136                die("protocol error: got both push certificate and unsigned commands");
1137
1138        boc = strstr(push_cert->buf, "\n\n");
1139        if (!boc)
1140                die("malformed push certificate %.*s", 100, push_cert->buf);
1141        else
1142                boc += 2;
1143        eoc = push_cert->buf + parse_signature(push_cert->buf, push_cert->len);
1144
1145        while (boc < eoc) {
1146                const char *eol = memchr(boc, '\n', eoc - boc);
1147                tail = queue_command(tail, boc, eol ? eol - boc : eoc - eol);
1148                boc = eol ? eol + 1 : eoc;
1149        }
1150}
1151
1152static struct command *read_head_info(struct sha1_array *shallow)
1153{
1154        struct command *commands = NULL;
1155        struct command **p = &commands;
1156        for (;;) {
1157                char *line;
1158                int len, linelen;
1159
1160                line = packet_read_line(0, &len);
1161                if (!line)
1162                        break;
1163
1164                if (len == 48 && starts_with(line, "shallow ")) {
1165                        unsigned char sha1[20];
1166                        if (get_sha1_hex(line + 8, sha1))
1167                                die("protocol error: expected shallow sha, got '%s'",
1168                                    line + 8);
1169                        sha1_array_append(shallow, sha1);
1170                        continue;
1171                }
1172
1173                linelen = strlen(line);
1174                if (linelen < len) {
1175                        const char *feature_list = line + linelen + 1;
1176                        if (parse_feature_request(feature_list, "report-status"))
1177                                report_status = 1;
1178                        if (parse_feature_request(feature_list, "side-band-64k"))
1179                                use_sideband = LARGE_PACKET_MAX;
1180                        if (parse_feature_request(feature_list, "quiet"))
1181                                quiet = 1;
1182                }
1183
1184                if (!strcmp(line, "push-cert")) {
1185                        int true_flush = 0;
1186                        char certbuf[1024];
1187
1188                        for (;;) {
1189                                len = packet_read(0, NULL, NULL,
1190                                                  certbuf, sizeof(certbuf), 0);
1191                                if (!len) {
1192                                        true_flush = 1;
1193                                        break;
1194                                }
1195                                if (!strcmp(certbuf, "push-cert-end\n"))
1196                                        break; /* end of cert */
1197                                strbuf_addstr(&push_cert, certbuf);
1198                        }
1199
1200                        if (true_flush)
1201                                break;
1202                        continue;
1203                }
1204
1205                p = queue_command(p, line, linelen);
1206        }
1207
1208        if (push_cert.len)
1209                queue_commands_from_cert(p, &push_cert);
1210
1211        return commands;
1212}
1213
1214static const char *parse_pack_header(struct pack_header *hdr)
1215{
1216        switch (read_pack_header(0, hdr)) {
1217        case PH_ERROR_EOF:
1218                return "eof before pack header was fully read";
1219
1220        case PH_ERROR_PACK_SIGNATURE:
1221                return "protocol error (pack signature mismatch detected)";
1222
1223        case PH_ERROR_PROTOCOL:
1224                return "protocol error (pack version unsupported)";
1225
1226        default:
1227                return "unknown error in parse_pack_header";
1228
1229        case 0:
1230                return NULL;
1231        }
1232}
1233
1234static const char *pack_lockfile;
1235
1236static const char *unpack(int err_fd, struct shallow_info *si)
1237{
1238        struct pack_header hdr;
1239        const char *hdr_err;
1240        int status;
1241        char hdr_arg[38];
1242        struct child_process child = CHILD_PROCESS_INIT;
1243        int fsck_objects = (receive_fsck_objects >= 0
1244                            ? receive_fsck_objects
1245                            : transfer_fsck_objects >= 0
1246                            ? transfer_fsck_objects
1247                            : 0);
1248
1249        hdr_err = parse_pack_header(&hdr);
1250        if (hdr_err) {
1251                if (err_fd > 0)
1252                        close(err_fd);
1253                return hdr_err;
1254        }
1255        snprintf(hdr_arg, sizeof(hdr_arg),
1256                        "--pack_header=%"PRIu32",%"PRIu32,
1257                        ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
1258
1259        if (si->nr_ours || si->nr_theirs) {
1260                alt_shallow_file = setup_temporary_shallow(si->shallow);
1261                argv_array_push(&child.args, "--shallow-file");
1262                argv_array_push(&child.args, alt_shallow_file);
1263        }
1264
1265        if (ntohl(hdr.hdr_entries) < unpack_limit) {
1266                argv_array_pushl(&child.args, "unpack-objects", hdr_arg, NULL);
1267                if (quiet)
1268                        argv_array_push(&child.args, "-q");
1269                if (fsck_objects)
1270                        argv_array_push(&child.args, "--strict");
1271                child.no_stdout = 1;
1272                child.err = err_fd;
1273                child.git_cmd = 1;
1274                status = run_command(&child);
1275                if (status)
1276                        return "unpack-objects abnormal exit";
1277        } else {
1278                int s;
1279                char keep_arg[256];
1280
1281                s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
1282                if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
1283                        strcpy(keep_arg + s, "localhost");
1284
1285                argv_array_pushl(&child.args, "index-pack",
1286                                 "--stdin", hdr_arg, keep_arg, NULL);
1287                if (fsck_objects)
1288                        argv_array_push(&child.args, "--strict");
1289                if (fix_thin)
1290                        argv_array_push(&child.args, "--fix-thin");
1291                child.out = -1;
1292                child.err = err_fd;
1293                child.git_cmd = 1;
1294                status = start_command(&child);
1295                if (status)
1296                        return "index-pack fork failed";
1297                pack_lockfile = index_pack_lockfile(child.out);
1298                close(child.out);
1299                status = finish_command(&child);
1300                if (status)
1301                        return "index-pack abnormal exit";
1302                reprepare_packed_git();
1303        }
1304        return NULL;
1305}
1306
1307static const char *unpack_with_sideband(struct shallow_info *si)
1308{
1309        struct async muxer;
1310        const char *ret;
1311
1312        if (!use_sideband)
1313                return unpack(0, si);
1314
1315        memset(&muxer, 0, sizeof(muxer));
1316        muxer.proc = copy_to_sideband;
1317        muxer.in = -1;
1318        if (start_async(&muxer))
1319                return NULL;
1320
1321        ret = unpack(muxer.in, si);
1322
1323        finish_async(&muxer);
1324        return ret;
1325}
1326
1327static void prepare_shallow_update(struct command *commands,
1328                                   struct shallow_info *si)
1329{
1330        int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1331
1332        si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1333                                   si->shallow->nr);
1334        assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1335
1336        si->need_reachability_test =
1337                xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1338        si->reachable =
1339                xcalloc(si->shallow->nr, sizeof(*si->reachable));
1340        si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1341
1342        for (i = 0; i < si->nr_ours; i++)
1343                si->need_reachability_test[si->ours[i]] = 1;
1344
1345        for (i = 0; i < si->shallow->nr; i++) {
1346                if (!si->used_shallow[i])
1347                        continue;
1348                for (j = 0; j < bitmap_size; j++) {
1349                        if (!si->used_shallow[i][j])
1350                                continue;
1351                        si->need_reachability_test[i]++;
1352                        for (k = 0; k < 32; k++)
1353                                if (si->used_shallow[i][j] & (1 << k))
1354                                        si->shallow_ref[j * 32 + k]++;
1355                }
1356
1357                /*
1358                 * true for those associated with some refs and belong
1359                 * in "ours" list aka "step 7 not done yet"
1360                 */
1361                si->need_reachability_test[i] =
1362                        si->need_reachability_test[i] > 1;
1363        }
1364
1365        /*
1366         * keep hooks happy by forcing a temporary shallow file via
1367         * env variable because we can't add --shallow-file to every
1368         * command. check_everything_connected() will be done with
1369         * true .git/shallow though.
1370         */
1371        setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1372}
1373
1374static void update_shallow_info(struct command *commands,
1375                                struct shallow_info *si,
1376                                struct sha1_array *ref)
1377{
1378        struct command *cmd;
1379        int *ref_status;
1380        remove_nonexistent_theirs_shallow(si);
1381        if (!si->nr_ours && !si->nr_theirs) {
1382                shallow_update = 0;
1383                return;
1384        }
1385
1386        for (cmd = commands; cmd; cmd = cmd->next) {
1387                if (is_null_sha1(cmd->new_sha1))
1388                        continue;
1389                sha1_array_append(ref, cmd->new_sha1);
1390                cmd->index = ref->nr - 1;
1391        }
1392        si->ref = ref;
1393
1394        if (shallow_update) {
1395                prepare_shallow_update(commands, si);
1396                return;
1397        }
1398
1399        ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1400        assign_shallow_commits_to_refs(si, NULL, ref_status);
1401        for (cmd = commands; cmd; cmd = cmd->next) {
1402                if (is_null_sha1(cmd->new_sha1))
1403                        continue;
1404                if (ref_status[cmd->index]) {
1405                        cmd->error_string = "shallow update not allowed";
1406                        cmd->skip_update = 1;
1407                }
1408        }
1409        free(ref_status);
1410}
1411
1412static void report(struct command *commands, const char *unpack_status)
1413{
1414        struct command *cmd;
1415        struct strbuf buf = STRBUF_INIT;
1416
1417        packet_buf_write(&buf, "unpack %s\n",
1418                         unpack_status ? unpack_status : "ok");
1419        for (cmd = commands; cmd; cmd = cmd->next) {
1420                if (!cmd->error_string)
1421                        packet_buf_write(&buf, "ok %s\n",
1422                                         cmd->ref_name);
1423                else
1424                        packet_buf_write(&buf, "ng %s %s\n",
1425                                         cmd->ref_name, cmd->error_string);
1426        }
1427        packet_buf_flush(&buf);
1428
1429        if (use_sideband)
1430                send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1431        else
1432                write_or_die(1, buf.buf, buf.len);
1433        strbuf_release(&buf);
1434}
1435
1436static int delete_only(struct command *commands)
1437{
1438        struct command *cmd;
1439        for (cmd = commands; cmd; cmd = cmd->next) {
1440                if (!is_null_sha1(cmd->new_sha1))
1441                        return 0;
1442        }
1443        return 1;
1444}
1445
1446int cmd_receive_pack(int argc, const char **argv, const char *prefix)
1447{
1448        int advertise_refs = 0;
1449        int i;
1450        struct command *commands;
1451        struct sha1_array shallow = SHA1_ARRAY_INIT;
1452        struct sha1_array ref = SHA1_ARRAY_INIT;
1453        struct shallow_info si;
1454
1455        packet_trace_identity("receive-pack");
1456
1457        argv++;
1458        for (i = 1; i < argc; i++) {
1459                const char *arg = *argv++;
1460
1461                if (*arg == '-') {
1462                        if (!strcmp(arg, "--quiet")) {
1463                                quiet = 1;
1464                                continue;
1465                        }
1466
1467                        if (!strcmp(arg, "--advertise-refs")) {
1468                                advertise_refs = 1;
1469                                continue;
1470                        }
1471                        if (!strcmp(arg, "--stateless-rpc")) {
1472                                stateless_rpc = 1;
1473                                continue;
1474                        }
1475                        if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1476                                fix_thin = 0;
1477                                continue;
1478                        }
1479
1480                        usage(receive_pack_usage);
1481                }
1482                if (service_dir)
1483                        usage(receive_pack_usage);
1484                service_dir = arg;
1485        }
1486        if (!service_dir)
1487                usage(receive_pack_usage);
1488
1489        setup_path();
1490
1491        if (!enter_repo(service_dir, 0))
1492                die("'%s' does not appear to be a git repository", service_dir);
1493
1494        git_config(receive_pack_config, NULL);
1495        if (cert_nonce_seed)
1496                push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
1497
1498        if (0 <= transfer_unpack_limit)
1499                unpack_limit = transfer_unpack_limit;
1500        else if (0 <= receive_unpack_limit)
1501                unpack_limit = receive_unpack_limit;
1502
1503        if (advertise_refs || !stateless_rpc) {
1504                write_head_info();
1505        }
1506        if (advertise_refs)
1507                return 0;
1508
1509        if ((commands = read_head_info(&shallow)) != NULL) {
1510                const char *unpack_status = NULL;
1511
1512                prepare_shallow_info(&si, &shallow);
1513                if (!si.nr_ours && !si.nr_theirs)
1514                        shallow_update = 0;
1515                if (!delete_only(commands)) {
1516                        unpack_status = unpack_with_sideband(&si);
1517                        update_shallow_info(commands, &si, &ref);
1518                }
1519                execute_commands(commands, unpack_status, &si);
1520                if (pack_lockfile)
1521                        unlink_or_warn(pack_lockfile);
1522                if (report_status)
1523                        report(commands, unpack_status);
1524                run_receive_hook(commands, "post-receive", 1);
1525                run_update_post_hook(commands);
1526                if (auto_gc) {
1527                        const char *argv_gc_auto[] = {
1528                                "gc", "--auto", "--quiet", NULL,
1529                        };
1530                        int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1531                        run_command_v_opt(argv_gc_auto, opt);
1532                }
1533                if (auto_update_server_info)
1534                        update_server_info(0);
1535                clear_shallow_info(&si);
1536        }
1537        if (use_sideband)
1538                packet_flush(1);
1539        sha1_array_clear(&shallow);
1540        sha1_array_clear(&ref);
1541        free((void *)push_cert_nonce);
1542        return 0;
1543}