8 #include "run-command.h"
 
  11 #include "transport.h"
 
  12 #include "parse-options.h"
 
  13 #include "submodule.h"
 
  14 #include "submodule-config.h"
 
  15 #include "send-pack.h"
 
  18 static const char * const push_usage[] = {
 
  19         N_("git push [<options>] [<repository> [<refspec>...]]"),
 
  23 static int push_use_color = -1;
 
  24 static char push_colors[][COLOR_MAXLEN] = {
 
  26         GIT_COLOR_RED,  /* ERROR */
 
  34 static int parse_push_color_slot(const char *slot)
 
  36         if (!strcasecmp(slot, "reset"))
 
  37                 return PUSH_COLOR_RESET;
 
  38         if (!strcasecmp(slot, "error"))
 
  39                 return PUSH_COLOR_ERROR;
 
  43 static const char *push_get_color(enum color_push ix)
 
  45         if (want_color_stderr(push_use_color))
 
  46                 return push_colors[ix];
 
  51 static int deleterefs;
 
  52 static const char *receivepack;
 
  54 static int progress = -1;
 
  55 static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
 
  56 static enum transport_family family;
 
  58 static struct push_cas_option cas;
 
  60 static struct refspec rs = REFSPEC_INIT_PUSH;
 
  62 static struct string_list push_options_config = STRING_LIST_INIT_DUP;
 
  64 static const char *map_refspec(const char *ref,
 
  65                                struct remote *remote, struct ref *local_refs)
 
  67         const char *branch_name;
 
  68         struct ref *matched = NULL;
 
  70         /* Does "ref" uniquely name our ref? */
 
  71         if (count_refspec_match(ref, local_refs, &matched) != 1)
 
  74         if (remote->push.nr) {
 
  75                 struct refspec_item query;
 
  76                 memset(&query, 0, sizeof(struct refspec_item));
 
  77                 query.src = matched->name;
 
  78                 if (!query_refspecs(&remote->push, &query) && query.dst) {
 
  79                         struct strbuf buf = STRBUF_INIT;
 
  80                         strbuf_addf(&buf, "%s%s:%s",
 
  81                                     query.force ? "+" : "",
 
  82                                     query.src, query.dst);
 
  83                         return strbuf_detach(&buf, NULL);
 
  87         if (push_default == PUSH_DEFAULT_UPSTREAM &&
 
  88             skip_prefix(matched->name, "refs/heads/", &branch_name)) {
 
  89                 struct branch *branch = branch_get(branch_name);
 
  90                 if (branch->merge_nr == 1 && branch->merge[0]->src) {
 
  91                         struct strbuf buf = STRBUF_INIT;
 
  92                         strbuf_addf(&buf, "%s:%s",
 
  93                                     ref, branch->merge[0]->src);
 
  94                         return strbuf_detach(&buf, NULL);
 
 101 static void set_refspecs(const char **refs, int nr, const char *repo)
 
 103         struct remote *remote = NULL;
 
 104         struct ref *local_refs = NULL;
 
 107         for (i = 0; i < nr; i++) {
 
 108                 const char *ref = refs[i];
 
 109                 if (!strcmp("tag", ref)) {
 
 110                         struct strbuf tagref = STRBUF_INIT;
 
 112                                 die(_("tag shorthand without <tag>"));
 
 115                                 strbuf_addf(&tagref, ":refs/tags/%s", ref);
 
 117                                 strbuf_addf(&tagref, "refs/tags/%s", ref);
 
 118                         ref = strbuf_detach(&tagref, NULL);
 
 119                 } else if (deleterefs) {
 
 120                         struct strbuf delref = STRBUF_INIT;
 
 121                         if (strchr(ref, ':'))
 
 122                                 die(_("--delete only accepts plain target ref names"));
 
 123                         strbuf_addf(&delref, ":%s", ref);
 
 124                         ref = strbuf_detach(&delref, NULL);
 
 125                 } else if (!strchr(ref, ':')) {
 
 127                                 /* lazily grab remote and local_refs */
 
 128                                 remote = remote_get(repo);
 
 129                                 local_refs = get_local_heads();
 
 131                         ref = map_refspec(ref, remote, local_refs);
 
 133                 refspec_append(&rs, ref);
 
 137 static int push_url_of_remote(struct remote *remote, const char ***url_p)
 
 139         if (remote->pushurl_nr) {
 
 140                 *url_p = remote->pushurl;
 
 141                 return remote->pushurl_nr;
 
 143         *url_p = remote->url;
 
 144         return remote->url_nr;
 
 147 static NORETURN void die_push_simple(struct branch *branch,
 
 148                                      struct remote *remote)
 
 151          * There's no point in using shorten_unambiguous_ref here,
 
 152          * as the ambiguity would be on the remote side, not what
 
 153          * we have locally. Plus, this is supposed to be the simple
 
 154          * mode. If the user is doing something crazy like setting
 
 155          * upstream to a non-branch, we should probably be showing
 
 156          * them the big ugly fully qualified ref.
 
 158         const char *advice_maybe = "";
 
 159         const char *short_upstream = branch->merge[0]->src;
 
 161         skip_prefix(short_upstream, "refs/heads/", &short_upstream);
 
 164          * Don't show advice for people who explicitly set
 
 167         if (push_default == PUSH_DEFAULT_UNSPECIFIED)
 
 168                 advice_maybe = _("\n"
 
 169                                  "To choose either option permanently, "
 
 170                                  "see push.default in 'git help config'.");
 
 171         die(_("The upstream branch of your current branch does not match\n"
 
 172               "the name of your current branch.  To push to the upstream branch\n"
 
 173               "on the remote, use\n"
 
 175               "    git push %s HEAD:%s\n"
 
 177               "To push to the branch of the same name on the remote, use\n"
 
 179               "    git push %s HEAD\n"
 
 181             remote->name, short_upstream,
 
 182             remote->name, advice_maybe);
 
 185 static const char message_detached_head_die[] =
 
 186         N_("You are not currently on a branch.\n"
 
 187            "To push the history leading to the current (detached HEAD)\n"
 
 190            "    git push %s HEAD:<name-of-remote-branch>\n");
 
 192 static void setup_push_upstream(struct remote *remote, struct branch *branch,
 
 193                                 int triangular, int simple)
 
 195         struct strbuf refspec = STRBUF_INIT;
 
 198                 die(_(message_detached_head_die), remote->name);
 
 199         if (!branch->merge_nr || !branch->merge || !branch->remote_name)
 
 200                 die(_("The current branch %s has no upstream branch.\n"
 
 201                     "To push the current branch and set the remote as upstream, use\n"
 
 203                     "    git push --set-upstream %s %s\n"),
 
 207         if (branch->merge_nr != 1)
 
 208                 die(_("The current branch %s has multiple upstream branches, "
 
 209                     "refusing to push."), branch->name);
 
 211                 die(_("You are pushing to remote '%s', which is not the upstream of\n"
 
 212                       "your current branch '%s', without telling me what to push\n"
 
 213                       "to update which remote branch."),
 
 214                     remote->name, branch->name);
 
 217                 /* Additional safety */
 
 218                 if (strcmp(branch->refname, branch->merge[0]->src))
 
 219                         die_push_simple(branch, remote);
 
 222         strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
 
 223         refspec_append(&rs, refspec.buf);
 
 226 static void setup_push_current(struct remote *remote, struct branch *branch)
 
 228         struct strbuf refspec = STRBUF_INIT;
 
 231                 die(_(message_detached_head_die), remote->name);
 
 232         strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
 
 233         refspec_append(&rs, refspec.buf);
 
 236 static int is_workflow_triangular(struct remote *remote)
 
 238         struct remote *fetch_remote = remote_get(NULL);
 
 239         return (fetch_remote && fetch_remote != remote);
 
 242 static void setup_default_push_refspecs(struct remote *remote)
 
 244         struct branch *branch = branch_get(NULL);
 
 245         int triangular = is_workflow_triangular(remote);
 
 247         switch (push_default) {
 
 249         case PUSH_DEFAULT_MATCHING:
 
 250                 refspec_append(&rs, ":");
 
 253         case PUSH_DEFAULT_UNSPECIFIED:
 
 254         case PUSH_DEFAULT_SIMPLE:
 
 256                         setup_push_current(remote, branch);
 
 258                         setup_push_upstream(remote, branch, triangular, 1);
 
 261         case PUSH_DEFAULT_UPSTREAM:
 
 262                 setup_push_upstream(remote, branch, triangular, 0);
 
 265         case PUSH_DEFAULT_CURRENT:
 
 266                 setup_push_current(remote, branch);
 
 269         case PUSH_DEFAULT_NOTHING:
 
 270                 die(_("You didn't specify any refspecs to push, and "
 
 271                     "push.default is \"nothing\"."));
 
 276 static const char message_advice_pull_before_push[] =
 
 277         N_("Updates were rejected because the tip of your current branch is behind\n"
 
 278            "its remote counterpart. Integrate the remote changes (e.g.\n"
 
 279            "'git pull ...') before pushing again.\n"
 
 280            "See the 'Note about fast-forwards' in 'git push --help' for details.");
 
 282 static const char message_advice_checkout_pull_push[] =
 
 283         N_("Updates were rejected because a pushed branch tip is behind its remote\n"
 
 284            "counterpart. Check out this branch and integrate the remote changes\n"
 
 285            "(e.g. 'git pull ...') before pushing again.\n"
 
 286            "See the 'Note about fast-forwards' in 'git push --help' for details.");
 
 288 static const char message_advice_ref_fetch_first[] =
 
 289         N_("Updates were rejected because the remote contains work that you do\n"
 
 290            "not have locally. This is usually caused by another repository pushing\n"
 
 291            "to the same ref. You may want to first integrate the remote changes\n"
 
 292            "(e.g., 'git pull ...') before pushing again.\n"
 
 293            "See the 'Note about fast-forwards' in 'git push --help' for details.");
 
 295 static const char message_advice_ref_already_exists[] =
 
 296         N_("Updates were rejected because the tag already exists in the remote.");
 
 298 static const char message_advice_ref_needs_force[] =
 
 299         N_("You cannot update a remote ref that points at a non-commit object,\n"
 
 300            "or update a remote ref to make it point at a non-commit object,\n"
 
 301            "without using the '--force' option.\n");
 
 303 static void advise_pull_before_push(void)
 
 305         if (!advice_push_non_ff_current || !advice_push_update_rejected)
 
 307         advise(_(message_advice_pull_before_push));
 
 310 static void advise_checkout_pull_push(void)
 
 312         if (!advice_push_non_ff_matching || !advice_push_update_rejected)
 
 314         advise(_(message_advice_checkout_pull_push));
 
 317 static void advise_ref_already_exists(void)
 
 319         if (!advice_push_already_exists || !advice_push_update_rejected)
 
 321         advise(_(message_advice_ref_already_exists));
 
 324 static void advise_ref_fetch_first(void)
 
 326         if (!advice_push_fetch_first || !advice_push_update_rejected)
 
 328         advise(_(message_advice_ref_fetch_first));
 
 331 static void advise_ref_needs_force(void)
 
 333         if (!advice_push_needs_force || !advice_push_update_rejected)
 
 335         advise(_(message_advice_ref_needs_force));
 
 338 static int push_with_options(struct transport *transport, struct refspec *rs,
 
 342         unsigned int reject_reasons;
 
 344         transport_set_verbosity(transport, verbosity, progress);
 
 345         transport->family = family;
 
 348                 transport_set_option(transport,
 
 349                                      TRANS_OPT_RECEIVEPACK, receivepack);
 
 350         transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
 
 352         if (!is_empty_cas(&cas)) {
 
 353                 if (!transport->smart_options)
 
 354                         die("underlying transport does not support --%s option",
 
 356                 transport->smart_options->cas = &cas;
 
 360                 fprintf(stderr, _("Pushing to %s\n"), transport->url);
 
 361         trace2_region_enter("push", "transport_push", the_repository);
 
 362         err = transport_push(the_repository, transport,
 
 363                              rs, flags, &reject_reasons);
 
 364         trace2_region_leave("push", "transport_push", the_repository);
 
 366                 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_ERROR));
 
 367                 error(_("failed to push some refs to '%s'"), transport->url);
 
 368                 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_RESET));
 
 371         err |= transport_disconnect(transport);
 
 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();
 
 390 static int do_push(const char *repo, int flags,
 
 391                    const struct string_list *push_options,
 
 392                    struct remote *remote)
 
 397         struct refspec *push_refspec = &rs;
 
 399         if (push_options->nr)
 
 400                 flags |= TRANSPORT_PUSH_OPTIONS;
 
 402         if (!push_refspec->nr && !(flags & TRANSPORT_PUSH_ALL)) {
 
 403                 if (remote->push.nr) {
 
 404                         push_refspec = &remote->push;
 
 405                 } else if (!(flags & TRANSPORT_PUSH_MIRROR))
 
 406                         setup_default_push_refspecs(remote);
 
 409         url_nr = push_url_of_remote(remote, &url);
 
 411                 for (i = 0; i < url_nr; i++) {
 
 412                         struct transport *transport =
 
 413                                 transport_get(remote, url[i]);
 
 414                         if (flags & TRANSPORT_PUSH_OPTIONS)
 
 415                                 transport->push_options = push_options;
 
 416                         if (push_with_options(transport, push_refspec, flags))
 
 420                 struct transport *transport =
 
 421                         transport_get(remote, NULL);
 
 422                 if (flags & TRANSPORT_PUSH_OPTIONS)
 
 423                         transport->push_options = push_options;
 
 424                 if (push_with_options(transport, push_refspec, flags))
 
 430 static int option_parse_recurse_submodules(const struct option *opt,
 
 431                                    const char *arg, int unset)
 
 433         int *recurse_submodules = opt->value;
 
 436                 *recurse_submodules = RECURSE_SUBMODULES_OFF;
 
 438                 *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
 
 440                 die("%s missing parameter", opt->long_name);
 
 445 static void set_push_cert_flags(int *flags, int v)
 
 448         case SEND_PACK_PUSH_CERT_NEVER:
 
 449                 *flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
 
 451         case SEND_PACK_PUSH_CERT_ALWAYS:
 
 452                 *flags |= TRANSPORT_PUSH_CERT_ALWAYS;
 
 453                 *flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
 
 455         case SEND_PACK_PUSH_CERT_IF_ASKED:
 
 456                 *flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
 
 457                 *flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
 
 463 static int git_push_config(const char *k, const char *v, void *cb)
 
 465         const char *slot_name;
 
 469         status = git_gpg_config(k, v, NULL);
 
 473         if (!strcmp(k, "push.followtags")) {
 
 474                 if (git_config_bool(k, v))
 
 475                         *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
 
 477                         *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
 
 479         } else if (!strcmp(k, "push.gpgsign")) {
 
 481                 if (!git_config_get_value("push.gpgsign", &value)) {
 
 482                         switch (git_parse_maybe_bool(value)) {
 
 484                                 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
 
 487                                 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
 
 490                                 if (value && !strcasecmp(value, "if-asked"))
 
 491                                         set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
 
 493                                         return error("Invalid value for '%s'", k);
 
 496         } else if (!strcmp(k, "push.recursesubmodules")) {
 
 498                 if (!git_config_get_value("push.recursesubmodules", &value))
 
 499                         recurse_submodules = parse_push_recurse_submodules_arg(k, value);
 
 500         } else if (!strcmp(k, "submodule.recurse")) {
 
 501                 int val = git_config_bool(k, v) ?
 
 502                         RECURSE_SUBMODULES_ON_DEMAND : RECURSE_SUBMODULES_OFF;
 
 503                 recurse_submodules = val;
 
 504         } else if (!strcmp(k, "push.pushoption")) {
 
 506                         return config_error_nonbool(k);
 
 509                                 string_list_clear(&push_options_config, 0);
 
 511                                 string_list_append(&push_options_config, v);
 
 513         } else if (!strcmp(k, "color.push")) {
 
 514                 push_use_color = git_config_colorbool(k, v);
 
 516         } else if (skip_prefix(k, "color.push.", &slot_name)) {
 
 517                 int slot = parse_push_color_slot(slot_name);
 
 521                         return config_error_nonbool(k);
 
 522                 return color_parse(v, push_colors[slot]);
 
 525         return git_default_config(k, v, NULL);
 
 528 int cmd_push(int argc, const char **argv, const char *prefix)
 
 534         const char *repo = NULL;        /* default repository */
 
 535         struct string_list push_options_cmdline = STRING_LIST_INIT_DUP;
 
 536         struct string_list *push_options;
 
 537         const struct string_list_item *item;
 
 538         struct remote *remote;
 
 540         struct option options[] = {
 
 541                 OPT__VERBOSITY(&verbosity),
 
 542                 OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
 
 543                 OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
 
 544                 OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
 
 545                             (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
 
 546                 OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")),
 
 547                 OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
 
 548                 OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
 
 549                 OPT_BIT( 0,  "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
 
 550                 OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
 
 552                   0, CAS_OPT_NAME, &cas, N_("<refname>:<expect>"),
 
 553                   N_("require old value of ref to be at this value"),
 
 554                   PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP, parseopt_push_cas_option },
 
 555                 { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, "(check|on-demand|no)",
 
 556                         N_("control recursive pushing of submodules"),
 
 557                         PARSE_OPT_OPTARG, option_parse_recurse_submodules },
 
 558                 OPT_BOOL_F( 0 , "thin", &thin, N_("use thin pack"), PARSE_OPT_NOCOMPLETE),
 
 559                 OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
 
 560                 OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
 
 561                 OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
 
 562                         TRANSPORT_PUSH_SET_UPSTREAM),
 
 563                 OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
 
 564                 OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
 
 565                         TRANSPORT_PUSH_PRUNE),
 
 566                 OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
 
 567                 OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
 
 568                         TRANSPORT_PUSH_FOLLOW_TAGS),
 
 570                   0, "signed", &push_cert, "(yes|no|if-asked)", N_("GPG sign the push"),
 
 571                   PARSE_OPT_OPTARG, option_parse_push_signed },
 
 572                 OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
 
 573                 OPT_STRING_LIST('o', "push-option", &push_options_cmdline, N_("server-specific"), N_("option to transmit")),
 
 574                 OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
 
 575                                 TRANSPORT_FAMILY_IPV4),
 
 576                 OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
 
 577                                 TRANSPORT_FAMILY_IPV6),
 
 581         packet_trace_identity("push");
 
 582         git_config(git_push_config, &flags);
 
 583         argc = parse_options(argc, argv, prefix, options, push_usage, 0);
 
 584         push_options = (push_options_cmdline.nr
 
 585                 ? &push_options_cmdline
 
 586                 : &push_options_config);
 
 587         set_push_cert_flags(&flags, push_cert);
 
 589         if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
 
 590                 die(_("--delete is incompatible with --all, --mirror and --tags"));
 
 591         if (deleterefs && argc < 2)
 
 592                 die(_("--delete doesn't make sense without any refs"));
 
 594         if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
 
 595                 flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
 
 596         else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
 
 597                 flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
 
 598         else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
 
 599                 flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
 
 602                 refspec_append(&rs, "refs/tags/*");
 
 606                 set_refspecs(argv + 1, argc - 1, repo);
 
 609         remote = pushremote_get(repo);
 
 612                         die(_("bad repository '%s'"), repo);
 
 613                 die(_("No configured push destination.\n"
 
 614                     "Either specify the URL from the command-line or configure a remote repository using\n"
 
 616                     "    git remote add <name> <url>\n"
 
 618                     "and then push using the remote name\n"
 
 620                     "    git push <name>\n"));
 
 624                 flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
 
 626         if (flags & TRANSPORT_PUSH_ALL) {
 
 628                         die(_("--all and --tags are incompatible"));
 
 630                         die(_("--all can't be combined with refspecs"));
 
 632         if (flags & TRANSPORT_PUSH_MIRROR) {
 
 634                         die(_("--mirror and --tags are incompatible"));
 
 636                         die(_("--mirror can't be combined with refspecs"));
 
 638         if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
 
 639                 die(_("--all and --mirror are incompatible"));
 
 641         for_each_string_list_item(item, push_options)
 
 642                 if (strchr(item->string, '\n'))
 
 643                         die(_("push options must not have new line characters"));
 
 645         rc = do_push(repo, flags, push_options, remote);
 
 646         string_list_clear(&push_options_cmdline, 0);
 
 647         string_list_clear(&push_options_config, 0);
 
 649                 usage_with_options(push_usage, options);