summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorShawn Pearce <spearce@spearce.org>2010-01-29 13:45:17 -0500
committerCode Review <codereview-daemon@eclipse.org>2010-01-29 13:45:17 -0500
commit79bb1594b4ee212106991eeb29524067b9caa2e0 (patch)
treed46a4058a6d71c03306008ddc9f967a0f2786180 /org.eclipse.jgit
parentbaaa78f1f05d197ba2efefb713f194cd3f09725d (diff)
parent08a77c04b4574ca4b282154d4ed4ab85cf2fcaa2 (diff)
downloadjgit-79bb1594b4ee212106991eeb29524067b9caa2e0.tar.gz
jgit-79bb1594b4ee212106991eeb29524067b9caa2e0.zip
Merge "Check for remote server exec failures and report"
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java56
1 files changed, 40 insertions, 16 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
index 55636f8dcc..5ee7887f6a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportGitSsh.java
@@ -1,5 +1,5 @@
/*
- * 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,6 +127,23 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
cmd.append(QuotedString.BOURNE.quote(val));
}
+ private String commandFor(final String exe) {
+ String path = uri.getPath();
+ if (uri.getScheme() != null && uri.getPath().startsWith("/~"))
+ path = (uri.getPath().substring(1));
+
+ final StringBuilder cmd = new StringBuilder();
+ final int gitspace = exe.indexOf("git ");
+ if (gitspace >= 0) {
+ sqMinimal(cmd, exe.substring(0, gitspace + 3));
+ cmd.append(' ');
+ sqMinimal(cmd, exe.substring(gitspace + 4));
+ } else
+ sqMinimal(cmd, exe);
+ cmd.append(' ');
+ sqAlways(cmd, path);
+ return cmd.toString();
+ }
ChannelExec exec(final String exe) throws TransportException {
initSession();
@@ -134,21 +151,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
final int tms = getTimeout() > 0 ? getTimeout() * 1000 : 0;
try {
final ChannelExec channel = (ChannelExec) sock.openChannel("exec");
- String path = uri.getPath();
- if (uri.getScheme() != null && uri.getPath().startsWith("/~"))
- path = (uri.getPath().substring(1));
-
- final StringBuilder cmd = new StringBuilder();
- final int gitspace = exe.indexOf("git ");
- if (gitspace >= 0) {
- sqMinimal(cmd, exe.substring(0, gitspace + 3));
- cmd.append(' ');
- sqMinimal(cmd, exe.substring(gitspace + 4));
- } else
- sqMinimal(cmd, exe);
- cmd.append(' ');
- sqAlways(cmd, path);
- channel.setCommand(cmd.toString());
+ channel.setCommand(commandFor(exe));
errStream = createErrorStream();
channel.setErrStream(errStream, true);
channel.connect(tms);
@@ -158,6 +161,17 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
}
}
+ 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 class TransportGitSsh extends SshTransport implements PackTransport {
class SshFetchConnection extends BasePackFetchConnection {
private ChannelExec channel;
+ private int exitStatus;
+
SshFetchConnection() throws TransportException {
super(TransportGitSsh.this);
try {
@@ -327,6 +343,8 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
try {
readAdvertisedRefs();
} catch (NoRemoteRepositoryException notFound) {
+ close();
+ checkExecFailure(exitStatus, getOptionUploadPack());
throw cleanNotFound(notFound);
}
}
@@ -337,6 +355,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
if (channel != null) {
try {
+ exitStatus = channel.getExitStatus();
if (channel.isConnected())
channel.disconnect();
} finally {
@@ -349,6 +368,8 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
class SshPushConnection extends BasePackPushConnection {
private ChannelExec channel;
+ private int exitStatus;
+
SshPushConnection() throws TransportException {
super(TransportGitSsh.this);
try {
@@ -371,6 +392,8 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
try {
readAdvertisedRefs();
} catch (NoRemoteRepositoryException notFound) {
+ close();
+ checkExecFailure(exitStatus, getOptionReceivePack());
throw cleanNotFound(notFound);
}
}
@@ -381,6 +404,7 @@ public class TransportGitSsh extends SshTransport implements PackTransport {
if (channel != null) {
try {
+ exitStatus = channel.getExitStatus();
if (channel.isConnected())
channel.disconnect();
} finally {