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 
18 static const char * const push_usage[] = {
19 	N_("git push [<options>] [<repository> [<refspec>...]]"),
20 	NULL,
21 };
22 
23 static int push_use_color = -1;
24 static char push_colors[][COLOR_MAXLEN] = {
25 	GIT_COLOR_RESET,
26 	GIT_COLOR_RED,	/* ERROR */
27 };
28 
29 enum color_push {
30 	PUSH_COLOR_RESET = 0,
31 	PUSH_COLOR_ERROR = 1
32 };
33 
parse_push_color_slot(const char * slot)34 static 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 
push_get_color(enum color_push ix)43 static 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 
50 static int thin = 1;
51 static int deleterefs;
52 static const char *receivepack;
53 static int verbosity;
54 static int progress = -1;
55 static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
56 static enum transport_family family;
57 
58 static struct push_cas_option cas;
59 
60 static struct refspec rs = REFSPEC_INIT_PUSH;
61 
62 static struct string_list push_options_config = STRING_LIST_INIT_DUP;
63 
map_refspec(const char * ref,struct remote * remote,struct ref * local_refs)64 static const char *map_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 		return ref;
73 
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);
84 		}
85 	}
86 
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);
95 		}
96 	}
97 
98 	return ref;
99 }
100 
set_refspecs(const char ** refs,int nr,const char * repo)101 static 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 			struct strbuf tagref = STRBUF_INIT;
111 			if (nr <= ++i)
112 				die(_("tag shorthand without <tag>"));
113 			ref = refs[i];
114 			if (deleterefs)
115 				strbuf_addf(&tagref, ":refs/tags/%s", ref);
116 			else
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, ':')) {
126 			if (!remote) {
127 				/* lazily grab remote and local_refs */
128 				remote = remote_get(repo);
129 				local_refs = get_local_heads();
130 			}
131 			ref = map_refspec(ref, remote, local_refs);
132 		}
133 		refspec_append(&rs, ref);
134 	}
135 }
136 
push_url_of_remote(struct remote * remote,const char *** url_p)137 static int push_url_of_remote(struct remote *remote, const char ***url_p)
138 {
139 	if (remote->pushurl_nr) {
140 		*url_p = remote->pushurl;
141 		return remote->pushurl_nr;
142 	}
143 	*url_p = remote->url;
144 	return remote->url_nr;
145 }
146 
die_push_simple(struct branch * branch,struct remote * remote)147 static NORETURN void die_push_simple(struct branch *branch,
148 				     struct remote *remote)
149 {
150 	/*
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.
157 	 */
158 	const char *advice_maybe = "";
159 	const char *short_upstream = branch->merge[0]->src;
160 
161 	skip_prefix(short_upstream, "refs/heads/", &short_upstream);
162 
163 	/*
164 	 * Don't show advice for people who explicitly set
165 	 * push.default.
166 	 */
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"
174 	      "\n"
175 	      "    git push %s HEAD:%s\n"
176 	      "\n"
177 	      "To push to the branch of the same name on the remote, use\n"
178 	      "\n"
179 	      "    git push %s HEAD\n"
180 	      "%s"),
181 	    remote->name, short_upstream,
182 	    remote->name, advice_maybe);
183 }
184 
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"
188 	   "state now, use\n"
189 	   "\n"
190 	   "    git push %s HEAD:<name-of-remote-branch>\n");
191 
setup_push_upstream(struct remote * remote,struct branch * branch,int triangular,int simple)192 static void setup_push_upstream(struct remote *remote, struct branch *branch,
193 				int triangular, int simple)
194 {
195 	struct strbuf refspec = STRBUF_INIT;
196 
197 	if (!branch)
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"
202 		    "\n"
203 		    "    git push --set-upstream %s %s\n"),
204 		    branch->name,
205 		    remote->name,
206 		    branch->name);
207 	if (branch->merge_nr != 1)
208 		die(_("The current branch %s has multiple upstream branches, "
209 		    "refusing to push."), branch->name);
210 	if (triangular)
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);
215 
216 	if (simple) {
217 		/* Additional safety */
218 		if (strcmp(branch->refname, branch->merge[0]->src))
219 			die_push_simple(branch, remote);
220 	}
221 
222 	strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
223 	refspec_append(&rs, refspec.buf);
224 }
225 
setup_push_current(struct remote * remote,struct branch * branch)226 static void setup_push_current(struct remote *remote, struct branch *branch)
227 {
228 	struct strbuf refspec = STRBUF_INIT;
229 
230 	if (!branch)
231 		die(_(message_detached_head_die), remote->name);
232 	strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
233 	refspec_append(&rs, refspec.buf);
234 }
235 
is_workflow_triangular(struct remote * remote)236 static int is_workflow_triangular(struct remote *remote)
237 {
238 	struct remote *fetch_remote = remote_get(NULL);
239 	return (fetch_remote && fetch_remote != remote);
240 }
241 
setup_default_push_refspecs(struct remote * remote)242 static void setup_default_push_refspecs(struct remote *remote)
243 {
244 	struct branch *branch = branch_get(NULL);
245 	int triangular = is_workflow_triangular(remote);
246 
247 	switch (push_default) {
248 	default:
249 	case PUSH_DEFAULT_MATCHING:
250 		refspec_append(&rs, ":");
251 		break;
252 
253 	case PUSH_DEFAULT_UNSPECIFIED:
254 	case PUSH_DEFAULT_SIMPLE:
255 		if (triangular)
256 			setup_push_current(remote, branch);
257 		else
258 			setup_push_upstream(remote, branch, triangular, 1);
259 		break;
260 
261 	case PUSH_DEFAULT_UPSTREAM:
262 		setup_push_upstream(remote, branch, triangular, 0);
263 		break;
264 
265 	case PUSH_DEFAULT_CURRENT:
266 		setup_push_current(remote, branch);
267 		break;
268 
269 	case PUSH_DEFAULT_NOTHING:
270 		die(_("You didn't specify any refspecs to push, and "
271 		    "push.default is \"nothing\"."));
272 		break;
273 	}
274 }
275 
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.");
281 
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.");
287 
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.");
294 
295 static const char message_advice_ref_already_exists[] =
296 	N_("Updates were rejected because the tag already exists in the remote.");
297 
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");
302 
advise_pull_before_push(void)303 static void advise_pull_before_push(void)
304 {
305 	if (!advice_push_non_ff_current || !advice_push_update_rejected)
306 		return;
307 	advise(_(message_advice_pull_before_push));
308 }
309 
advise_checkout_pull_push(void)310 static void advise_checkout_pull_push(void)
311 {
312 	if (!advice_push_non_ff_matching || !advice_push_update_rejected)
313 		return;
314 	advise(_(message_advice_checkout_pull_push));
315 }
316 
advise_ref_already_exists(void)317 static void advise_ref_already_exists(void)
318 {
319 	if (!advice_push_already_exists || !advice_push_update_rejected)
320 		return;
321 	advise(_(message_advice_ref_already_exists));
322 }
323 
advise_ref_fetch_first(void)324 static void advise_ref_fetch_first(void)
325 {
326 	if (!advice_push_fetch_first || !advice_push_update_rejected)
327 		return;
328 	advise(_(message_advice_ref_fetch_first));
329 }
330 
advise_ref_needs_force(void)331 static void advise_ref_needs_force(void)
332 {
333 	if (!advice_push_needs_force || !advice_push_update_rejected)
334 		return;
335 	advise(_(message_advice_ref_needs_force));
336 }
337 
push_with_options(struct transport * transport,struct refspec * rs,int flags)338 static int push_with_options(struct transport *transport, struct refspec *rs,
339 			     int flags)
340 {
341 	int err;
342 	unsigned int reject_reasons;
343 
344 	transport_set_verbosity(transport, verbosity, progress);
345 	transport->family = family;
346 
347 	if (receivepack)
348 		transport_set_option(transport,
349 				     TRANS_OPT_RECEIVEPACK, receivepack);
350 	transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
351 
352 	if (!is_empty_cas(&cas)) {
353 		if (!transport->smart_options)
354 			die("underlying transport does not support --%s option",
355 			    CAS_OPT_NAME);
356 		transport->smart_options->cas = &cas;
357 	}
358 
359 	if (verbosity > 0)
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);
365 	if (err != 0) {
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));
369 	}
370 
371 	err |= transport_disconnect(transport);
372 	if (!err)
373 		return 0;
374 
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();
385 	}
386 
387 	return 1;
388 }
389 
do_push(const char * repo,int flags,const struct string_list * push_options,struct remote * remote)390 static int do_push(const char *repo, int flags,
391 		   const struct string_list *push_options,
392 		   struct remote *remote)
393 {
394 	int i, errs;
395 	const char **url;
396 	int url_nr;
397 	struct refspec *push_refspec = &rs;
398 
399 	if (push_options->nr)
400 		flags |= TRANSPORT_PUSH_OPTIONS;
401 
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);
407 	}
408 	errs = 0;
409 	url_nr = push_url_of_remote(remote, &url);
410 	if (url_nr) {
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))
417 				errs++;
418 		}
419 	} else {
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))
425 			errs++;
426 	}
427 	return !!errs;
428 }
429 
option_parse_recurse_submodules(const struct option * opt,const char * arg,int unset)430 static int option_parse_recurse_submodules(const struct option *opt,
431 				   const char *arg, int unset)
432 {
433 	int *recurse_submodules = opt->value;
434 
435 	if (unset)
436 		*recurse_submodules = RECURSE_SUBMODULES_OFF;
437 	else if (arg)
438 		*recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
439 	else
440 		die("%s missing parameter", opt->long_name);
441 
442 	return 0;
443 }
444 
set_push_cert_flags(int * flags,int v)445 static void set_push_cert_flags(int *flags, int v)
446 {
447 	switch (v) {
448 	case SEND_PACK_PUSH_CERT_NEVER:
449 		*flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
450 		break;
451 	case SEND_PACK_PUSH_CERT_ALWAYS:
452 		*flags |= TRANSPORT_PUSH_CERT_ALWAYS;
453 		*flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
454 		break;
455 	case SEND_PACK_PUSH_CERT_IF_ASKED:
456 		*flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
457 		*flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
458 		break;
459 	}
460 }
461 
462 
git_push_config(const char * k,const char * v,void * cb)463 static int git_push_config(const char *k, const char *v, void *cb)
464 {
465 	const char *slot_name;
466 	int *flags = cb;
467 	int status;
468 
469 	status = git_gpg_config(k, v, NULL);
470 	if (status)
471 		return status;
472 
473 	if (!strcmp(k, "push.followtags")) {
474 		if (git_config_bool(k, v))
475 			*flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
476 		else
477 			*flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
478 		return 0;
479 	} else if (!strcmp(k, "push.gpgsign")) {
480 		const char *value;
481 		if (!git_config_get_value("push.gpgsign", &value)) {
482 			switch (git_parse_maybe_bool(value)) {
483 			case 0:
484 				set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
485 				break;
486 			case 1:
487 				set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
488 				break;
489 			default:
490 				if (value && !strcasecmp(value, "if-asked"))
491 					set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
492 				else
493 					return error("Invalid value for '%s'", k);
494 			}
495 		}
496 	} else if (!strcmp(k, "push.recursesubmodules")) {
497 		const char *value;
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")) {
505 		if (!v)
506 			return config_error_nonbool(k);
507 		else
508 			if (!*v)
509 				string_list_clear(&push_options_config, 0);
510 			else
511 				string_list_append(&push_options_config, v);
512 		return 0;
513 	} else if (!strcmp(k, "color.push")) {
514 		push_use_color = git_config_colorbool(k, v);
515 		return 0;
516 	} else if (skip_prefix(k, "color.push.", &slot_name)) {
517 		int slot = parse_push_color_slot(slot_name);
518 		if (slot < 0)
519 			return 0;
520 		if (!v)
521 			return config_error_nonbool(k);
522 		return color_parse(v, push_colors[slot]);
523 	}
524 
525 	return git_default_config(k, v, NULL);
526 }
527 
cmd_push(int argc,const char ** argv,const char * prefix)528 int cmd_push(int argc, const char **argv, const char *prefix)
529 {
530 	int flags = 0;
531 	int tags = 0;
532 	int push_cert = -1;
533 	int rc;
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;
539 
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),
551 		{ OPTION_CALLBACK,
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),
569 		{ OPTION_CALLBACK,
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),
578 		OPT_END()
579 	};
580 
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);
588 
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"));
593 
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;
600 
601 	if (tags)
602 		refspec_append(&rs, "refs/tags/*");
603 
604 	if (argc > 0) {
605 		repo = argv[0];
606 		set_refspecs(argv + 1, argc - 1, repo);
607 	}
608 
609 	remote = pushremote_get(repo);
610 	if (!remote) {
611 		if (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"
615 		    "\n"
616 		    "    git remote add <name> <url>\n"
617 		    "\n"
618 		    "and then push using the remote name\n"
619 		    "\n"
620 		    "    git push <name>\n"));
621 	}
622 
623 	if (remote->mirror)
624 		flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
625 
626 	if (flags & TRANSPORT_PUSH_ALL) {
627 		if (tags)
628 			die(_("--all and --tags are incompatible"));
629 		if (argc >= 2)
630 			die(_("--all can't be combined with refspecs"));
631 	}
632 	if (flags & TRANSPORT_PUSH_MIRROR) {
633 		if (tags)
634 			die(_("--mirror and --tags are incompatible"));
635 		if (argc >= 2)
636 			die(_("--mirror can't be combined with refspecs"));
637 	}
638 	if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
639 		die(_("--all and --mirror are incompatible"));
640 
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"));
644 
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);
648 	if (rc == -1)
649 		usage_with_options(push_usage, options);
650 	else
651 		return rc;
652 }
653