l10n: bg.po: Updated Bulgarian translation (5211t)
[git.git] / builtin / push.c
blob4b026ce6c6a90aea7bf50e8f193a6420471c2df3
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"
18 static const char * const push_usage[] = {
19 N_("git push [<options>] [<repository> [<refspec>...]]"),
20 NULL,
23 static int push_use_color = -1;
24 static char push_colors[][COLOR_MAXLEN] = {
25 GIT_COLOR_RESET,
26 GIT_COLOR_RED, /* ERROR */
29 enum color_push {
30 PUSH_COLOR_RESET = 0,
31 PUSH_COLOR_ERROR = 1
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;
40 return -1;
43 static const char *push_get_color(enum color_push ix)
45 if (want_color_stderr(push_use_color))
46 return push_colors[ix];
47 return "";
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;
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 void refspec_append_mapped(struct refspec *refspec, const char *ref,
65 struct remote *remote, struct ref *local_refs)
67 const char *branch_name;
68 struct ref *matched = NULL;
70 /* Does "ref" uniquely name our ref? */
71 if (count_refspec_match(ref, local_refs, &matched) != 1) {
72 refspec_append(refspec, ref);
73 return;
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;
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;
98 refspec_append(refspec, ref);
101 static void set_refspecs(const char **refs, int nr, const char *repo)
103 struct remote *remote = NULL;
104 struct ref *local_refs = NULL;
105 int i;
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, ':') || !*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();
127 refspec_append_mapped(&rs, ref, remote, local_refs);
128 } else
129 refspec_append(&rs, ref);
133 static int push_url_of_remote(struct remote *remote, const char ***url_p)
135 if (remote->pushurl_nr) {
136 *url_p = remote->pushurl;
137 return remote->pushurl_nr;
139 *url_p = remote->url;
140 return remote->url_nr;
143 static NORETURN void die_push_simple(struct branch *branch,
144 struct remote *remote)
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.
154 const char *advice_maybe = "";
155 const char *short_upstream = branch->merge[0]->src;
157 skip_prefix(short_upstream, "refs/heads/", &short_upstream);
160 * Don't show advice for people who explicitly set
161 * push.default.
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);
181 static 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");
188 static const char *get_upstream_ref(struct branch *branch, const char *remote_name)
190 if (!branch->merge_nr || !branch->merge || !branch->remote_name)
191 die(_("The current branch %s has no upstream branch.\n"
192 "To push the current branch and set the remote as upstream, use\n"
193 "\n"
194 " git push --set-upstream %s %s\n"),
195 branch->name,
196 remote_name,
197 branch->name);
198 if (branch->merge_nr != 1)
199 die(_("The current branch %s has multiple upstream branches, "
200 "refusing to push."), branch->name);
202 return branch->merge[0]->src;
205 static void setup_default_push_refspecs(struct remote *remote)
207 struct branch *branch;
208 const char *dst;
209 int same_remote;
211 switch (push_default) {
212 case PUSH_DEFAULT_MATCHING:
213 refspec_append(&rs, ":");
214 return;
216 case PUSH_DEFAULT_NOTHING:
217 die(_("You didn't specify any refspecs to push, and "
218 "push.default is \"nothing\"."));
219 return;
220 default:
221 break;
224 branch = branch_get(NULL);
225 if (!branch)
226 die(_(message_detached_head_die), remote->name);
228 dst = branch->refname;
229 same_remote = !strcmp(remote->name, remote_for_branch(branch, NULL));
231 switch (push_default) {
232 default:
233 case PUSH_DEFAULT_UNSPECIFIED:
234 case PUSH_DEFAULT_SIMPLE:
235 if (!same_remote)
236 break;
237 if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
238 die_push_simple(branch, remote);
239 break;
241 case PUSH_DEFAULT_UPSTREAM:
242 if (!same_remote)
243 die(_("You are pushing to remote '%s', which is not the upstream of\n"
244 "your current branch '%s', without telling me what to push\n"
245 "to update which remote branch."),
246 remote->name, branch->name);
247 dst = get_upstream_ref(branch, remote->name);
248 break;
250 case PUSH_DEFAULT_CURRENT:
251 break;
254 refspec_appendf(&rs, "%s:%s", branch->refname, dst);
257 static const char message_advice_pull_before_push[] =
258 N_("Updates were rejected because the tip of your current branch is behind\n"
259 "its remote counterpart. Integrate the remote changes (e.g.\n"
260 "'git pull ...') before pushing again.\n"
261 "See the 'Note about fast-forwards' in 'git push --help' for details.");
263 static const char message_advice_checkout_pull_push[] =
264 N_("Updates were rejected because a pushed branch tip is behind its remote\n"
265 "counterpart. Check out this branch and integrate the remote changes\n"
266 "(e.g. 'git pull ...') before pushing again.\n"
267 "See the 'Note about fast-forwards' in 'git push --help' for details.");
269 static const char message_advice_ref_fetch_first[] =
270 N_("Updates were rejected because the remote contains work that you do\n"
271 "not have locally. This is usually caused by another repository pushing\n"
272 "to the same ref. You may want to first integrate the remote changes\n"
273 "(e.g., 'git pull ...') before pushing again.\n"
274 "See the 'Note about fast-forwards' in 'git push --help' for details.");
276 static const char message_advice_ref_already_exists[] =
277 N_("Updates were rejected because the tag already exists in the remote.");
279 static const char message_advice_ref_needs_force[] =
280 N_("You cannot update a remote ref that points at a non-commit object,\n"
281 "or update a remote ref to make it point at a non-commit object,\n"
282 "without using the '--force' option.\n");
284 static const char message_advice_ref_needs_update[] =
285 N_("Updates were rejected because the tip of the remote-tracking\n"
286 "branch has been updated since the last checkout. You may want\n"
287 "to integrate those changes locally (e.g., 'git pull ...')\n"
288 "before forcing an update.\n");
290 static void advise_pull_before_push(void)
292 if (!advice_enabled(ADVICE_PUSH_NON_FF_CURRENT) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED))
293 return;
294 advise(_(message_advice_pull_before_push));
297 static void advise_checkout_pull_push(void)
299 if (!advice_enabled(ADVICE_PUSH_NON_FF_MATCHING) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED))
300 return;
301 advise(_(message_advice_checkout_pull_push));
304 static void advise_ref_already_exists(void)
306 if (!advice_enabled(ADVICE_PUSH_ALREADY_EXISTS) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED))
307 return;
308 advise(_(message_advice_ref_already_exists));
311 static void advise_ref_fetch_first(void)
313 if (!advice_enabled(ADVICE_PUSH_FETCH_FIRST) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED))
314 return;
315 advise(_(message_advice_ref_fetch_first));
318 static void advise_ref_needs_force(void)
320 if (!advice_enabled(ADVICE_PUSH_NEEDS_FORCE) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED))
321 return;
322 advise(_(message_advice_ref_needs_force));
325 static void advise_ref_needs_update(void)
327 if (!advice_enabled(ADVICE_PUSH_REF_NEEDS_UPDATE) || !advice_enabled(ADVICE_PUSH_UPDATE_REJECTED))
328 return;
329 advise(_(message_advice_ref_needs_update));
332 static int push_with_options(struct transport *transport, struct refspec *rs,
333 int flags)
335 int err;
336 unsigned int reject_reasons;
337 char *anon_url = transport_anonymize_url(transport->url);
339 transport_set_verbosity(transport, verbosity, progress);
340 transport->family = family;
342 if (receivepack)
343 transport_set_option(transport,
344 TRANS_OPT_RECEIVEPACK, receivepack);
345 transport_set_option(transport, TRANS_OPT_THIN, thin ? "yes" : NULL);
347 if (!is_empty_cas(&cas)) {
348 if (!transport->smart_options)
349 die("underlying transport does not support --%s option",
350 CAS_OPT_NAME);
351 transport->smart_options->cas = &cas;
354 if (verbosity > 0)
355 fprintf(stderr, _("Pushing to %s\n"), anon_url);
356 trace2_region_enter("push", "transport_push", the_repository);
357 err = transport_push(the_repository, transport,
358 rs, flags, &reject_reasons);
359 trace2_region_leave("push", "transport_push", the_repository);
360 if (err != 0) {
361 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_ERROR));
362 error(_("failed to push some refs to '%s'"), anon_url);
363 fprintf(stderr, "%s", push_get_color(PUSH_COLOR_RESET));
366 err |= transport_disconnect(transport);
367 free(anon_url);
368 if (!err)
369 return 0;
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 } else if (reject_reasons & REJECT_REF_NEEDS_UPDATE) {
382 advise_ref_needs_update();
385 return 1;
388 static int do_push(int flags,
389 const struct string_list *push_options,
390 struct remote *remote)
392 int i, errs;
393 const char **url;
394 int url_nr;
395 struct refspec *push_refspec = &rs;
397 if (push_options->nr)
398 flags |= TRANSPORT_PUSH_OPTIONS;
400 if (!push_refspec->nr && !(flags & TRANSPORT_PUSH_ALL)) {
401 if (remote->push.nr) {
402 push_refspec = &remote->push;
403 } else if (!(flags & TRANSPORT_PUSH_MIRROR))
404 setup_default_push_refspecs(remote);
406 errs = 0;
407 url_nr = push_url_of_remote(remote, &url);
408 if (url_nr) {
409 for (i = 0; i < url_nr; i++) {
410 struct transport *transport =
411 transport_get(remote, url[i]);
412 if (flags & TRANSPORT_PUSH_OPTIONS)
413 transport->push_options = push_options;
414 if (push_with_options(transport, push_refspec, flags))
415 errs++;
417 } else {
418 struct transport *transport =
419 transport_get(remote, NULL);
420 if (flags & TRANSPORT_PUSH_OPTIONS)
421 transport->push_options = push_options;
422 if (push_with_options(transport, push_refspec, flags))
423 errs++;
425 return !!errs;
428 static int option_parse_recurse_submodules(const struct option *opt,
429 const char *arg, int unset)
431 int *recurse_submodules = opt->value;
433 if (unset)
434 *recurse_submodules = RECURSE_SUBMODULES_OFF;
435 else
436 *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
438 return 0;
441 static void set_push_cert_flags(int *flags, int v)
443 switch (v) {
444 case SEND_PACK_PUSH_CERT_NEVER:
445 *flags &= ~(TRANSPORT_PUSH_CERT_ALWAYS | TRANSPORT_PUSH_CERT_IF_ASKED);
446 break;
447 case SEND_PACK_PUSH_CERT_ALWAYS:
448 *flags |= TRANSPORT_PUSH_CERT_ALWAYS;
449 *flags &= ~TRANSPORT_PUSH_CERT_IF_ASKED;
450 break;
451 case SEND_PACK_PUSH_CERT_IF_ASKED:
452 *flags |= TRANSPORT_PUSH_CERT_IF_ASKED;
453 *flags &= ~TRANSPORT_PUSH_CERT_ALWAYS;
454 break;
459 static int git_push_config(const char *k, const char *v, void *cb)
461 const char *slot_name;
462 int *flags = cb;
463 int status;
465 status = git_gpg_config(k, v, NULL);
466 if (status)
467 return status;
469 if (!strcmp(k, "push.followtags")) {
470 if (git_config_bool(k, v))
471 *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
472 else
473 *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
474 return 0;
475 } else if (!strcmp(k, "push.gpgsign")) {
476 const char *value;
477 if (!git_config_get_value("push.gpgsign", &value)) {
478 switch (git_parse_maybe_bool(value)) {
479 case 0:
480 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_NEVER);
481 break;
482 case 1:
483 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_ALWAYS);
484 break;
485 default:
486 if (value && !strcasecmp(value, "if-asked"))
487 set_push_cert_flags(flags, SEND_PACK_PUSH_CERT_IF_ASKED);
488 else
489 return error("Invalid value for '%s'", k);
492 } else if (!strcmp(k, "push.recursesubmodules")) {
493 const char *value;
494 if (!git_config_get_value("push.recursesubmodules", &value))
495 recurse_submodules = parse_push_recurse_submodules_arg(k, value);
496 } else if (!strcmp(k, "submodule.recurse")) {
497 int val = git_config_bool(k, v) ?
498 RECURSE_SUBMODULES_ON_DEMAND : RECURSE_SUBMODULES_OFF;
499 recurse_submodules = val;
500 } else if (!strcmp(k, "push.pushoption")) {
501 if (!v)
502 return config_error_nonbool(k);
503 else
504 if (!*v)
505 string_list_clear(&push_options_config, 0);
506 else
507 string_list_append(&push_options_config, v);
508 return 0;
509 } else if (!strcmp(k, "color.push")) {
510 push_use_color = git_config_colorbool(k, v);
511 return 0;
512 } else if (skip_prefix(k, "color.push.", &slot_name)) {
513 int slot = parse_push_color_slot(slot_name);
514 if (slot < 0)
515 return 0;
516 if (!v)
517 return config_error_nonbool(k);
518 return color_parse(v, push_colors[slot]);
519 } else if (!strcmp(k, "push.useforceifincludes")) {
520 if (git_config_bool(k, v))
521 *flags |= TRANSPORT_PUSH_FORCE_IF_INCLUDES;
522 else
523 *flags &= ~TRANSPORT_PUSH_FORCE_IF_INCLUDES;
524 return 0;
527 return git_default_config(k, v, NULL);
530 int cmd_push(int argc, const char **argv, const char *prefix)
532 int flags = 0;
533 int tags = 0;
534 int push_cert = -1;
535 int rc;
536 const char *repo = NULL; /* default repository */
537 struct string_list push_options_cmdline = STRING_LIST_INIT_DUP;
538 struct string_list *push_options;
539 const struct string_list_item *item;
540 struct remote *remote;
542 struct option options[] = {
543 OPT__VERBOSITY(&verbosity),
544 OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
545 OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
546 OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
547 (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
548 OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")),
549 OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
550 OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
551 OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
552 OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
553 OPT_CALLBACK_F(0, CAS_OPT_NAME, &cas, N_("<refname>:<expect>"),
554 N_("require old value of ref to be at this value"),
555 PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP, parseopt_push_cas_option),
556 OPT_BIT(0, TRANS_OPT_FORCE_IF_INCLUDES, &flags,
557 N_("require remote updates to be integrated locally"),
558 TRANSPORT_PUSH_FORCE_IF_INCLUDES),
559 OPT_CALLBACK(0, "recurse-submodules", &recurse_submodules, "(check|on-demand|no)",
560 N_("control recursive pushing of submodules"), option_parse_recurse_submodules),
561 OPT_BOOL_F( 0 , "thin", &thin, N_("use thin pack"), PARSE_OPT_NOCOMPLETE),
562 OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
563 OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
564 OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
565 TRANSPORT_PUSH_SET_UPSTREAM),
566 OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
567 OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
568 TRANSPORT_PUSH_PRUNE),
569 OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
570 OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
571 TRANSPORT_PUSH_FOLLOW_TAGS),
572 OPT_CALLBACK_F(0, "signed", &push_cert, "(yes|no|if-asked)", N_("GPG sign the push"),
573 PARSE_OPT_OPTARG, option_parse_push_signed),
574 OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
575 OPT_STRING_LIST('o', "push-option", &push_options_cmdline, N_("server-specific"), N_("option to transmit")),
576 OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
577 TRANSPORT_FAMILY_IPV4),
578 OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
579 TRANSPORT_FAMILY_IPV6),
580 OPT_END()
583 packet_trace_identity("push");
584 git_config(git_push_config, &flags);
585 argc = parse_options(argc, argv, prefix, options, push_usage, 0);
586 push_options = (push_options_cmdline.nr
587 ? &push_options_cmdline
588 : &push_options_config);
589 set_push_cert_flags(&flags, push_cert);
591 if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
592 die(_("--delete is incompatible with --all, --mirror and --tags"));
593 if (deleterefs && argc < 2)
594 die(_("--delete doesn't make sense without any refs"));
596 if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
597 flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
598 else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
599 flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
600 else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
601 flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
603 if (tags)
604 refspec_append(&rs, "refs/tags/*");
606 if (argc > 0) {
607 repo = argv[0];
608 set_refspecs(argv + 1, argc - 1, repo);
611 remote = pushremote_get(repo);
612 if (!remote) {
613 if (repo)
614 die(_("bad repository '%s'"), repo);
615 die(_("No configured push destination.\n"
616 "Either specify the URL from the command-line or configure a remote repository using\n"
617 "\n"
618 " git remote add <name> <url>\n"
619 "\n"
620 "and then push using the remote name\n"
621 "\n"
622 " git push <name>\n"));
625 if (remote->mirror)
626 flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
628 if (flags & TRANSPORT_PUSH_ALL) {
629 if (tags)
630 die(_("--all and --tags are incompatible"));
631 if (argc >= 2)
632 die(_("--all can't be combined with refspecs"));
634 if (flags & TRANSPORT_PUSH_MIRROR) {
635 if (tags)
636 die(_("--mirror and --tags are incompatible"));
637 if (argc >= 2)
638 die(_("--mirror can't be combined with refspecs"));
640 if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
641 die(_("--all and --mirror are incompatible"));
643 if (!is_empty_cas(&cas) && (flags & TRANSPORT_PUSH_FORCE_IF_INCLUDES))
644 cas.use_force_if_includes = 1;
646 for_each_string_list_item(item, push_options)
647 if (strchr(item->string, '\n'))
648 die(_("push options must not have new line characters"));
650 rc = do_push(flags, push_options, remote);
651 string_list_clear(&push_options_cmdline, 0);
652 string_list_clear(&push_options_config, 0);
653 if (rc == -1)
654 usage_with_options(push_usage, options);
655 else
656 return rc;