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
This commit is contained in:
Dave Borowitz 2012-02-27 11:54:19 -08:00 committed by Shawn O. Pearce
parent 4a01f47e82
commit 27cbdaf497
1 changed files with 55 additions and 12 deletions

View File

@ -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}.
* <p>
* 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;
}
/**