From 6e896ba66ba095b97a89a622d43f05ce9ad501e7 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 22 May 2013 12:12:52 -0700 Subject: [PATCH] Allow PreUploadHook.onSendPack to send messages to the client Before transmitting to the client a hook may want to send along a text message ahead of the pack, such as a "message of the day". Enable this usage by mirroring the message sending API from ReceivePack on the UploadPack instance, using the side band. Change-Id: I31cd254a4ddb816641397a3e9c2c20212471c37f --- .../eclipse/jgit/transport/UploadPack.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index 5347eb713..6ae08acaa 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -80,6 +80,7 @@ import org.eclipse.jgit.revwalk.filter.CommitTimeRevFilter; import org.eclipse.jgit.storage.pack.PackConfig; import org.eclipse.jgit.transport.BasePackFetchConnection.MultiAck; import org.eclipse.jgit.transport.RefAdvertiser.PacketLineOutRefAdvertiser; +import org.eclipse.jgit.util.io.DisabledOutputStream; import org.eclipse.jgit.util.io.InterruptTimer; import org.eclipse.jgit.util.io.TimeoutInputStream; import org.eclipse.jgit.util.io.TimeoutOutputStream; @@ -192,6 +193,8 @@ public class UploadPack { private PacketLineOut pckOut; + private OutputStream msgOut = DisabledOutputStream.INSTANCE; + /** The refs we advertised as existing at the start of the connection. */ private Map refs; @@ -504,6 +507,8 @@ public class UploadPack { try { rawIn = input; rawOut = output; + if (messages != null) + msgOut = messages; if (timeout > 0) { final Thread caller = Thread.currentThread(); @@ -520,6 +525,7 @@ public class UploadPack { pckOut = new PacketLineOut(rawOut); service(); } finally { + msgOut = DisabledOutputStream.INSTANCE; walk.release(); if (timer != null) { try { @@ -692,6 +698,29 @@ public class UploadPack { adv.end(); } + /** + * Send a message to the client, if it supports receiving them. + *

+ * If the client doesn't support receiving messages, the message will be + * discarded, with no other indication to the caller or to the client. + * + * @param what + * string describing the problem identified by the hook. The + * string must not end with an LF, and must not contain an LF. + */ + public void sendMessage(String what) { + try { + msgOut.write(Constants.encode(what + "\n")); //$NON-NLS-1$ + } catch (IOException e) { + // Ignore write failures. + } + } + + /** @return an underlying stream for sending messages to the client, or null. */ + public OutputStream getMessageOutputStream() { + return msgOut; + } + private void recvWants() throws IOException { boolean isFirst = true; for (;;) { @@ -1076,7 +1105,6 @@ public class UploadPack { private void sendPack(final boolean sideband) throws IOException { ProgressMonitor pm = NullProgressMonitor.INSTANCE; OutputStream packOut = rawOut; - SideBandOutputStream msgOut = null; if (sideband) { int bufsz = SideBandOutputStream.SMALL_BUF; @@ -1181,7 +1209,7 @@ public class UploadPack { pw.writePack(pm, NullProgressMonitor.INSTANCE, packOut); statistics = pw.getStatistics(); - if (msgOut != null) { + if (msgOut != DisabledOutputStream.INSTANCE) { String msg = pw.getStatistics().getMessage() + '\n'; msgOut.write(Constants.encode(msg)); msgOut.flush();