builtin / push.con commit Merge branch 'jk/grep-binary-workaround-in-test' (3163363)
   1/*
   2 * "git push"
   3 */
   4#include "cache.h"
   5#include "refs.h"
   6#include "run-command.h"
   7#include "builtin.h"
   8#include "remote.h"
   9#include "transport.h"
  10#include "parse-options.h"
  11#include "submodule.h"
  12#include "submodule-config.h"
  13#include "send-pack.h"
  14
  15static const char * const push_usage[] = {
  16        N_("git push [<options>] [<repository> [<refspec>...]]"),
  17        NULL,
  18};
  19
  20static int thin = 1;
  21static int deleterefs;
  22static const char *receivepack;
  23static int verbosity;
  24static int progress = -1;
  25static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
  26static enum transport_family family;
  27
  28static struct push_cas_option cas;
  29
  30static const char **refspec;
  31static int refspec_nr;
  32static int refspec_alloc;
  33
  34static void add_refspec(const char *ref)
  35{
  36        refspec_nr++;
  37        ALLOC_GROW(refspec, refspec_nr, refspec_alloc);
  38        refspec[refspec_nr-1] = ref;
  39}
  40
  41static const char *map_refspec(const char *ref,
  42                               struct remote *remote, struct ref *local_refs)
  43{
  44        struct ref *matched = NULL;
  45
  46        /* Does "ref" uniquely name our ref? */
  47        if (count_refspec_match(ref, local_refs, &matched) != 1)
  48                return ref;
  49
  50        if (remote->push) {
  51                struct refspec query;
  52                memset(&query, 0, sizeof(struct refspec));
  53                query.src = matched->name;
  54                if (!query_refspecs(remote->push, remote->push_refspec_nr, &query) &&
  55                    query.dst) {
  56                        struct strbuf buf = STRBUF_INIT;
  57                        strbuf_addf(&buf, "%s%s:%s",
  58                                    query.force ? "+" : "",
  59                                    query.src, query.dst);
  60                        return strbuf_detach(&buf, NULL);
  61                }
  62        }
  63
  64        if (push_default == PUSH_DEFAULT_UPSTREAM &&
  65            starts_with(matched->name, "refs/heads/")) {
  66                struct branch *branch = branch_get(matched->name + 11);
  67                if (branch->merge_nr == 1 && branch->merge[0]->src) {
  68                        struct strbuf buf = STRBUF_INIT;
  69                        strbuf_addf(&buf, "%s:%s",
  70                                    ref, branch->merge[0]->src);
  71                        return strbuf_detach(&buf, NULL);
  72                }
  73        }
  74
  75        return ref;
  76}
  77
  78static void set_refspecs(const char **refs, int nr, const char *repo)
  79{
  80        struct remote *remote = NULL;
  81        struct ref *local_refs = NULL;
  82        int i;
  83
  84        for (i = 0; i < nr; i++) {
  85                const char *ref = refs[i];
  86                if (!strcmp("tag", ref)) {
  87                        struct strbuf tagref = STRBUF_INIT;
  88                        if (nr <= ++i)
  89                                die(_("tag shorthand without <tag>"));
  90                        ref = refs[i];
  91                        if (deleterefs)
  92                                strbuf_addf(&tagref, ":refs/tags/%s", ref);
  93                        else
  94                                strbuf_addf(&tagref, "refs/tags/%s", ref);
  95                        ref = strbuf_detach(&tagref, NULL);
  96                } else if (deleterefs) {
  97                        struct strbuf delref = STRBUF_INIT;
  98                        if (strchr(ref, ':'))
  99                                die(_("--delete only accepts plain target ref names"));
 100                        strbuf_addf(&delref, ":%s", ref);
 101                        ref = strbuf_detach(&delref, NULL);
 102                } else if (!strchr(ref, ':')) {
 103                        if (!remote) {
 104                                /* lazily grab remote and local_refs */
 105                                remote = remote_get(repo);
 106                                local_refs = get_local_heads();
 107                        }
 108                        ref = map_refspec(ref, remote, local_refs);
 109                }
 110                add_refspec(ref);
 111        }
 112}
 113
 114static int push_url_of_remote(struct remote *remote, const char ***url_p)
 115{
 116        if (remote->pushurl_nr) {
 117                *url_p = remote->pushurl;
 118                return remote->pushurl_nr;
 119        }
 120        *url_p = remote->url;
 121        return remote->url_nr;
 122}
 123
 124static NORETURN int die_push_simple(struct branch *branch, struct remote *remote) {
 125        /*
 126         * There's no point in using shorten_unambiguous_ref here,
 127         * as the ambiguity would be on the remote side, not what
 128         * we have locally. Plus, this is supposed to be the simple
 129         * mode. If the user is doing something crazy like setting
 130         * upstream to a non-branch, we should probably be showing
 131         * them the big ugly fully qualified ref.
 132         */
 133        const char *advice_maybe = "";
 134        const char *short_upstream = branch->merge[0]->src;
 135
 136        skip_prefix(short_upstream, "refs/heads/", &short_upstream);
 137
 138        /*
 139         * Don't show advice for people who explicitly set
 140         * push.default.
 141         */
 142        if (push_default == PUSH_DEFAULT_UNSPECIFIED)
 143                advice_maybe = _("\n"
 144                                 "To choose either option permanently, "
 145                                 "see push.default in 'git help config'.");
 146        die(_("The upstream branch of your current branch does not match\n"
 147              "the name of your current branch.  To push to the upstream branch\n"
 148              "on the remote, use\n"
 149              "\n"
 150              "    git push %s HEAD:%s\n"
 151              "\n"
 152              "To push to the branch of the same name on the remote, use\n"
 153              "\n"
 154              "    git push %s %s\n"
 155              "%s"),
 156            remote->name, short_upstream,
 157            remote->name, branch->name, advice_maybe);
 158}
 159
 160static const char message_detached_head_die[] =
 161        N_("You are not currently on a branch.\n"
 162           "To push the history leading to the current (detached HEAD)\n"
 163           "state now, use\n"
 164           "\n"
 165           "    git push %s HEAD:<name-of-remote-branch>\n");
 166
 167static void setup_push_upstream(struct remote *remote, struct branch *branch,
 168                                int triangular, int simple)
 169{
 170        struct strbuf refspec = STRBUF_INIT;
 171
 172        if (!branch)
 173                die(_(message_detached_head_die), remote->name);
 174        if (!branch->merge_nr || !branch->merge || !branch->remote_name)
 175                die(_("The current branch %s has no upstream branch.\n"
 176                    "To push the current branch and set the remote as upstream, use\n"
 177                    "\n"
 178                    "    git push --set-upstream %s %s\n"),
 179                    branch->name,
 180                    remote->name,
 181                    branch->name);
 182        if (branch->merge_nr != 1)
 183                die(_("The current branch %s has multiple upstream branches, "
 184                    "refusing to push."), branch->name);
 185        if (triangular)
 186                die(_("You are pushing to remote '%s', which is not the upstream of\n"
 187                      "your current branch '%s', without telling me what to push\n"
 188                      "to update which remote branch."),
 189                    remote->name, branch->name);
 190
 191        if (simple) {
 192                /* Additional safety */
 193                if (strcmp(branch->refname, branch->merge[0]->src))
 194                        die_push_simple(branch, remote);
 195        }
 196
 197        strbuf_addf(&refspec, "%s:%s", branch->name, branch->merge[0]->src);
 198        add_refspec(refspec.buf);
 199}
 200
 201static void setup_push_current(struct remote *remote, struct branch *branch)
 202{
 203        if (!branch)
 204                die(_(message_detached_head_die), remote->name);
 205        add_refspec(branch->name);
 206}
 207
 208static char warn_unspecified_push_default_msg[] =
 209N_("push.default is unset; its implicit value has changed in\n"
 210   "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
 211   "and maintain the traditional behavior, use:\n"
 212   "\n"
 213   "  git config --global push.default matching\n"
 214   "\n"
 215   "To squelch this message and adopt the new behavior now, use:\n"
 216   "\n"
 217   "  git config --global push.default simple\n"
 218   "\n"
 219   "When push.default is set to 'matching', git will push local branches\n"
 220   "to the remote branches that already exist with the same name.\n"
 221   "\n"
 222   "Since Git 2.0, Git defaults to the more conservative 'simple'\n"
 223   "behavior, which only pushes the current branch to the corresponding\n"
 224   "remote branch that 'git pull' uses to update the current branch.\n"
 225   "\n"
 226   "See 'git help config' and search for 'push.default' for further information.\n"
 227   "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
 228   "'current' instead of 'simple' if you sometimes use older versions of Git)");
 229
 230static void warn_unspecified_push_default_configuration(void)
 231{
 232        static int warn_once;
 233
 234        if (warn_once++)
 235                return;
 236        warning("%s\n", _(warn_unspecified_push_default_msg));
 237}
 238
 239static int is_workflow_triangular(struct remote *remote)
 240{
 241        struct remote *fetch_remote = remote_get(NULL);
 242        return (fetch_remote && fetch_remote != remote);
 243}
 244
 245static void setup_default_push_refspecs(struct remote *remote)
 246{
 247        struct branch *branch = branch_get(NULL);
 248        int triangular = is_workflow_triangular(remote);
 249
 250        switch (push_default) {
 251        default:
 252        case PUSH_DEFAULT_MATCHING:
 253                add_refspec(":");
 254                break;
 255
 256        case PUSH_DEFAULT_UNSPECIFIED:
 257                warn_unspecified_push_default_configuration();
 258                /* fallthru */
 259
 260        case PUSH_DEFAULT_SIMPLE:
 261                if (triangular)
 262                        setup_push_current(remote, branch);
 263                else
 264                        setup_push_upstream(remote, branch, triangular, 1);
 265                break;
 266
 267        case PUSH_DEFAULT_UPSTREAM:
 268                setup_push_upstream(remote, branch, triangular, 0);
 269                break;
 270
 271        case PUSH_DEFAULT_CURRENT:
 272                setup_push_current(remote, branch);
 273                break;
 274
 275        case PUSH_DEFAULT_NOTHING:
 276                die(_("You didn't specify any refspecs to push, and "
 277                    "push.default is \"nothing\"."));
 278                break;
 279        }
 280}
 281
 282static const char message_advice_pull_before_push[] =
 283        N_("Updates were rejected because the tip of your current branch is behind\n"
 284           "its remote counterpart. Integrate the remote changes (e.g.\n"
 285           "'git pull ...') before pushing again.\n"
 286           "See the 'Note about fast-forwards' in 'git push --help' for details.");
 287
 288static const char message_advice_checkout_pull_push[] =
 289        N_("Updates were rejected because a pushed branch tip is behind its remote\n"
 290           "counterpart. Check out this branch and integrate the remote changes\n"
 291           "(e.g. 'git pull ...') before pushing again.\n"
 292           "See the 'Note about fast-forwards' in 'git push --help' for details.");
 293
 294static const char message_advice_ref_fetch_first[] =
 295        N_("Updates were rejected because the remote contains work that you do\n"
 296           "not have locally. This is usually caused by another repository pushing\n"
 297           "to the same ref. You may want to first integrate the remote changes\n"
 298           "(e.g., 'git pull ...') before pushing again.\n"
 299           "See the 'Note about fast-forwards' in 'git push --help' for details.");
 300
 301static const char message_advice_ref_already_exists[] =
 302        N_("Updates were rejected because the tag already exists in the remote.");
 303
 304static const char message_advice_ref_needs_force[] =
 305        N_("You cannot update a remote ref that points at a non-commit object,\n"
 306           "or update a remote ref to make it point at a non-commit object,\n"
 307           "without using the '--force' option.\n");
 308
 309static void advise_pull_before_push(void)
 310{
 311        if (!advice_push_non_ff_current || !advice_push_update_rejected)
 312                return;
 313        advise(_(message_advice_pull_before_push));
 314}
 315
 316static void advise_checkout_pull_push(void)
 317{
 318        if (!advice_push_non_ff_matching || !advice_push_update_rejected)
 319                return;
 320        advise(_(message_advice_checkout_pull_push));
 321}
 322
 323static void advise_ref_already_exists(void)
 324{
 325        if (!advice_push_already_exists || !advice_push_update_rejected)
 326                return;
 327        advise(_(message_advice_ref_already_exists));
 328}
 329
 330static void advise_ref_fetch_first(void)
 331{
 332        if (!advice_push_fetch_first || !advice_push_update_rejected)
 333                return;
 334        advise(_(message_advice_ref_fetch_first));
 335}
 336
 337static void advise_ref_needs_force(void)
 338{
 339        if (!advice_push_needs_force || !advice_push_update_rejected)
 340                return;
 341        advise(_(message_advice_ref_needs_force));
 342}
 343
 344static int push_with_options(struct transport *transport, int flags)
 345{
 346        int err;
 347        unsigned int reject_reasons;
 348
 349        transport_set_verbosity(transport, verbosity, progress);
 350        transport->family = family;
 351
 352        if (receivepack)
 353                transport_set_option(transport,
 354                                     TRANS_OPT_RECEIVEPACK, receivepack);
 355        transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
 356
 357        if (!is_empty_cas(&cas)) {
 358                if (!transport->smart_options)
 359                        die("underlying transport does not support --%s option",
 360                            CAS_OPT_NAME);
 361                transport->smart_options->cas = &cas;
 362        }
 363
 364        if (verbosity > 0)
 365                fprintf(stderr, _("Pushing to %s\n"), transport->url);
 366        err = transport_push(transport, refspec_nr, refspec, flags,
 367                             &reject_reasons);
 368        if (err != 0)
 369                error(_("failed to push some refs to '%s'"), transport->url);
 370
 371        err |= transport_disconnect(transport);
 372        if (!err)
 373                return 0;
 374
 375        if (reject_reasons & REJECT_NON_FF_HEAD) {
 376                advise_pull_before_push();
 377        } else if (reject_reasons & REJECT_NON_FF_OTHER) {
 378                advise_checkout_pull_push();
 379        } else if (reject_reasons & REJECT_ALREADY_EXISTS) {
 380                advise_ref_already_exists();
 381        } else if (reject_reasons & REJECT_FETCH_FIRST) {
 382                advise_ref_fetch_first();
 383        } else if (reject_reasons & REJECT_NEEDS_FORCE) {
 384                advise_ref_needs_force();
 385        }
 386
 387        return 1;
 388}
 389
 390static int do_push(const char *repo, int flags)
 391{
 392        int i, errs;
 393        struct remote *remote = pushremote_get(repo);
 394        const char **url;
 395        int url_nr;
 396
 397        if (!remote) {
 398                if (repo)
 399                        die(_("bad repository '%s'"), repo);
 400                die(_("No configured push destination.\n"
 401                    "Either specify the URL from the command-line or configure a remote repository using\n"
 402                    "\n"
 403                    "    git remote add <name> <url>\n"
 404                    "\n"
 405                    "and then push using the remote name\n"
 406                    "\n"
 407                    "    git push <name>\n"));
 408        }
 409
 410        if (remote->mirror)
 411                flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
 412
 413        if ((flags & TRANSPORT_PUSH_ALL) && refspec) {
 414                if (!strcmp(*refspec, "refs/tags/*"))
 415                        return error(_("--all and --tags are incompatible"));
 416                return error(_("--all can't be combined with refspecs"));
 417        }
 418
 419        if ((flags & TRANSPORT_PUSH_MIRROR) && refspec) {
 420                if (!strcmp(*refspec, "refs/tags/*"))
 421                        return error(_("--mirror and --tags are incompatible"));
 422                return error(_("--mirror can't be combined with refspecs"));
 423        }
 424
 425        if ((flags & (TRANSPORT_PUSH_ALL|TRANSPORT_PUSH_MIRROR)) ==
 426                                (TRANSPORT_PUSH_ALL|TRANSPORT_PUSH_MIRROR)) {
 427                return error(_("--all and --mirror are incompatible"));
 428        }
 429
 430        if (!refspec && !(flags & TRANSPORT_PUSH_ALL)) {
 431                if (remote->push_refspec_nr) {
 432                        refspec = remote->push_refspec;
 433                        refspec_nr = remote->push_refspec_nr;
 434                } else if (!(flags & TRANSPORT_PUSH_MIRROR))
 435                        setup_default_push_refspecs(remote);
 436        }
 437        errs = 0;
 438        url_nr = push_url_of_remote(remote, &url);
 439        if (url_nr) {
 440                for (i = 0; i < url_nr; i++) {
 441                        struct transport *transport =
 442                                transport_get(remote, url[i]);
 443                        if (push_with_options(transport, flags))
 444                                errs++;
 445                }
 446        } else {
 447                struct transport *transport =
 448                        transport_get(remote, NULL);
 449
 450                if (push_with_options(transport, flags))
 451                        errs++;
 452        }
 453        return !!errs;
 454}
 455
 456static int option_parse_recurse_submodules(const struct option *opt,
 457                                   const char *arg, int unset)
 458{
 459        int *recurse_submodules = opt->value;
 460
 461        if (unset)
 462                *recurse_submodules = RECURSE_SUBMODULES_OFF;
 463        else if (arg)
 464                *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
 465        else
 466                die("%s missing parameter", opt->long_name);
 467
 468        return 0;
 469}
 470
 471static void set_push_cert_flags(int *flags, int v)
 472{
 473        switch (v) {
 474        case SEND_PACK_PUSH_CERT_NEVER:
 475                *flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
 476                break;
 477        case SEND_PACK_PUSH_CERT_ALWAYS:
 478                *flags |= TRANSPORT_PUSH_CERT_ALWAYS;
 479                *flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
 480                break;
 481        case SEND_PACK_PUSH_CERT_IF_ASKED:
 482                *flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
 483                *flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
 484                break;
 485        }
 486}
 487
 488
 489static int git_push_config(const char *k, const char *v, void *cb)
 490{
 491        int *flags = cb;
 492        int status;
 493
 494        status = git_gpg_config(k, v, NULL);
 495        if (status)
 496                return status;
 497
 498        if (!strcmp(k, "push.followtags")) {
 499                if (git_config_bool(k, v))
 500                        *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
 501                else
 502                        *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
 503                return 0;
 504        } else if (!strcmp(k, "push.gpgsign")) {
 505                const char *value;
 506                if (!git_config_get_value("push.gpgsign", &value)) {
 507                        switch (git_config_maybe_bool("push.gpgsign", value)) {
 508                        case 0:
 509                                set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
 510                                break;
 511                        case 1:
 512                                set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
 513                                break;
 514                        default:
 515                                if (value && !strcasecmp(value, "if-asked"))
 516                                        set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
 517                                else
 518                                        return error("Invalid value for '%s'", k);
 519                        }
 520                }
 521        } else if (!strcmp(k, "push.recursesubmodules")) {
 522                const char *value;
 523                if (!git_config_get_value("push.recursesubmodules", &value))
 524                        recurse_submodules = parse_push_recurse_submodules_arg(k, value);
 525        }
 526
 527        return git_default_config(k, v, NULL);
 528}
 529
 530int cmd_push(int argc, const char **argv, const char *prefix)
 531{
 532        int flags = 0;
 533        int tags = 0;
 534        int push_cert = -1;
 535        int rc;
 536        const char *repo = NULL;        /* default repository */
 537        struct option options[] = {
 538                OPT__VERBOSITY(&verbosity),
 539                OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
 540                OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
 541                OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
 542                            (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
 543                OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")),
 544                OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
 545                OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
 546                OPT_BIT( 0,  "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
 547                OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
 548                { OPTION_CALLBACK,
 549                  0, CAS_OPT_NAME, &cas, N_("refname>:<expect"),
 550                  N_("require old value of ref to be at this value"),
 551                  PARSE_OPT_OPTARG, parseopt_push_cas_option },
 552                { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, "check|on-demand|no",
 553                        N_("control recursive pushing of submodules"),
 554                        PARSE_OPT_OPTARG, option_parse_recurse_submodules },
 555                OPT_BOOL( 0 , "thin", &thin, N_("use thin pack")),
 556                OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
 557                OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
 558                OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
 559                        TRANSPORT_PUSH_SET_UPSTREAM),
 560                OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
 561                OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
 562                        TRANSPORT_PUSH_PRUNE),
 563                OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
 564                OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
 565                        TRANSPORT_PUSH_FOLLOW_TAGS),
 566                { OPTION_CALLBACK,
 567                  0, "signed", &push_cert, "yes|no|if-asked", N_("GPG sign the push"),
 568                  PARSE_OPT_OPTARG, option_parse_push_signed },
 569                OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
 570                OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
 571                                TRANSPORT_FAMILY_IPV4),
 572                OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
 573                                TRANSPORT_FAMILY_IPV6),
 574                OPT_END()
 575        };
 576
 577        packet_trace_identity("push");
 578        git_config(git_push_config, &flags);
 579        argc = parse_options(argc, argv, prefix, options, push_usage, 0);
 580        set_push_cert_flags(&flags, push_cert);
 581
 582        if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
 583                die(_("--delete is incompatible with --all, --mirror and --tags"));
 584        if (deleterefs && argc < 2)
 585                die(_("--delete doesn't make sense without any refs"));
 586
 587        if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
 588                flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
 589        else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
 590                flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
 591
 592        if (tags)
 593                add_refspec("refs/tags/*");
 594
 595        if (argc > 0) {
 596                repo = argv[0];
 597                set_refspecs(argv + 1, argc - 1, repo);
 598        }
 599
 600        rc = do_push(repo, flags);
 601        if (rc == -1)
 602                usage_with_options(push_usage, options);
 603        else
 604                return rc;
 605}