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