diff options
author | Shawn Pearce <spearce@spearce.org> | 2010-01-29 13:45:17 -0500 |
---|---|---|
committer | Code Review <codereview-daemon@eclipse.org> | 2010-01-29 13:45:17 -0500 |
commit | 79bb1594b4ee212106991eeb29524067b9caa2e0 (patch) | |
tree | d46a4058a6d71c03306008ddc9f967a0f2786180 /org.eclipse.jgit | |
parent | baaa78f1f05d197ba2efefb713f194cd3f09725d (diff) | |
parent | 08a77c04b4574ca4b282154d4ed4ab85cf2fcaa2 (diff) | |
download | jgit-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.java | 56 |
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 { |