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