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