push: do not let configured foreign-vcs permanently clobbered
authorJunio C Hamano <gitster@pobox.com>
Tue, 24 Jan 2012 00:34:22 +0000 (16:34 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Jan 2012 00:38:42 +0000 (16:38 -0800)
Recently, 6f48d39 (clone: delay cloning until after remote HEAD checking,
2012-01-16) tried to record if a remote helper needs to be called after
parsing the remote when transport_get() is called, by overwriting the
field meant to store the configured remote helper name in the remote
structure.

This is OK when a remote represents a single remote repository, but fails
miserably when pushing to locations with multiple URLs, like this:

    $ cat .git/config
    [remote "origin"]
        url = https://code.google.com/p/git-htmldocs/
        url = github.com:gitster/git-htmldocs.git
        push = refs/heads/master:refs/heads/master
    $ git push

The second url that is supposed to use the git-over-ssh transport
mistakenly use https:// and fails with:

    error: Couldn't resolve host 'github.com:gitster' while accessing
    github.com:gitster/git-htmldocs.git/info/refs
    fatal: HTTP request failed

The right solution would probably be to dedicate a separate field to store
the detected external helper to be used, which is valid only during a
single use of transport until it is disconnected, instead of overwriting
foreign_vcs field, but in the meantime, this band-aid should suffice.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/push.c

index 35cce532f2bb632e01c0de0a8e6f9e1395eece88..5fb98a009401e2d790413c20c6a9704ce7b0b007 100644 (file)
@@ -204,11 +204,13 @@ static int do_push(const char *repo, int flags)
                url_nr = remote->url_nr;
        }
        if (url_nr) {
+               const char *configured_foreign_vcs = remote->foreign_vcs;
                for (i = 0; i < url_nr; i++) {
                        struct transport *transport =
                                transport_get(remote, url[i]);
                        if (push_with_options(transport, flags))
                                errs++;
+                       remote->foreign_vcs = configured_foreign_vcs;
                }
        } else {
                struct transport *transport =