Skip to content
Snippets Groups Projects
Commit 79bb1594 authored by Shawn Pearce's avatar Shawn Pearce Committed by Code Review
Browse files

Merge "Check for remote server exec failures and report"

parents baaa78f1 08a77c04
Branches
Tags
No related merge requests found
/*
* Copyright (C) 2008-2009, Google Inc.
* Copyright (C) 2008-2010, Google Inc.
* Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
* Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
......@@ -127,13 +127,7 @@ private static void sq(final StringBuilder cmd, final String val) {
cmd.append(QuotedString.BOURNE.quote(val));
}
ChannelExec exec(final String exe) throws TransportException {
initSession();
final int tms = getTimeout() > 0 ? getTimeout() * 1000 : 0;
try {
final ChannelExec channel = (ChannelExec) sock.openChannel("exec");
private String commandFor(final String exe) {
String path = uri.getPath();
if (uri.getScheme() != null && uri.getPath().startsWith("/~"))
path = (uri.getPath().substring(1));
......@@ -148,7 +142,16 @@ ChannelExec exec(final String exe) throws TransportException {
sqMinimal(cmd, exe);
cmd.append(' ');
sqAlways(cmd, path);
channel.setCommand(cmd.toString());
return cmd.toString();
}
ChannelExec exec(final String exe) throws TransportException {
initSession();
final int tms = getTimeout() > 0 ? getTimeout() * 1000 : 0;
try {
final ChannelExec channel = (ChannelExec) sock.openChannel("exec");
channel.setCommand(commandFor(exe));
errStream = createErrorStream();
channel.setErrStream(errStream, true);
channel.connect(tms);
......@@ -158,6 +161,17 @@ ChannelExec exec(final String exe) throws TransportException {
}
}
void checkExecFailure(int status, String exe) throws TransportException {
if (status == 127) {
String why = errStream.toString();
IOException cause = null;
if (why != null && why.length() > 0)
cause = new IOException(why);
throw new TransportException(uri, "cannot execute: "
+ commandFor(exe), cause);
}
}
/**
* @return the error stream for the channel, the stream is used to detect
* specific error reasons for exceptions.
......@@ -305,6 +319,8 @@ public void run() {
class SshFetchConnection extends BasePackFetchConnection {
private ChannelExec channel;
private int exitStatus;
SshFetchConnection() throws TransportException {
super(TransportGitSsh.this);
try {
......@@ -327,6 +343,8 @@ class SshFetchConnection extends BasePackFetchConnection {
try {
readAdvertisedRefs();
} catch (NoRemoteRepositoryException notFound) {
close();
checkExecFailure(exitStatus, getOptionUploadPack());
throw cleanNotFound(notFound);
}
}
......@@ -337,6 +355,7 @@ public void close() {
if (channel != null) {
try {
exitStatus = channel.getExitStatus();
if (channel.isConnected())
channel.disconnect();
} finally {
......@@ -349,6 +368,8 @@ public void close() {
class SshPushConnection extends BasePackPushConnection {
private ChannelExec channel;
private int exitStatus;
SshPushConnection() throws TransportException {
super(TransportGitSsh.this);
try {
......@@ -371,6 +392,8 @@ class SshPushConnection extends BasePackPushConnection {
try {
readAdvertisedRefs();
} catch (NoRemoteRepositoryException notFound) {
close();
checkExecFailure(exitStatus, getOptionReceivePack());
throw cleanNotFound(notFound);
}
}
......@@ -381,6 +404,7 @@ public void close() {
if (channel != null) {
try {
exitStatus = channel.getExitStatus();
if (channel.isConnected())
channel.disconnect();
} finally {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment