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 struct ref *matched = NULL;
69 /* Does "ref" uniquely name our ref? */
70 if (count_refspec_match(ref, local_refs, &matched) != 1)
73 if (remote->push.nr) {
74 struct refspec_item query;
75 memset(&query, 0, sizeof(struct refspec_item));
76 query.src = matched->name;
77 if (!query_refspecs(&remote->push, &query) && query.dst) {
78 struct strbuf buf = STRBUF_INIT;
79 strbuf_addf(&buf, "%s%s:%s",
80 query.force ? "+" : "",
81 query.src, query.dst);
82 return strbuf_detach(&buf, NULL);
86 if (push_default == PUSH_DEFAULT_UPSTREAM &&
87 starts_with(matched->name, "refs/heads/")) {
88 struct branch *branch = branch_get(matched->name + 11);
89 if (branch->merge_nr == 1 && branch->merge[0]->src) {
90 struct strbuf buf = STRBUF_INIT;
91 strbuf_addf(&buf, "%s:%s",
92 ref, branch->merge[0]->src);
93 return strbuf_detach(&buf, NULL);
100 static void set_refspecs(const char **refs, int nr, const char *repo)
102 struct remote *remote = NULL;
103 struct ref *local_refs = NULL;
106 for (i = 0; i < nr; i++) {
107 const char *ref = refs[i];
108 if (!strcmp("tag", ref)) {
109 struct strbuf tagref = STRBUF_INIT;
111 die(_("tag shorthand without <tag>"));
114 strbuf_addf(&tagref, ":refs/tags/%s", ref);
116 strbuf_addf(&tagref, "refs/tags/%s", ref);
117 ref = strbuf_detach(&tagref, NULL);
118 } else if (deleterefs) {
119 struct strbuf delref = STRBUF_INIT;
120 if (strchr(ref, ':'))
121 die(_("--delete only accepts plain target ref names"));
122 strbuf_addf(&delref, ":%s", ref);
123 ref = strbuf_detach(&delref, NULL);
124 } else if (!strchr(ref, ':')) {
126 /* lazily grab remote and local_refs */
127 remote = remote_get(repo);
128 local_refs = get_local_heads();
130 ref = map_refspec(ref, remote, local_refs);
132 refspec_append(&rs, ref);
136 static int push_url_of_remote(struct remote *remote, const char ***url_p)
138 if (remote->pushurl_nr) {
139 *url_p = remote->pushurl;
140 return remote->pushurl_nr;
142 *url_p = remote->url;
143 return remote->url_nr;
146 static NORETURN void die_push_simple(struct branch *branch,
147 struct remote *remote)
150 * There's no point in using shorten_unambiguous_ref here,
151 * as the ambiguity would be on the remote side, not what
152 * we have locally. Plus, this is supposed to be the simple
153 * mode. If the user is doing something crazy like setting
154 * upstream to a non-branch, we should probably be showing
155 * them the big ugly fully qualified ref.
157 const char *advice_maybe = "";
158 const char *short_upstream = branch->merge[0]->src;
160 skip_prefix(short_upstream, "refs/heads/", &short_upstream);
163 * Don't show advice for people who explicitly set
166 if (push_default == PUSH_DEFAULT_UNSPECIFIED)
167 advice_maybe = _("\n"
168 "To choose either option permanently, "
169 "see push.default in 'git help config'.");
170 die(_("The upstream branch of your current branch does not match\n"
171 "the name of your current branch. To push to the upstream branch\n"
172 "on the remote, use\n"
174 " git push %s HEAD:%s\n"
176 "To push to the branch of the same name on the remote, use\n"
178 " git push %s HEAD\n"
180 remote->name, short_upstream,
181 remote->name, advice_maybe);
184 static const char message_detached_head_die[] =
185 N_("You are not currently on a branch.\n"
186 "To push the history leading to the current (detached HEAD)\n"
189 " git push %s HEAD:<name-of-remote-branch>\n");
191 static void setup_push_upstream(struct remote *remote, struct branch *branch,
192 int triangular, int simple)
194 struct strbuf refspec = STRBUF_INIT;
197 die(_(message_detached_head_die), remote->name);
198 if (!branch->merge_nr || !branch->merge || !branch->remote_name)
199 die(_("The current branch %s has no upstream branch.\n"
200 "To push the current branch and set the remote as upstream, use\n"
202 " git push --set-upstream %s %s\n"),
206 if (branch->merge_nr != 1)
207 die(_("The current branch %s has multiple upstream branches, "
208 "refusing to push."), branch->name);
210 die(_("You are pushing to remote '%s', which is not the upstream of\n"
211 "your current branch '%s', without telling me what to push\n"
212 "to update which remote branch."),
213 remote->name, branch->name);
216 /* Additional safety */
217 if (strcmp(branch->refname, branch->merge[0]->src))
218 die_push_simple(branch, remote);
221 strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
222 refspec_append(&rs, refspec.buf);
225 static void setup_push_current(struct remote *remote, struct branch *branch)
227 struct strbuf refspec = STRBUF_INIT;
230 die(_(message_detached_head_die), remote->name);
231 strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
232 refspec_append(&rs, refspec.buf);
235 static int is_workflow_triangular(struct remote *remote)
237 struct remote *fetch_remote = remote_get(NULL);
238 return (fetch_remote && fetch_remote != remote);
241 static void setup_default_push_refspecs(struct remote *remote)
243 struct branch *branch = branch_get(NULL);
244 int triangular = is_workflow_triangular(remote);
246 switch (push_default) {
248 case PUSH_DEFAULT_MATCHING:
249 refspec_append(&rs, ":");
252 case PUSH_DEFAULT_UNSPECIFIED:
253 case PUSH_DEFAULT_SIMPLE:
255 setup_push_current(remote, branch);
257 setup_push_upstream(remote, branch, triangular, 1);
260 case PUSH_DEFAULT_UPSTREAM:
261 setup_push_upstream(remote, branch, triangular, 0);
264 case PUSH_DEFAULT_CURRENT:
265 setup_push_current(remote, branch);
268 case PUSH_DEFAULT_NOTHING:
269 die(_("You didn't specify any refspecs to push, and "
270 "push.default is \"nothing\"."));
275 static const char message_advice_pull_before_push[] =
276 N_("Updates were rejected because the tip of your current branch is behind\n"
277 "its remote counterpart. Integrate the remote changes (e.g.\n"
278 "'git pull ...') before pushing again.\n"
279 "See the 'Note about fast-forwards' in 'git push --help' for details.");
281 static const char message_advice_checkout_pull_push[] =
282 N_("Updates were rejected because a pushed branch tip is behind its remote\n"
283 "counterpart. Check out this branch and integrate the remote changes\n"
284 "(e.g. 'git pull ...') before pushing again.\n"
285 "See the 'Note about fast-forwards' in 'git push --help' for details.");
287 static const char message_advice_ref_fetch_first[] =
288 N_("Updates were rejected because the remote contains work that you do\n"
289 "not have locally. This is usually caused by another repository pushing\n"
290 "to the same ref. You may want to first 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.");
294 static const char message_advice_ref_already_exists[] =
295 N_("Updates were rejected because the tag already exists in the remote.");
297 static const char message_advice_ref_needs_force[] =
298 N_("You cannot update a remote ref that points at a non-commit object,\n"
299 "or update a remote ref to make it point at a non-commit object,\n"
300 "without using the '--force' option.\n");
302 static void advise_pull_before_push(void)
304 if (!advice_push_non_ff_current || !advice_push_update_rejected)
306 advise(_(message_advice_pull_before_push));
309 static void advise_checkout_pull_push(void)
311 if (!advice_push_non_ff_matching || !advice_push_update_rejected)
313 advise(_(message_advice_checkout_pull_push));
316 static void advise_ref_already_exists(void)
318 if (!advice_push_already_exists || !advice_push_update_rejected)
320 advise(_(message_advice_ref_already_exists));
323 static void advise_ref_fetch_first(void)
325 if (!advice_push_fetch_first || !advice_push_update_rejected)
327 advise(_(message_advice_ref_fetch_first));
330 static void advise_ref_needs_force(void)
332 if (!advice_push_needs_force || !advice_push_update_rejected)
334 advise(_(message_advice_ref_needs_force));
337 static int push_with_options(struct transport *transport, struct refspec *rs,
341 unsigned int reject_reasons;
343 transport_set_verbosity(transport, verbosity, progress);
344 transport->family = family;
347 transport_set_option(transport,
348 TRANS_OPT_RECEIVEPACK, receivepack);
349 transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
351 if (!is_empty_cas(&cas)) {
352 if (!transport->smart_options)
353 die("underlying transport does not support --%s option",
355 transport->smart_options->cas = &cas;
359 fprintf(stderr, _("Pushing to %s\n"), transport->url);
360 trace2_region_enter("push", "transport_push", the_repository);
361 err = transport_push(the_repository, transport,
362 rs, flags, &reject_reasons);
363 trace2_region_leave("push", "transport_push", the_repository);
365 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_ERROR));
366 error(_("failed to push some refs to '%s'"), transport->url);
367 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_RESET));
370 err |= transport_disconnect(transport);
374 if (reject_reasons & REJECT_NON_FF_HEAD) {
375 advise_pull_before_push();
376 } else if (reject_reasons & REJECT_NON_FF_OTHER) {
377 advise_checkout_pull_push();
378 } else if (reject_reasons & REJECT_ALREADY_EXISTS) {
379 advise_ref_already_exists();
380 } else if (reject_reasons & REJECT_FETCH_FIRST) {
381 advise_ref_fetch_first();
382 } else if (reject_reasons & REJECT_NEEDS_FORCE) {
383 advise_ref_needs_force();
389 static int do_push(const char *repo, int flags,
390 const struct string_list *push_options,
391 struct remote *remote)
396 struct refspec *push_refspec = &rs;
398 if (push_options->nr)
399 flags |= TRANSPORT_PUSH_OPTIONS;
401 if (!push_refspec->nr && !(flags & TRANSPORT_PUSH_ALL)) {
402 if (remote->push.nr) {
403 push_refspec = &remote->push;
404 } else if (!(flags & TRANSPORT_PUSH_MIRROR))
405 setup_default_push_refspecs(remote);
408 url_nr = push_url_of_remote(remote, &url);
410 for (i = 0; i < url_nr; i++) {
411 struct transport *transport =
412 transport_get(remote, url[i]);
413 if (flags & TRANSPORT_PUSH_OPTIONS)
414 transport->push_options = push_options;
415 if (push_with_options(transport, push_refspec, flags))
419 struct transport *transport =
420 transport_get(remote, NULL);
421 if (flags & TRANSPORT_PUSH_OPTIONS)
422 transport->push_options = push_options;
423 if (push_with_options(transport, push_refspec, flags))
429 static int option_parse_recurse_submodules(const struct option *opt,
430 const char *arg, int unset)
432 int *recurse_submodules = opt->value;
435 *recurse_submodules = RECURSE_SUBMODULES_OFF;
437 *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
439 die("%s missing parameter", opt->long_name);
444 static void set_push_cert_flags(int *flags, int v)
447 case SEND_PACK_PUSH_CERT_NEVER:
448 *flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
450 case SEND_PACK_PUSH_CERT_ALWAYS:
451 *flags |= TRANSPORT_PUSH_CERT_ALWAYS;
452 *flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
454 case SEND_PACK_PUSH_CERT_IF_ASKED:
455 *flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
456 *flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
462 static int git_push_config(const char *k, const char *v, void *cb)
464 const char *slot_name;
468 status = git_gpg_config(k, v, NULL);
472 if (!strcmp(k, "push.followtags")) {
473 if (git_config_bool(k, v))
474 *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
476 *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
478 } else if (!strcmp(k, "push.gpgsign")) {
480 if (!git_config_get_value("push.gpgsign", &value)) {
481 switch (git_parse_maybe_bool(value)) {
483 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
486 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
489 if (value && !strcasecmp(value, "if-asked"))
490 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
492 return error("Invalid value for '%s'", k);
495 } else if (!strcmp(k, "push.recursesubmodules")) {
497 if (!git_config_get_value("push.recursesubmodules", &value))
498 recurse_submodules = parse_push_recurse_submodules_arg(k, value);
499 } else if (!strcmp(k, "submodule.recurse")) {
500 int val = git_config_bool(k, v) ?
501 RECURSE_SUBMODULES_ON_DEMAND : RECURSE_SUBMODULES_OFF;
502 recurse_submodules = val;
503 } else if (!strcmp(k, "push.pushoption")) {
505 return config_error_nonbool(k);
508 string_list_clear(&push_options_config, 0);
510 string_list_append(&push_options_config, v);
512 } else if (!strcmp(k, "color.push")) {
513 push_use_color = git_config_colorbool(k, v);
515 } else if (skip_prefix(k, "color.push.", &slot_name)) {
516 int slot = parse_push_color_slot(slot_name);
520 return config_error_nonbool(k);
521 return color_parse(v, push_colors[slot]);
524 return git_default_config(k, v, NULL);
527 int cmd_push(int argc, const char **argv, const char *prefix)
533 const char *repo = NULL; /* default repository */
534 struct string_list push_options_cmdline = STRING_LIST_INIT_DUP;
535 struct string_list *push_options;
536 const struct string_list_item *item;
537 struct remote *remote;
539 struct option options[] = {
540 OPT__VERBOSITY(&verbosity),
541 OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
542 OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
543 OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
544 (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
545 OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")),
546 OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
547 OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
548 OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
549 OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
551 0, CAS_OPT_NAME, &cas, N_("<refname>:<expect>"),
552 N_("require old value of ref to be at this value"),
553 PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP, parseopt_push_cas_option },
554 { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, "(check|on-demand|no)",
555 N_("control recursive pushing of submodules"),
556 PARSE_OPT_OPTARG, option_parse_recurse_submodules },
557 OPT_BOOL_F( 0 , "thin", &thin, N_("use thin pack"), PARSE_OPT_NOCOMPLETE),
558 OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
559 OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
560 OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
561 TRANSPORT_PUSH_SET_UPSTREAM),
562 OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
563 OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
564 TRANSPORT_PUSH_PRUNE),
565 OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
566 OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
567 TRANSPORT_PUSH_FOLLOW_TAGS),
569 0, "signed", &push_cert, "(yes|no|if-asked)", N_("GPG sign the push"),
570 PARSE_OPT_OPTARG, option_parse_push_signed },
571 OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
572 OPT_STRING_LIST('o', "push-option", &push_options_cmdline, N_("server-specific"), N_("option to transmit")),
573 OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
574 TRANSPORT_FAMILY_IPV4),
575 OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
576 TRANSPORT_FAMILY_IPV6),
580 packet_trace_identity("push");
581 git_config(git_push_config, &flags);
582 argc = parse_options(argc, argv, prefix, options, push_usage, 0);
583 push_options = (push_options_cmdline.nr
584 ? &push_options_cmdline
585 : &push_options_config);
586 set_push_cert_flags(&flags, push_cert);
588 if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
589 die(_("--delete is incompatible with --all, --mirror and --tags"));
590 if (deleterefs && argc < 2)
591 die(_("--delete doesn't make sense without any refs"));
593 if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
594 flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
595 else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
596 flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
597 else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
598 flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
601 refspec_append(&rs, "refs/tags/*");
605 set_refspecs(argv + 1, argc - 1, repo);
608 remote = pushremote_get(repo);
611 die(_("bad repository '%s'"), repo);
612 die(_("No configured push destination.\n"
613 "Either specify the URL from the command-line or configure a remote repository using\n"
615 " git remote add <name> <url>\n"
617 "and then push using the remote name\n"
619 " git push <name>\n"));
623 flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
625 if (flags & TRANSPORT_PUSH_ALL) {
627 die(_("--all and --tags are incompatible"));
629 die(_("--all can't be combined with refspecs"));
631 if (flags & TRANSPORT_PUSH_MIRROR) {
633 die(_("--mirror and --tags are incompatible"));
635 die(_("--mirror can't be combined with refspecs"));
637 if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
638 die(_("--all and --mirror are incompatible"));
640 for_each_string_list_item(item, push_options)
641 if (strchr(item->string, '\n'))
642 die(_("push options must not have new line characters"));
644 rc = do_push(repo, flags, push_options, remote);
645 string_list_clear(&push_options_cmdline, 0);
646 string_list_clear(&push_options_config, 0);
648 usage_with_options(push_usage, options);