]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/push.c
Git 2.20
[thirdparty/git.git] / builtin / push.c
CommitLineData
755225de
LT
1/*
2 * "git push"
3 */
4#include "cache.h"
b2141fc1 5#include "config.h"
755225de 6#include "refs.h"
ec0cb496 7#include "refspec.h"
755225de
LT
8#include "run-command.h"
9#include "builtin.h"
5751f490 10#include "remote.h"
9b288516 11#include "transport.h"
378c4832 12#include "parse-options.h"
d2b17b32 13#include "submodule.h"
b33a15b0 14#include "submodule-config.h"
30261094 15#include "send-pack.h"
960786e7 16#include "color.h"
755225de 17
378c4832 18static const char * const push_usage[] = {
78dafaa5 19 N_("git push [<options>] [<repository> [<refspec>...]]"),
378c4832
DB
20 NULL,
21};
755225de 22
960786e7
RD
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
f7c815c3 50static int thin = 1;
f517f1f2 51static int deleterefs;
d23842fd 52static const char *receivepack;
8afd8dc0 53static int verbosity;
d34141cd
MC
54static int progress = -1;
55static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
c915f11e 56static enum transport_family family;
755225de 57
28f5d176
JH
58static struct push_cas_option cas;
59
aa40289c 60static struct refspec rs = REFSPEC_INIT_PUSH;
755225de 61
d8052750
MP
62static struct string_list push_options_config = STRING_LIST_INIT_DUP;
63
ca02465b
JH
64static const char *map_refspec(const char *ref,
65 struct remote *remote, struct ref *local_refs)
755225de 66{
ca02465b
JH
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
6bdb304b 73 if (remote->push.nr) {
0ad4a5ff
BW
74 struct refspec_item query;
75 memset(&query, 0, sizeof(struct refspec_item));
ca02465b 76 query.src = matched->name;
86baf825 77 if (!query_refspecs(&remote->push, &query) && query.dst) {
ca02465b
JH
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
fc9261ca 86 if (push_default == PUSH_DEFAULT_UPSTREAM &&
e3f11859 87 starts_with(matched->name, "refs/heads/")) {
fc9261ca
JH
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
ca02465b
JH
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;
8558fd9e 104 int i;
ca02465b 105
8558fd9e
DB
106 for (i = 0; i < nr; i++) {
107 const char *ref = refs[i];
108 if (!strcmp("tag", ref)) {
50d829c1 109 struct strbuf tagref = STRBUF_INIT;
8558fd9e 110 if (nr <= ++i)
8352d29e 111 die(_("tag shorthand without <tag>"));
50d829c1
JH
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);
ca02465b
JH
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();
f517f1f2 129 }
ca02465b 130 ref = map_refspec(ref, remote, local_refs);
50d829c1 131 }
aa40289c 132 refspec_append(&rs, ref);
755225de 133 }
755225de
LT
134}
135
135dadef
JH
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
b55e6775
MM
146static NORETURN int die_push_simple(struct branch *branch, struct remote *remote) {
147 /*
148 * There's no point in using shorten_unambiguous_ref here,
149 * as the ambiguity would be on the remote side, not what
150 * we have locally. Plus, this is supposed to be the simple
151 * mode. If the user is doing something crazy like setting
152 * upstream to a non-branch, we should probably be showing
153 * them the big ugly fully qualified ref.
154 */
155 const char *advice_maybe = "";
cf4fff57
JK
156 const char *short_upstream = branch->merge[0]->src;
157
158 skip_prefix(short_upstream, "refs/heads/", &short_upstream);
b55e6775 159
b55e6775 160 /*
98e023de 161 * Don't show advice for people who explicitly set
b55e6775
MM
162 * push.default.
163 */
164 if (push_default == PUSH_DEFAULT_UNSPECIFIED)
165 advice_maybe = _("\n"
166 "To choose either option permanently, "
167 "see push.default in 'git help config'.");
168 die(_("The upstream branch of your current branch does not match\n"
169 "the name of your current branch. To push to the upstream branch\n"
170 "on the remote, use\n"
171 "\n"
172 " git push %s HEAD:%s\n"
173 "\n"
174 "To push to the branch of the same name on the remote, use\n"
175 "\n"
82471667 176 " git push %s HEAD\n"
b55e6775
MM
177 "%s"),
178 remote->name, short_upstream,
82471667 179 remote->name, advice_maybe);
b55e6775
MM
180}
181
35ee69c0
RR
182static const char message_detached_head_die[] =
183 N_("You are not currently on a branch.\n"
184 "To push the history leading to the current (detached HEAD)\n"
185 "state now, use\n"
186 "\n"
187 " git push %s HEAD:<name-of-remote-branch>\n");
188
ed2b1829 189static void setup_push_upstream(struct remote *remote, struct branch *branch,
00a6fa07 190 int triangular, int simple)
52153747
FAG
191{
192 struct strbuf refspec = STRBUF_INIT;
ed2b1829 193
52153747 194 if (!branch)
35ee69c0 195 die(_(message_detached_head_die), remote->name);
135dadef 196 if (!branch->merge_nr || !branch->merge || !branch->remote_name)
6c80cd29 197 die(_("The current branch %s has no upstream branch.\n"
ec8460bd
MM
198 "To push the current branch and set the remote as upstream, use\n"
199 "\n"
6c80cd29 200 " git push --set-upstream %s %s\n"),
ec8460bd
MM
201 branch->name,
202 remote->name,
52153747
FAG
203 branch->name);
204 if (branch->merge_nr != 1)
6c80cd29 205 die(_("The current branch %s has multiple upstream branches, "
8352d29e 206 "refusing to push."), branch->name);
ed2b1829 207 if (triangular)
135dadef
JH
208 die(_("You are pushing to remote '%s', which is not the upstream of\n"
209 "your current branch '%s', without telling me what to push\n"
210 "to update which remote branch."),
211 remote->name, branch->name);
ed2b1829 212
00a6fa07 213 if (simple) {
ed2b1829
RR
214 /* Additional safety */
215 if (strcmp(branch->refname, branch->merge[0]->src))
216 die_push_simple(branch, remote);
217 }
135dadef 218
eef2bdaa 219 strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
aa40289c 220 refspec_append(&rs, refspec.buf);
52153747
FAG
221}
222
ed2b1829
RR
223static void setup_push_current(struct remote *remote, struct branch *branch)
224{
eef2bdaa
JH
225 struct strbuf refspec = STRBUF_INIT;
226
ed2b1829
RR
227 if (!branch)
228 die(_(message_detached_head_die), remote->name);
eef2bdaa 229 strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
aa40289c 230 refspec_append(&rs, refspec.buf);
ed2b1829
RR
231}
232
ed2b1829
RR
233static int is_workflow_triangular(struct remote *remote)
234{
235 struct remote *fetch_remote = remote_get(NULL);
236 return (fetch_remote && fetch_remote != remote);
237}
238
ec8460bd 239static void setup_default_push_refspecs(struct remote *remote)
52153747 240{
ed2b1829
RR
241 struct branch *branch = branch_get(NULL);
242 int triangular = is_workflow_triangular(remote);
7b2ecd81 243
52153747 244 switch (push_default) {
bba0fd22 245 default:
52153747 246 case PUSH_DEFAULT_MATCHING:
aa40289c 247 refspec_append(&rs, ":");
52153747
FAG
248 break;
249
b2ed944a 250 case PUSH_DEFAULT_UNSPECIFIED:
b55e6775 251 case PUSH_DEFAULT_SIMPLE:
ed2b1829
RR
252 if (triangular)
253 setup_push_current(remote, branch);
254 else
00a6fa07 255 setup_push_upstream(remote, branch, triangular, 1);
b55e6775
MM
256 break;
257
53c40311 258 case PUSH_DEFAULT_UPSTREAM:
00a6fa07 259 setup_push_upstream(remote, branch, triangular, 0);
52153747
FAG
260 break;
261
262 case PUSH_DEFAULT_CURRENT:
ed2b1829 263 setup_push_current(remote, branch);
52153747
FAG
264 break;
265
266 case PUSH_DEFAULT_NOTHING:
8352d29e
ÆAB
267 die(_("You didn't specify any refspecs to push, and "
268 "push.default is \"nothing\"."));
52153747
FAG
269 break;
270 }
271}
272
f25950f3
CT
273static const char message_advice_pull_before_push[] =
274 N_("Updates were rejected because the tip of your current branch is behind\n"
fc6c4e96
JK
275 "its remote counterpart. Integrate the remote changes (e.g.\n"
276 "'git pull ...') before pushing again.\n"
f25950f3
CT
277 "See the 'Note about fast-forwards' in 'git push --help' for details.");
278
f25950f3
CT
279static const char message_advice_checkout_pull_push[] =
280 N_("Updates were rejected because a pushed branch tip is behind its remote\n"
fc6c4e96
JK
281 "counterpart. Check out this branch and integrate the remote changes\n"
282 "(e.g. 'git pull ...') before pushing again.\n"
f25950f3
CT
283 "See the 'Note about fast-forwards' in 'git push --help' for details.");
284
75e5c0dc
JH
285static const char message_advice_ref_fetch_first[] =
286 N_("Updates were rejected because the remote contains work that you do\n"
287 "not have locally. This is usually caused by another repository pushing\n"
fc6c4e96
JK
288 "to the same ref. You may want to first integrate the remote changes\n"
289 "(e.g., 'git pull ...') before pushing again.\n"
75e5c0dc
JH
290 "See the 'Note about fast-forwards' in 'git push --help' for details.");
291
b24e6047 292static const char message_advice_ref_already_exists[] =
b4cf8db2 293 N_("Updates were rejected because the tag already exists in the remote.");
b24e6047 294
75e5c0dc
JH
295static const char message_advice_ref_needs_force[] =
296 N_("You cannot update a remote ref that points at a non-commit object,\n"
297 "or update a remote ref to make it point at a non-commit object,\n"
298 "without using the '--force' option.\n");
b24e6047 299
f25950f3
CT
300static void advise_pull_before_push(void)
301{
1184564e 302 if (!advice_push_non_ff_current || !advice_push_update_rejected)
f25950f3
CT
303 return;
304 advise(_(message_advice_pull_before_push));
305}
306
f25950f3
CT
307static void advise_checkout_pull_push(void)
308{
1184564e 309 if (!advice_push_non_ff_matching || !advice_push_update_rejected)
f25950f3
CT
310 return;
311 advise(_(message_advice_checkout_pull_push));
312}
313
b24e6047
CR
314static void advise_ref_already_exists(void)
315{
b4505682
CR
316 if (!advice_push_already_exists || !advice_push_update_rejected)
317 return;
b24e6047
CR
318 advise(_(message_advice_ref_already_exists));
319}
320
75e5c0dc
JH
321static void advise_ref_fetch_first(void)
322{
323 if (!advice_push_fetch_first || !advice_push_update_rejected)
324 return;
325 advise(_(message_advice_ref_fetch_first));
326}
327
328static void advise_ref_needs_force(void)
329{
330 if (!advice_push_needs_force || !advice_push_update_rejected)
331 return;
332 advise(_(message_advice_ref_needs_force));
333}
334
aa40289c
BW
335static int push_with_options(struct transport *transport, struct refspec *rs,
336 int flags)
fb0cc87e
DB
337{
338 int err;
10643d4e 339 unsigned int reject_reasons;
8afd8dc0 340
78381069 341 transport_set_verbosity(transport, verbosity, progress);
c915f11e 342 transport->family = family;
8afd8dc0 343
fb0cc87e
DB
344 if (receivepack)
345 transport_set_option(transport,
346 TRANS_OPT_RECEIVEPACK, receivepack);
f7c815c3 347 transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
fb0cc87e 348
91048a95
JH
349 if (!is_empty_cas(&cas)) {
350 if (!transport->smart_options)
351 die("underlying transport does not support --%s option",
352 CAS_OPT_NAME);
353 transport->smart_options->cas = &cas;
354 }
355
8afd8dc0 356 if (verbosity > 0)
8352d29e 357 fprintf(stderr, _("Pushing to %s\n"), transport->url);
306f22db 358 err = transport_push(transport, rs, flags, &reject_reasons);
960786e7
RD
359 if (err != 0) {
360 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_ERROR));
8352d29e 361 error(_("failed to push some refs to '%s'"), transport->url);
960786e7
RD
362 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_RESET));
363 }
53970b92 364
fb0cc87e 365 err |= transport_disconnect(transport);
fb0cc87e
DB
366 if (!err)
367 return 0;
368
10643d4e 369 if (reject_reasons & REJECT_NON_FF_HEAD) {
f25950f3 370 advise_pull_before_push();
10643d4e 371 } else if (reject_reasons & REJECT_NON_FF_OTHER) {
b2ed944a 372 advise_checkout_pull_push();
b24e6047
CR
373 } else if (reject_reasons & REJECT_ALREADY_EXISTS) {
374 advise_ref_already_exists();
75e5c0dc
JH
375 } else if (reject_reasons & REJECT_FETCH_FIRST) {
376 advise_ref_fetch_first();
377 } else if (reject_reasons & REJECT_NEEDS_FORCE) {
378 advise_ref_needs_force();
fb0cc87e
DB
379 }
380
381 return 1;
382}
383
f6a4e61f
SB
384static int do_push(const char *repo, int flags,
385 const struct string_list *push_options)
755225de 386{
5751f490 387 int i, errs;
f24f715e 388 struct remote *remote = pushremote_get(repo);
20346234
MG
389 const char **url;
390 int url_nr;
aa40289c 391 struct refspec *push_refspec = &rs;
755225de 392
fa685bdf
DB
393 if (!remote) {
394 if (repo)
8352d29e 395 die(_("bad repository '%s'"), repo);
6c80cd29 396 die(_("No configured push destination.\n"
a3f5e7a3
MM
397 "Either specify the URL from the command-line or configure a remote repository using\n"
398 "\n"
399 " git remote add <name> <url>\n"
400 "\n"
401 "and then push using the remote name\n"
402 "\n"
6c80cd29 403 " git push <name>\n"));
fa685bdf 404 }
755225de 405
84bb2dfd
PB
406 if (remote->mirror)
407 flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
408
f6a4e61f
SB
409 if (push_options->nr)
410 flags |= TRANSPORT_PUSH_OPTIONS;
411
aa40289c
BW
412 if (!push_refspec->nr && !(flags & TRANSPORT_PUSH_ALL)) {
413 if (remote->push.nr) {
414 push_refspec = &remote->push;
52153747 415 } else if (!(flags & TRANSPORT_PUSH_MIRROR))
ec8460bd 416 setup_default_push_refspecs(remote);
5751f490 417 }
fd1d1b05 418 errs = 0;
135dadef 419 url_nr = push_url_of_remote(remote, &url);
fb0cc87e
DB
420 if (url_nr) {
421 for (i = 0; i < url_nr; i++) {
422 struct transport *transport =
423 transport_get(remote, url[i]);
f6a4e61f
SB
424 if (flags & TRANSPORT_PUSH_OPTIONS)
425 transport->push_options = push_options;
aa40289c 426 if (push_with_options(transport, push_refspec, flags))
fb0cc87e 427 errs++;
07436e43 428 }
fb0cc87e
DB
429 } else {
430 struct transport *transport =
431 transport_get(remote, NULL);
f6a4e61f
SB
432 if (flags & TRANSPORT_PUSH_OPTIONS)
433 transport->push_options = push_options;
aa40289c 434 if (push_with_options(transport, push_refspec, flags))
fb0cc87e 435 errs++;
755225de 436 }
fd1d1b05 437 return !!errs;
755225de
LT
438}
439
d2b17b32
FG
440static int option_parse_recurse_submodules(const struct option *opt,
441 const char *arg, int unset)
442{
b33a15b0 443 int *recurse_submodules = opt->value;
eb21c732 444
b33a15b0
MC
445 if (unset)
446 *recurse_submodules = RECURSE_SUBMODULES_OFF;
447 else if (arg)
448 *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
449 else
450 die("%s missing parameter", opt->long_name);
d2b17b32
FG
451
452 return 0;
453}
454
68c757f2
DB
455static void set_push_cert_flags(int *flags, int v)
456{
457 switch (v) {
458 case SEND_PACK_PUSH_CERT_NEVER:
459 *flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
460 break;
461 case SEND_PACK_PUSH_CERT_ALWAYS:
462 *flags |= TRANSPORT_PUSH_CERT_ALWAYS;
463 *flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
464 break;
465 case SEND_PACK_PUSH_CERT_IF_ASKED:
466 *flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
467 *flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
468 break;
469 }
470}
471
472
b9459019
MG
473static int git_push_config(const char *k, const char *v, void *cb)
474{
960786e7 475 const char *slot_name;
a8bc269f 476 int *flags = cb;
b9459019
MG
477 int status;
478
479 status = git_gpg_config(k, v, NULL);
480 if (status)
481 return status;
a8bc269f
DO
482
483 if (!strcmp(k, "push.followtags")) {
484 if (git_config_bool(k, v))
485 *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
486 else
487 *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
488 return 0;
68c757f2
DB
489 } else if (!strcmp(k, "push.gpgsign")) {
490 const char *value;
491 if (!git_config_get_value("push.gpgsign", &value)) {
89576613 492 switch (git_parse_maybe_bool(value)) {
68c757f2
DB
493 case 0:
494 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
495 break;
496 case 1:
497 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
498 break;
499 default:
500 if (value && !strcasecmp(value, "if-asked"))
501 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
502 else
503 return error("Invalid value for '%s'", k);
504 }
505 }
b33a15b0
MC
506 } else if (!strcmp(k, "push.recursesubmodules")) {
507 const char *value;
508 if (!git_config_get_value("push.recursesubmodules", &value))
509 recurse_submodules = parse_push_recurse_submodules_arg(k, value);
4e53d6a5
SB
510 } else if (!strcmp(k, "submodule.recurse")) {
511 int val = git_config_bool(k, v) ?
512 RECURSE_SUBMODULES_ON_DEMAND : RECURSE_SUBMODULES_OFF;
513 recurse_submodules = val;
d8052750
MP
514 } else if (!strcmp(k, "push.pushoption")) {
515 if (!v)
516 return config_error_nonbool(k);
517 else
518 if (!*v)
519 string_list_clear(&push_options_config, 0);
520 else
521 string_list_append(&push_options_config, v);
522 return 0;
960786e7
RD
523 } else if (!strcmp(k, "color.push")) {
524 push_use_color = git_config_colorbool(k, v);
525 return 0;
526 } else if (skip_prefix(k, "color.push.", &slot_name)) {
527 int slot = parse_push_color_slot(slot_name);
528 if (slot < 0)
529 return 0;
530 if (!v)
531 return config_error_nonbool(k);
532 return color_parse(v, push_colors[slot]);
a8bc269f
DO
533 }
534
06038cd7 535 return git_default_config(k, v, NULL);
b9459019
MG
536}
537
a633fca0 538int cmd_push(int argc, const char **argv, const char *prefix)
755225de 539{
9b288516 540 int flags = 0;
378c4832 541 int tags = 0;
30261094 542 int push_cert = -1;
84bb2dfd 543 int rc;
5751f490 544 const char *repo = NULL; /* default repository */
d8052750
MP
545 struct string_list push_options_cmdline = STRING_LIST_INIT_DUP;
546 struct string_list *push_options;
54cc8aca 547 const struct string_list_item *item;
f6a4e61f 548
378c4832 549 struct option options[] = {
8afd8dc0 550 OPT__VERBOSITY(&verbosity),
78dafaa5
NTND
551 OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
552 OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
553 OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
c29c1b40 554 (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
38a25591 555 OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")),
d5d09d47 556 OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
78dafaa5
NTND
557 OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
558 OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
559 OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
28f5d176 560 { OPTION_CALLBACK,
c67318ec 561 0, CAS_OPT_NAME, &cas, N_("<refname>:<expect>"),
28f5d176 562 N_("require old value of ref to be at this value"),
c67318ec 563 PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP, parseopt_push_cas_option },
bbc072f5 564 { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, "(check|on-demand|no)",
f63cf8c9 565 N_("control recursive pushing of submodules"),
d2b17b32 566 PARSE_OPT_OPTARG, option_parse_recurse_submodules },
f1e1bdd6 567 OPT_BOOL_F( 0 , "thin", &thin, N_("use thin pack"), PARSE_OPT_NOCOMPLETE),
78dafaa5
NTND
568 OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
569 OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
570 OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
e9fcd1e2 571 TRANSPORT_PUSH_SET_UPSTREAM),
78dafaa5
NTND
572 OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
573 OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
6ddba5e2 574 TRANSPORT_PUSH_PRUNE),
ec55559f 575 OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
c2aba155
JH
576 OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
577 TRANSPORT_PUSH_FOLLOW_TAGS),
30261094 578 { OPTION_CALLBACK,
bbc072f5 579 0, "signed", &push_cert, "(yes|no|if-asked)", N_("GPG sign the push"),
30261094 580 PARSE_OPT_OPTARG, option_parse_push_signed },
d16c33b4 581 OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
d8052750 582 OPT_STRING_LIST('o', "push-option", &push_options_cmdline, N_("server-specific"), N_("option to transmit")),
c915f11e
EW
583 OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
584 TRANSPORT_FAMILY_IPV4),
585 OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
586 TRANSPORT_FAMILY_IPV6),
378c4832
DB
587 OPT_END()
588 };
755225de 589
bbc30f99 590 packet_trace_identity("push");
06c21e18 591 git_config(git_push_config, &flags);
37782920 592 argc = parse_options(argc, argv, prefix, options, push_usage, 0);
d8052750
MP
593 push_options = (push_options_cmdline.nr
594 ? &push_options_cmdline
595 : &push_options_config);
68c757f2 596 set_push_cert_flags(&flags, push_cert);
378c4832 597
f517f1f2 598 if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
8352d29e 599 die(_("--delete is incompatible with --all, --mirror and --tags"));
f517f1f2 600 if (deleterefs && argc < 2)
8352d29e 601 die(_("--delete doesn't make sense without any refs"));
800a4ab3
BW
602 if (flags & TRANSPORT_PUSH_ALL) {
603 if (tags)
604 die(_("--all and --tags are incompatible"));
605 if (argc >= 2)
606 die(_("--all can't be combined with refspecs"));
607 }
608 if (flags & TRANSPORT_PUSH_MIRROR) {
609 if (tags)
610 die(_("--mirror and --tags are incompatible"));
611 if (argc >= 2)
612 die(_("--mirror can't be combined with refspecs"));
613 }
614 if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
615 die(_("--all and --mirror are incompatible"));
f517f1f2 616
b33a15b0
MC
617 if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
618 flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
619 else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
620 flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
225e8bf7
BW
621 else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
622 flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
b33a15b0 623
378c4832 624 if (tags)
aa40289c 625 refspec_append(&rs, "refs/tags/*");
378c4832
DB
626
627 if (argc > 0) {
628 repo = argv[0];
ca02465b 629 set_refspecs(argv + 1, argc - 1, repo);
755225de 630 }
8558fd9e 631
d8052750 632 for_each_string_list_item(item, push_options)
f6a4e61f
SB
633 if (strchr(item->string, '\n'))
634 die(_("push options must not have new line characters"));
635
d8052750
MP
636 rc = do_push(repo, flags, push_options);
637 string_list_clear(&push_options_cmdline, 0);
638 string_list_clear(&push_options_config, 0);
84bb2dfd 639 if (rc == -1)
94c89ba6 640 usage_with_options(push_usage, options);
84bb2dfd
PB
641 else
642 return rc;
755225de 643}