Always use the current connection's remote ref list in git protocol
authorDaniel Barkalow <barkalow@iabervon.org>
Thu, 28 Feb 2008 16:10:51 +0000 (11:10 -0500)
committerJunio C Hamano <gitster@pobox.com>
Fri, 29 Feb 2008 08:00:29 +0000 (00:00 -0800)
We always report to the user the list of refs we got from the first
connection, even if we do multiple connections. But we should always
use each connection's own list of refs in the communication with the
server, in case we got a different server out of DNS rotation or the
timing was surprising or something.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
transport.c

index 397983d1155bed967bd48ad47dbbb81cb2e45168..0a5cf0a9c29c34a7f0fd0d53a5f6472ab2f2fa4f 100644 (file)
@@ -622,6 +622,7 @@ static int fetch_refs_via_pack(struct transport *transport,
        char *dest = xstrdup(transport->url);
        struct fetch_pack_args args;
        int i;
+       struct ref *refs_tmp = NULL;
 
        memset(&args, 0, sizeof(args));
        args.uploadpack = data->uploadpack;
@@ -634,15 +635,13 @@ static int fetch_refs_via_pack(struct transport *transport,
        for (i = 0; i < nr_heads; i++)
                origh[i] = heads[i] = xstrdup(to_fetch[i]->name);
 
-       refs = transport_get_remote_refs(transport);
        if (!data->conn) {
-               struct ref *refs_tmp;
                connect_setup(transport);
                get_remote_heads(data->fd[0], &refs_tmp, 0, NULL, 0);
-               free_refs(refs_tmp);
        }
 
-       refs = fetch_pack(&args, data->fd, data->conn, transport->remote_refs,
+       refs = fetch_pack(&args, data->fd, data->conn,
+                         refs_tmp ? refs_tmp : transport->remote_refs,
                          dest, nr_heads, heads, &transport->pack_lockfile);
        close(data->fd[0]);
        close(data->fd[1]);
@@ -650,6 +649,8 @@ static int fetch_refs_via_pack(struct transport *transport,
                refs = NULL;
        data->conn = NULL;
 
+       free_refs(refs_tmp);
+
        for (i = 0; i < nr_heads; i++)
                free(origh[i]);
        free(origh);