Merge branch 'tg/push-all-in-mirror-forbidden'
authorJunio C Hamano <gitster@pobox.com>
Mon, 30 Sep 2019 04:19:28 +0000 (13:19 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 30 Sep 2019 04:19:28 +0000 (13:19 +0900)
Fix an earlier regression to "git push --all" which should have
been forbidden when the target remote repository is set to be a
mirror.

* tg/push-all-in-mirror-forbidden:
push: disallow --all and refspecs when remote.<name>.mirror is set

1  2 
builtin/push.c
diff --combined builtin/push.c
index 021dd3b1e48979086de68a434d4eddbbeb074df3,5896bde06ceabcad33b21aeb94c48d6395491ef2..3742daf7b0235bfeca94eac8ef098751b300d45a
@@@ -143,9 -143,7 +143,9 @@@ static int push_url_of_remote(struct re
        return remote->url_nr;
  }
  
 -static NORETURN int die_push_simple(struct branch *branch, struct remote *remote) {
 +static NORETURN int die_push_simple(struct branch *branch,
 +                                  struct remote *remote)
 +{
        /*
         * There's no point in using shorten_unambiguous_ref here,
         * as the ambiguity would be on the remote side, not what
@@@ -357,8 -355,7 +357,8 @@@ static int push_with_options(struct tra
  
        if (verbosity > 0)
                fprintf(stderr, _("Pushing to %s\n"), transport->url);
 -      err = transport_push(transport, rs, flags, &reject_reasons);
 +      err = transport_push(the_repository, transport,
 +                           rs, flags, &reject_reasons);
        if (err != 0) {
                fprintf(stderr, "%s", push_get_color(PUSH_COLOR_ERROR));
                error(_("failed to push some refs to '%s'"), transport->url);
  }
  
  static int do_push(const char *repo, int flags,
-                  const struct string_list *push_options)
+                  const struct string_list *push_options,
+                  struct remote *remote)
  {
        int i, errs;
-       struct remote *remote = pushremote_get(repo);
        const char **url;
        int url_nr;
        struct refspec *push_refspec = &rs;
  
-       if (!remote) {
-               if (repo)
-                       die(_("bad repository '%s'"), repo);
-               die(_("No configured push destination.\n"
-                   "Either specify the URL from the command-line or configure a remote repository using\n"
-                   "\n"
-                   "    git remote add <name> <url>\n"
-                   "\n"
-                   "and then push using the remote name\n"
-                   "\n"
-                   "    git push <name>\n"));
-       }
-       if (remote->mirror)
-               flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
        if (push_options->nr)
                flags |= TRANSPORT_PUSH_OPTIONS;
  
@@@ -548,6 -529,7 +532,7 @@@ int cmd_push(int argc, const char **arg
        struct string_list push_options_cmdline = STRING_LIST_INIT_DUP;
        struct string_list *push_options;
        const struct string_list_item *item;
+       struct remote *remote;
  
        struct option options[] = {
                OPT__VERBOSITY(&verbosity),
                die(_("--delete is incompatible with --all, --mirror and --tags"));
        if (deleterefs && argc < 2)
                die(_("--delete doesn't make sense without any refs"));
-       if (flags & TRANSPORT_PUSH_ALL) {
-               if (tags)
-                       die(_("--all and --tags are incompatible"));
-               if (argc >= 2)
-                       die(_("--all can't be combined with refspecs"));
-       }
-       if (flags & TRANSPORT_PUSH_MIRROR) {
-               if (tags)
-                       die(_("--mirror and --tags are incompatible"));
-               if (argc >= 2)
-                       die(_("--mirror can't be combined with refspecs"));
-       }
-       if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
-               die(_("--all and --mirror are incompatible"));
  
        if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
                flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
                set_refspecs(argv + 1, argc - 1, repo);
        }
  
+       remote = pushremote_get(repo);
+       if (!remote) {
+               if (repo)
+                       die(_("bad repository '%s'"), repo);
+               die(_("No configured push destination.\n"
+                   "Either specify the URL from the command-line or configure a remote repository using\n"
+                   "\n"
+                   "    git remote add <name> <url>\n"
+                   "\n"
+                   "and then push using the remote name\n"
+                   "\n"
+                   "    git push <name>\n"));
+       }
+       if (remote->mirror)
+               flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
+       if (flags & TRANSPORT_PUSH_ALL) {
+               if (tags)
+                       die(_("--all and --tags are incompatible"));
+               if (argc >= 2)
+                       die(_("--all can't be combined with refspecs"));
+       }
+       if (flags & TRANSPORT_PUSH_MIRROR) {
+               if (tags)
+                       die(_("--mirror and --tags are incompatible"));
+               if (argc >= 2)
+                       die(_("--mirror can't be combined with refspecs"));
+       }
+       if ((flags & TRANSPORT_PUSH_ALL) && (flags & TRANSPORT_PUSH_MIRROR))
+               die(_("--all and --mirror are incompatible"));
        for_each_string_list_item(item, push_options)
                if (strchr(item->string, '\n'))
                        die(_("push options must not have new line characters"));
  
-       rc = do_push(repo, flags, push_options);
+       rc = do_push(repo, flags, push_options, remote);
        string_list_clear(&push_options_cmdline, 0);
        string_list_clear(&push_options_config, 0);
        if (rc == -1)