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:
parent
4a01f47e82
commit
27cbdaf497
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue