Commit e3435673b8ed862266b5351b9e18cb55ed55d335

Carlos Martín Nieto 2015-05-18T15:51:55

ssh: read from stderr if stdout is empty When we fail to read from stdout, it's typically because the URL was wrong and the server process has sent some output over its stderr output. Read that output and set the error message to whatever we read from it.

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 810538c..ad127aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -45,6 +45,10 @@ support for HTTPS connections insead of OpenSSL.
 * The index now uses diffs for `add_all()` and `update_all()` which
   gives it a speed boost and closer semantics to git.
 
+* The ssh transport now reports the stderr output from the server as
+  the error message, which allows you to get the "repository not
+  found" messages.
+
 
 ### API additions
 
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index c5b0811..0d179e7 100644
--- a/src/transports/ssh.c
+++ b/src/transports/ssh.c
@@ -125,10 +125,17 @@ static int ssh_stream_read(
 		return -1;
 
 	if ((rc = libssh2_channel_read(s->channel, buffer, buf_size)) < LIBSSH2_ERROR_NONE) {
-		ssh_error(s->session, "SSH could not read data");;
+		ssh_error(s->session, "SSH could not read data");
 		return -1;
 	}
 
+	/* Having something in stderr is typically a not-found error */
+	if (rc == 0 && (rc = libssh2_channel_read_stderr(s->channel, buffer, buf_size)) > 0) {
+		giterr_set(GITERR_SSH, "%*s", rc, buffer);
+		return -1;
+	}
+
+
 	*bytes_read = rc;
 
 	return 0;