From 27cbdaf4975b01a23a95e94b6367318d3c7c4e0b Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Mon, 27 Feb 2012 11:54:19 -0800 Subject: [PATCH] Expose an OutputStream from ReceivePack for sending client messages Callers may want to format and flush their own output, for example in a PreReceiveHook that creates its own TextProgressMonitor. The actual underlying msgOut can change over the lifetime of ReceivePack, so we implement a small wrapper. Change-Id: I57b6d6cad2542aaa93dcadc06cb3e933e81bcd3d --- .../eclipse/jgit/transport/ReceivePack.java | 67 +++++++++++++++---- 1 file changed, 55 insertions(+), 12 deletions(-) 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; } /**