Commit cd58c15c589970765cd46e7bbdaebf6250fd7626

Vicent Martí 2012-05-05T16:47:20

Merge remote-tracking branch 'scottjg/fix-mingw32' into development Conflicts: src/netops.c src/netops.h src/transports/http.c tests-clar/clar

diff --git a/src/netops.c b/src/netops.c
index e2fec0b..2d20000 100644
--- a/src/netops.c
+++ b/src/netops.c
@@ -93,7 +93,7 @@ void gitno_consume_n(gitno_buffer *buf, size_t cons)
 	buf->offset -= cons;
 }
 
-GIT_SOCKET gitno_connect(const char *host, const char *port)
+int gitno_connect(GIT_SOCKET *sock, const char *host, const char *port)
 {
 	struct addrinfo *info = NULL, *p;
 	struct addrinfo hints;
@@ -106,7 +106,7 @@ GIT_SOCKET gitno_connect(const char *host, const char *port)
 
 	if ((ret = getaddrinfo(host, port, &hints, &info)) < 0) {
 		giterr_set(GITERR_NET, "Failed to resolve address for %s: %s", host, gai_strerror(ret));
-		return INVALID_SOCKET;
+		return -1;
 	}
 
 	for (p = info; p != NULL; p = p->ai_next) {
@@ -125,11 +125,14 @@ GIT_SOCKET gitno_connect(const char *host, const char *port)
 	}
 
 	/* Oops, we couldn't connect to any address */
-	if (s == INVALID_SOCKET && p == NULL)
+	if (s == INVALID_SOCKET && p == NULL) {
 		giterr_set(GITERR_OS, "Failed to connect to %s", host);
+		return -1;
+	}
 
 	freeaddrinfo(info);
-	return s;
+	*sock = s;
+	return 0;
 }
 
 int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
diff --git a/src/netops.h b/src/netops.h
index f370019..9d13f38 100644
--- a/src/netops.h
+++ b/src/netops.h
@@ -21,7 +21,7 @@ int gitno_recv(gitno_buffer *buf);
 void gitno_consume(gitno_buffer *buf, const char *ptr);
 void gitno_consume_n(gitno_buffer *buf, size_t cons);
 
-GIT_SOCKET gitno_connect(const char *host, const char *port);
+int gitno_connect(GIT_SOCKET *s, const char *host, const char *port);
 int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags);
 int gitno_close(GIT_SOCKET s);
 int gitno_send_chunk_size(int s, size_t len);
diff --git a/src/transports/git.c b/src/transports/git.c
index c51b167..9eae9a1 100644
--- a/src/transports/git.c
+++ b/src/transports/git.c
@@ -100,10 +100,11 @@ cleanup:
  */
 static int do_connect(transport_git *t, const char *url)
 {
-	GIT_SOCKET s;
 	char *host, *port;
 	const char prefix[] = "git://";
-	int error, connected = 0;
+	int error;
+
+	t->socket = INVALID_SOCKET;
 
 	if (!git__prefixcmp(url, prefix))
 		url += strlen(prefix);
@@ -111,22 +112,24 @@ static int do_connect(transport_git *t, const char *url)
 	if (gitno_extract_host_and_port(&host, &port, url, GIT_DEFAULT_PORT) < 0)
 		return -1;
 
-	s = gitno_connect(host, port);
-	connected = 1;
-	error = send_request(s, NULL, url);
-	t->socket = s;
+	if (gitno_connect(&t->socket, host, port) == 0) {
+		error = send_request(t->socket, NULL, url);
+	}
 
 	git__free(host);
 	git__free(port);
 
-	if (error < GIT_SUCCESS && s > 0)
-		gitno_close(s);
-	if (!connected) {
+	if (error < 0 && t->socket != INVALID_SOCKET) {
+		gitno_close(t->socket);
+		t->socket = INVALID_SOCKET;
+	}
+
+	if (t->socket == INVALID_SOCKET) {
 		giterr_set(GITERR_NET, "Failed to connect to the host");
 		return -1;
 	}
 
-	return error;
+	return 0;
 }
 
 /*
diff --git a/src/transports/http.c b/src/transports/http.c
index 1b2b5eb..bc4a615 100644
--- a/src/transports/http.c
+++ b/src/transports/http.c
@@ -85,12 +85,12 @@ static int gen_request(git_buf *buf, const char *url, const char *host, const ch
 
 static int do_connect(transport_http *t, const char *host, const char *port)
 {
-	GIT_SOCKET s = -1;
+	GIT_SOCKET s;
 
 	if (t->parent.connected && http_should_keep_alive(&t->parser))
 		return 0;
 
-	if ((s = gitno_connect(host, port)) < 0)
+	if (gitno_connect(&s, host, port) < 0)
 		return -1;
 
 	t->socket = s;
diff --git a/src/win32/utf-conv.c b/src/win32/utf-conv.c
index fbcb69d..76f1e42 100644
--- a/src/win32/utf-conv.c
+++ b/src/win32/utf-conv.c
@@ -7,6 +7,7 @@
 
 #include "common.h"
 #include "utf-conv.h"
+#include "git2/windows.h"
 
 /*
  * Default codepage value
diff --git a/tests-clar/object/commit/commitstagedfile.c b/tests-clar/object/commit/commitstagedfile.c
index de69b44..cd04e96 100644
--- a/tests-clar/object/commit/commitstagedfile.c
+++ b/tests-clar/object/commit/commitstagedfile.c
@@ -83,8 +83,16 @@ void test_object_commit_commitstagedfile__generate_predictable_object_ids(void)
 		struct stat st;
 		cl_must_pass(p_lstat("treebuilder/test.txt", &st));
 		cl_assert(entry->file_size == st.st_size);
+#ifndef _WIN32
+		/*
+		 * Windows doesn't populate these fields, and the signage is
+		 * wrong in the Windows version of the struct, so lets avoid
+		 * the "comparing signed and unsigned" compilation warning in
+		 * that case.
+		 */
 		cl_assert(entry->uid == st.st_uid);
 		cl_assert(entry->gid == st.st_gid);
+#endif
 	}
 
 	/*