1/*
2 * "git push"
3 */
4#include "cache.h"
5#include "config.h"
6#include "refs.h"
7#include "refspec.h"
8#include "run-command.h"
9#include "builtin.h"
10#include "remote.h"
11#include "transport.h"
12#include "parse-options.h"
13#include "submodule.h"
14#include "submodule-config.h"
15#include "send-pack.h"
16#include "color.h"
17
18static const char * const push_usage[] = {
19 N_("git push [<options>] [<repository> [<refspec>...]]"),
20 NULL,
21};
22
23static int push_use_color = -1;
24static char push_colors[][COLOR_MAXLEN] = {
25 GIT_COLOR_RESET,
26 GIT_COLOR_RED, /* ERROR */
27};
28
29enum color_push {
30 PUSH_COLOR_RESET = 0,
31 PUSH_COLOR_ERROR = 1
32};
33
34static int parse_push_color_slot(const char *slot)
35{
36 if (!strcasecmp(slot, "reset"))
37 return PUSH_COLOR_RESET;
38 if (!strcasecmp(slot, "error"))
39 return PUSH_COLOR_ERROR;
40 return -1;
41}
42
43static const char *push_get_color(enum color_push ix)
44{
45 if (want_color_stderr(push_use_color))
46 return push_colors[ix];
47 return "";
48}
49
50static int thin = 1;
51static int deleterefs;
52static const char *receivepack;
53static int verbosity;
54static int progress = -1;
55static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
56static enum transport_family family;
57
58static struct push_cas_option cas;
59
60static struct refspec rs = REFSPEC_INIT_PUSH;
61
62static struct string_list push_options_config = STRING_LIST_INIT_DUP;
63
64static const char *map_refspec(const char *ref,
65 struct remote *remote, struct ref *local_refs)
66{
67 struct ref *matched = NULL;
68
69 /* Does "ref" uniquely name our ref? */
70 if (count_refspec_match(ref, local_refs, &matched) != 1)
71 return ref;
72
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);
83 }
84 }
85
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);
94 }
95 }
96
97 return ref;
98}
99
100static void set_refspecs(const char **refs, int nr, const char *repo)
101{
102 struct remote *remote = NULL;
103 struct ref *local_refs = NULL;
104 int i;
105
106 for (i = 0; i < nr; i++) {
107 const char *ref = refs[i];
108 if (!strcmp("tag", ref)) {
109 struct strbuf tagref = STRBUF_INIT;
110 if (nr <= ++i)
111 die(_("tag shorthand without <tag>"));
112 ref = refs[i];
113 if (deleterefs)
114 strbuf_addf(&tagref, ":refs/tags/%s", ref);
115 else
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, ':')) {
125 if (!remote) {
126 /* lazily grab remote and local_refs */
127 remote = remote_get(repo);
128 local_refs = get_local_heads();
129 }
130 ref = map_refspec(ref, remote, local_refs);
131 }
132 refspec_append(&rs, ref);
133 }
134}
135
136static int push_url_of_remote(struct remote *remote, const char ***url_p)
137{
138 if (remote->pushurl_nr) {
139 *url_p = remote->pushurl;
140 return remote->pushurl_nr;
141 }
142 *url_p = remote->url;
143 return remote->url_nr;
144}
145
146static NORETURN int die_push_simple(struct branch *branch,
147 struct remote *remote)
148{
149 /*
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.
156 */
157 const char *advice_maybe = "";
158 const char *short_upstream = branch->merge[0]->src;
159
160 skip_prefix(short_upstream, "refs/heads/", &short_upstream);
161
162 /*
163 * Don't show advice for people who explicitly set
164 * push.default.
165 */
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"
173 "\n"
174 " git push %s HEAD:%s\n"
175 "\n"
176 "To push to the branch of the same name on the remote, use\n"
177 "\n"
178 " git push %s HEAD\n"
179 "%s"),
180 remote->name, short_upstream,
181 remote->name, advice_maybe);
182}
183
184static 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"
187 "state now, use\n"
188 "\n"
189 " git push %s HEAD:<name-of-remote-branch>\n");
190
191static void setup_push_upstream(struct remote *remote, struct branch *branch,
192 int triangular, int simple)
193{
194 struct strbuf refspec = STRBUF_INIT;
195
196 if (!branch)
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"
201 "\n"
202 " git push --set-upstream %s %s\n"),
203 branch->name,
204 remote->name,
205 branch->name);
206 if (branch->merge_nr != 1)
207 die(_("The current branch %s has multiple upstream branches, "
208 "refusing to push."), branch->name);
209 if (triangular)
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);
214
215 if (simple) {
216 /* Additional safety */
217 if (strcmp(branch->refname, branch->merge[0]->src))
218 die_push_simple(branch, remote);
219 }
220
221 strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
222 refspec_append(&rs, refspec.buf);
223}
224
225static void setup_push_current(struct remote *remote, struct branch *branch)
226{
227 struct strbuf refspec = STRBUF_INIT;
228
229 if (!branch)
230 die(_(message_detached_head_die), remote->name);
231 strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
232 refspec_append(&rs, refspec.buf);
233}
234
235static int is_workflow_triangular(struct remote *remote)
236{
237 struct remote *fetch_remote = remote_get(NULL);
238 return (fetch_remote && fetch_remote != remote);
239}
240
241static void setup_default_push_refspecs(struct remote *remote)
242{
243 struct branch *branch = branch_get(NULL);
244 int triangular = is_workflow_triangular(remote);
245
246 switch (push_default) {
247 default:
248 case PUSH_DEFAULT_MATCHING:
249 refspec_append(&rs, ":");
250 break;
251
252 case PUSH_DEFAULT_UNSPECIFIED:
253 case PUSH_DEFAULT_SIMPLE:
254 if (triangular)
255 setup_push_current(remote, branch);
256 else
257 setup_push_upstream(remote, branch, triangular, 1);
258 break;
259
260 case PUSH_DEFAULT_UPSTREAM:
261 setup_push_upstream(remote, branch, triangular, 0);
262 break;
263
264 case PUSH_DEFAULT_CURRENT:
265 setup_push_current(remote, branch);
266 break;
267
268 case PUSH_DEFAULT_NOTHING:
269 die(_("You didn't specify any refspecs to push, and "
270 "push.default is \"nothing\"."));
271 break;
272 }
273}
274
275static 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.");
280
281static 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.");
286
287static 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.");
293
294static const char message_advice_ref_already_exists[] =
295 N_("Updates were rejected because the tag already exists in the remote.");
296
297static 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");
301
302static void advise_pull_before_push(void)
303{
304 if (!advice_push_non_ff_current || !advice_push_update_rejected)
305 return;
306 advise(_(message_advice_pull_before_push));
307}
308
309static void advise_checkout_pull_push(void)
310{
311 if (!advice_push_non_ff_matching || !advice_push_update_rejected)
312 return;
313 advise(_(message_advice_checkout_pull_push));
314}
315
316static void advise_ref_already_exists(void)
317{
318 if (!advice_push_already_exists || !advice_push_update_rejected)
319 return;
320 advise(_(message_advice_ref_already_exists));
321}
322
323static void advise_ref_fetch_first(void)
324{
325 if (!advice_push_fetch_first || !advice_push_update_rejected)
326 return;
327 advise(_(message_advice_ref_fetch_first));
328}
329
330static void advise_ref_needs_force(void)
331{
332 if (!advice_push_needs_force || !advice_push_update_rejected)
333 return;
334 advise(_(message_advice_ref_needs_force));
335}
336
337static int push_with_options(struct transport *transport, struct refspec *rs,
338 int flags)
339{
340 int err;
341 unsigned int reject_reasons;
342
343 transport_set_verbosity(transport, verbosity, progress);
344 transport->family = family;
345
346 if (receivepack)
347 transport_set_option(transport,
348 TRANS_OPT_RECEIVEPACK, receivepack);
349 transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
350
351 if (!is_empty_cas(&cas)) {
352 if (!transport->smart_options)
353 die("underlying transport does not support --%s option",
354 CAS_OPT_NAME);
355 transport->smart_options->cas = &cas;
356 }
357
358 if (verbosity > 0)
359 fprintf(stderr, _("Pushing to %s\n"), transport->url);
360 err = transport_push(transport, rs, flags, &reject_reasons);
361 if (err != 0) {
362 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_ERROR));
363 error(_("failed to push some refs to '%s'"), transport->url);
364 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_RESET));
365 }
366
367 err |= transport_disconnect(transport);
368 if (!err)
369 return 0;
370
371 if (reject_reasons & REJECT_NON_FF_HEAD) {
372 advise_pull_before_push();
373 } else if (reject_reasons & REJECT_NON_FF_OTHER) {
374 advise_checkout_pull_push();
375 } else if (reject_reasons & REJECT_ALREADY_EXISTS) {
376 advise_ref_already_exists();
377 } else if (reject_reasons & REJECT_FETCH_FIRST) {
378 advise_ref_fetch_first();
379 } else if (reject_reasons & REJECT_NEEDS_FORCE) {
380 advise_ref_needs_force();
381 }
382
383 return 1;
384}
385
386static int do_push(const char *repo, int flags,
387 const struct string_list *push_options)
388{
389 int i, errs;
390 struct remote *remote = pushremote_get(repo);
391 const char **url;
392 int url_nr;
393 struct refspec *push_refspec = &rs;
394
395 if (!remote) {
396 if (repo)
397 die(_("bad repository '%s'"), repo);
398 die(_("No configured push destination.\n"
399 "Either specify the URL from the command-line or configure a remote repository using\n"
400 "\n"
401 " git remote add <name> <url>\n"
402 "\n"
403 "and then push using the remote name\n"
404 "\n"
405 " git push <name>\n"));
406 }
407
408 if (remote->mirror)
409 flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
410
411 if (push_options->nr)
412 flags |= TRANSPORT_PUSH_OPTIONS;
413
414 if (!push_refspec->nr && !(flags & TRANSPORT_PUSH_ALL)) {
415 if (remote->push.nr) {
416 push_refspec = &remote->push;
417 } else if (!(flags & TRANSPORT_PUSH_MIRROR))
418 setup_default_push_refspecs(remote);
419 }
420 errs = 0;
421 url_nr = push_url_of_remote(remote, &url);
422 if (url_nr) {
423 for (i = 0; i < url_nr; i++) {
424 struct transport *transport =
425 transport_get(remote, url[i]);
426 if (flags & TRANSPORT_PUSH_OPTIONS)
427 transport->push_options = push_options;
428 if (push_with_options(transport, push_refspec, flags))
429 errs++;
430 }
431 } else {
432 struct transport *transport =
433 transport_get(remote, NULL);
434 if (flags & TRANSPORT_PUSH_OPTIONS)
435 transport->push_options = push_options;
436 if (push_with_options(transport, push_refspec, flags))
437 errs++;
438 }
439 return !!errs;
440}
441
442static int option_parse_recurse_submodules(const struct option *opt,
443 const char *arg, int unset)
444{
445 int *recurse_submodules = opt->value;
446
447 if (unset)
448 *recurse_submodules = RECURSE_SUBMODULES_OFF;
449 else if (arg)
450 *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
451 else
452 die("%s missing parameter", opt->long_name);
453
454 return 0;
455}
456
457static void set_push_cert_flags(int *flags, int v)
458{
459 switch (v) {
460 case SEND_PACK_PUSH_CERT_NEVER:
461 *flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
462 break;
463 case SEND_PACK_PUSH_CERT_ALWAYS:
464 *flags |= TRANSPORT_PUSH_CERT_ALWAYS;
465 *flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
466 break;
467 case SEND_PACK_PUSH_CERT_IF_ASKED:
468 *flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
469 *flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
470 break;
471 }
472}
473
474
475static int git_push_config(const char *k, const char *v, void *cb)
476{
477 const char *slot_name;
478 int *flags = cb;
479 int status;
480
481 status = git_gpg_config(k, v, NULL);
482 if (status)
483 return status;
484
485 if (!strcmp(k, "push.followtags")) {
486 if (git_config_bool(k, v))
487 *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
488 else
489 *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
490 return 0;
491 } else if (!strcmp(k, "push.gpgsign")) {
492 const char *value;
493 if (!git_config_get_value("push.gpgsign", &value)) {
494 switch (git_parse_maybe_bool(value)) {
495 case 0:
496 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
497 break;
498 case 1:
499 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
500 break;
501 default:
502 if (value && !strcasecmp(value, "if-asked"))
503 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
504 else
505 return error("Invalid value for '%s'", k);
506 }
507 }
508 } else if (!strcmp(k, "push.recursesubmodules")) {
509 const char *value;
510 if (!git_config_get_value("push.recursesubmodules", &value))
511 recurse_submodules = parse_push_recurse_submodules_arg(k, value);
512 } else if (!strcmp(k, "submodule.recurse")) {
513 int val = git_config_bool(k, v) ?
514 RECURSE_SUBMODULES_ON_DEMAND : RECURSE_SUBMODULES_OFF;
515 recurse_submodules = val;
516 } else if (!strcmp(k, "push.pushoption")) {
517 if (!v)
518 return config_error_nonbool(k);
519 else
520 if (!*v)
521 string_list_clear(&push_options_config, 0);
522 else
523 string_list_append(&push_options_config, v);
524 return 0;
525 } else if (!strcmp(k, "color.push")) {
526 push_use_color = git_config_colorbool(k, v);
527 return 0;
528 } else if (skip_prefix(k, "color.push.", &slot_name)) {
529 int slot = parse_push_color_slot(slot_name);
530 if (slot < 0)
531 return 0;
532 if (!v)
533 return config_error_nonbool(k);
534 return color_parse(v, push_colors[slot]);
535 }
536
537 return git_default_config(k, v, NULL);
538}
539
540int cmd_push(int argc, const char **argv, const char *prefix)
541{
542 int flags = 0;
543 int tags = 0;
544 int push_cert = -1;
545 int rc;
546 const char *repo = NULL; /* default repository */
547 struct string_list push_options_cmdline = STRING_LIST_INIT_DUP;
548 struct string_list *push_options;
549 const struct string_list_item *item;
550
551 struct option options[] = {
552 OPT__VERBOSITY(&verbosity),
553 OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
554 OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
555 OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
556 (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
557 OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")),
558 OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
559 OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
560 OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
561 OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
562 { OPTION_CALLBACK,
563 0, CAS_OPT_NAME, &cas, N_("<refname>:<expect>"),
564 N_("require old value of ref to be at this value"),
565 PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP, parseopt_push_cas_option },
566 { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, "(check|on-demand|no)",
567 N_("control recursive pushing of submodules"),
568 PARSE_OPT_OPTARG, option_parse_recurse_submodules },
569 OPT_BOOL_F( 0 , "thin", &thin, N_("use thin pack"), PARSE_OPT_NOCOMPLETE),
570 OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
571 OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
572 OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
573 TRANSPORT_PUSH_SET_UPSTREAM),
574 OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
575 OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
576 TRANSPORT_PUSH_PRUNE),
577 OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
578 OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
579 TRANSPORT_PUSH_FOLLOW_TAGS),
580 { OPTION_CALLBACK,
581 0, "signed", &push_cert, "(yes|no|if-asked)", N_("GPG sign the push"),
582 PARSE_OPT_OPTARG, option_parse_push_signed },
583 OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
584 OPT_STRING_LIST('o', "push-option", &push_options_cmdline, N_("server-specific"), N_("option to transmit")),
585 OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
586 TRANSPORT_FAMILY_IPV4),
587 OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
588 TRANSPORT_FAMILY_IPV6),
589 OPT_END()
590 };
591
592 packet_trace_identity("push");
593 git_config(git_push_config, &flags);
594 argc = parse_options(argc, argv, prefix, options, push_usage, 0);
595 push_options = (push_options_cmdline.nr
596 ? &push_options_cmdline
597 : &push_options_config);
598 set_push_cert_flags(&flags, push_cert);
599
600 if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
601 die(_("--delete is incompatible with --all, --mirror and --tags"));
602 if (deleterefs && argc < 2)
603 die(_("--delete doesn't make sense without any refs"));
604 if (flags & TRANSPORT_PUSH_ALL) {
605 if (tags)
606 die(_("--all and --tags are incompatible"));
607 if (argc >= 2)
608 die(_("--all can't be combined with refspecs"));
609 }
610 if (flags & TRANSPORT_PUSH_MIRROR) {
611 if (tags)
612 die(_("--mirror and --tags are incompatible"));
613 if (argc >= 2)
614 die(_("--mirror can't be combined with refspecs"));
615 }
616 if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
617 die(_("--all and --mirror are incompatible"));
618
619 if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
620 flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
621 else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
622 flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
623 else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
624 flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
625
626 if (tags)
627 refspec_append(&rs, "refs/tags/*");
628
629 if (argc > 0) {
630 repo = argv[0];
631 set_refspecs(argv + 1, argc - 1, repo);
632 }
633
634 for_each_string_list_item(item, push_options)
635 if (strchr(item->string, '\n'))
636 die(_("push options must not have new line characters"));
637
638 rc = do_push(repo, flags, push_options);
639 string_list_clear(&push_options_cmdline, 0);
640 string_list_clear(&push_options_config, 0);
641 if (rc == -1)
642 usage_with_options(push_usage, options);
643 else
644 return rc;
645}