diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java index 0bf84efd4..af42dee6e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java @@ -157,6 +157,8 @@ public class ReceivePack { private OutputStream msgOut; + private final MessageOutputWrapper msgOutWrapper = new MessageOutputWrapper(); + private PacketLineIn pckIn; private PacketLineOut pckOut; @@ -246,6 +248,52 @@ public ReceiveConfig parse(final Config cfg) { } } + /** + * Output stream that wraps the current {@link #msgOut}. + *

+ * We don't want to expose {@link #msgOut} directly because it can change + * several times over the course of a session. + */ + private class MessageOutputWrapper extends OutputStream { + @Override + public void write(int ch) { + if (msgOut != null) { + try { + msgOut.write(ch); + } catch (IOException e) { + // Ignore write failures. + } + } + } + + @Override + public void write(byte[] b, int off, int len) { + if (msgOut != null) { + try { + msgOut.write(b, off, len); + } catch (IOException e) { + // Ignore write failures. + } + } + } + + @Override + public void write(byte[] b) { + write(b, 0, b.length); + } + + @Override + public void flush() { + if (msgOut != null) { + try { + msgOut.flush(); + } catch (IOException e) { + // Ignore write failures. + } + } + } + } + /** @return the repository this receive completes into. */ public final Repository getRepository() { return db; @@ -542,12 +590,7 @@ public void sendError(final String what) { advertiseError = new StringBuilder(); advertiseError.append(what).append('\n'); } else { - try { - if (msgOut != null) - msgOut.write(Constants.encode("error: " + what + "\n")); - } catch (IOException e) { - // Ignore write failures. - } + msgOutWrapper.write(Constants.encode("error: " + what + "\n")); } } @@ -562,12 +605,12 @@ public void sendError(final String what) { * string must not end with an LF, and must not contain an LF. */ public void sendMessage(final String what) { - try { - if (msgOut != null) - msgOut.write(Constants.encode(what + "\n")); - } catch (IOException e) { - // Ignore write failures. - } + msgOutWrapper.write(Constants.encode(what + "\n")); + } + + /** @return an underlying stream for sending messages to the client. */ + public OutputStream getMessageOutputStream() { + return msgOutWrapper; } /**