Merge pull request #3137 from libgit2/cmn/server-errors

Improve server error reporting
This commit is contained in:
Carlos Martín Nieto 2015-05-20 17:13:49 +02:00
commit c06e180a98
5 changed files with 25 additions and 3 deletions

View File

@ -45,6 +45,10 @@ support for HTTPS connections insead of OpenSSL.
* The index now uses diffs for `add_all()` and `update_all()` which * The index now uses diffs for `add_all()` and `update_all()` which
gives it a speed boost and closer semantics to git. 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 ### API additions
@ -89,6 +93,11 @@ support for HTTPS connections insead of OpenSSL.
* `git_stash_pop()` will apply a stashed state (like `git_stash_apply()`) * `git_stash_pop()` will apply a stashed state (like `git_stash_apply()`)
but will remove the stashed state after a successful application. but will remove the stashed state after a successful application.
* A new error code `GIT_EEOF` indicates an early EOF from the
server. This typically indicates an error with the URL or
configuration of the server, and tools can use this to show messages
about failing to communicate with the server.
### API removals ### API removals
* `git_remote_save()` and `git_remote_clear_refspecs()` has been * `git_remote_save()` and `git_remote_clear_refspecs()` has been

View File

@ -45,6 +45,7 @@ typedef enum {
GIT_ECERTIFICATE = -17, /**< Server certificate is invalid */ GIT_ECERTIFICATE = -17, /**< Server certificate is invalid */
GIT_EAPPLIED = -18, /**< Patch/merge has already been applied */ GIT_EAPPLIED = -18, /**< Patch/merge has already been applied */
GIT_EPEEL = -19, /**< The requested peel operation is not possible */ GIT_EPEEL = -19, /**< The requested peel operation is not possible */
GIT_EEOF = -20, /**< Unexpected EOF */
GIT_PASSTHROUGH = -30, /**< Internal only */ GIT_PASSTHROUGH = -30, /**< Internal only */
GIT_ITEROVER = -31, /**< Signals end of iteration with iterator */ GIT_ITEROVER = -31, /**< Signals end of iteration with iterator */

View File

@ -55,6 +55,7 @@ static int ssl_set_error(SSL *ssl, int error)
break; break;
} }
giterr_set(GITERR_NET, "SSL error: received early EOF"); giterr_set(GITERR_NET, "SSL error: received early EOF");
return GIT_EEOF;
break; break;
case SSL_ERROR_SSL: case SSL_ERROR_SSL:
e = ERR_get_error(); e = ERR_get_error();

View File

@ -52,7 +52,7 @@ int git_smart__store_refs(transport_smart *t, int flushes)
if (recvd == 0 && !flush) { if (recvd == 0 && !flush) {
giterr_set(GITERR_NET, "early EOF"); giterr_set(GITERR_NET, "early EOF");
return -1; return GIT_EEOF;
} }
continue; continue;
@ -770,7 +770,7 @@ static int parse_report(transport_smart *transport, git_push *push)
if (recvd == 0) { if (recvd == 0) {
giterr_set(GITERR_NET, "early EOF"); giterr_set(GITERR_NET, "early EOF");
return -1; return GIT_EEOF;
} }
continue; continue;
} }

View File

@ -125,10 +125,21 @@ static int ssh_stream_read(
return -1; return -1;
if ((rc = libssh2_channel_read(s->channel, buffer, buf_size)) < LIBSSH2_ERROR_NONE) { 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; return -1;
} }
/*
* If we can't get anything out of stdout, it's typically a
* not-found error, so read from stderr and signal EOF on
* stderr.
*/
if (rc == 0 && (rc = libssh2_channel_read_stderr(s->channel, buffer, buf_size)) > 0) {
giterr_set(GITERR_SSH, "%*s", rc, buffer);
return GIT_EEOF;
}
*bytes_read = rc; *bytes_read = rc;
return 0; return 0;