UploadPack: Consolidate the sideband handling code to one place

This consolidates the sideband stream creation code and the error
handling code for the sideband-allowed part in the Git protocol to one
place.

Change-Id: I0e3e94564f50d1be32006f9d8bcd1ef1ce6bf07e
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
This commit is contained in:
Masaya Suzuki 2019-07-23 10:36:14 -07:00
parent 63bd24cf35
commit 1e3a7bcef7
1 changed files with 29 additions and 61 deletions

View File

@ -809,11 +809,6 @@ public void upload(InputStream input, OutputStream output,
} else {
service(pckOut);
}
} catch (UploadPackInternalServerErrorException err) {
// UploadPackInternalServerErrorException is a special exception
// that indicates an error is already written to the client. Do
// nothing.
throw err;
} catch (ServiceMayNotContinueException err) {
if (!err.isOutput() && err.getMessage() != null) {
try {
@ -2117,45 +2112,42 @@ private void sendPack(PackStatistics.Accumulator accumulator,
Set<String> caps = req.getClientCapabilities();
boolean sideband = caps.contains(OPTION_SIDE_BAND)
|| caps.contains(OPTION_SIDE_BAND_64K);
if (sideband) {
errOut = new SideBandErrorWriter();
try {
sendPack(true, req, accumulator, allTags, unshallowCommits,
deepenNots, pckOut);
} catch (ServiceMayNotContinueException err) {
String message = err.getMessage();
if (message == null) {
message = JGitText.get().internalServerError;
}
try {
errOut.writeError(message);
} catch (IOException e) {
err.addSuppressed(e);
throw err;
}
throw new UploadPackInternalServerErrorException(err);
} catch (IOException | RuntimeException | Error err) {
try {
errOut.writeError(JGitText.get().internalServerError);
} catch (IOException e) {
err.addSuppressed(e);
throw err;
}
throw new UploadPackInternalServerErrorException(err);
int bufsz = SideBandOutputStream.SMALL_BUF;
if (req.getClientCapabilities().contains(OPTION_SIDE_BAND_64K)) {
bufsz = SideBandOutputStream.MAX_BUF;
}
OutputStream packOut = new SideBandOutputStream(
SideBandOutputStream.CH_DATA, bufsz, rawOut);
ProgressMonitor pm = NullProgressMonitor.INSTANCE;
if (!req.getClientCapabilities().contains(OPTION_NO_PROGRESS)) {
msgOut = new SideBandOutputStream(
SideBandOutputStream.CH_PROGRESS, bufsz, rawOut);
pm = new SideBandProgressMonitor(msgOut);
}
sendPack(pm, pckOut, packOut, req, accumulator, allTags,
unshallowCommits, deepenNots);
pckOut.end();
} else {
sendPack(false, req, accumulator, allTags, unshallowCommits, deepenNots,
pckOut);
sendPack(NullProgressMonitor.INSTANCE, pckOut, rawOut, req,
accumulator, allTags, unshallowCommits, deepenNots);
}
}
/**
* Send the requested objects to the client.
*
* @param sideband
* whether to wrap the pack in side-band pkt-lines, interleaved
* with progress messages and errors.
* @param pm
* progress monitor
* @param pckOut
* PacketLineOut that shares the output with packOut
* @param packOut
* packfile output
* @param req
* request being processed
* @param accumulator
@ -2167,35 +2159,14 @@ private void sendPack(PackStatistics.Accumulator accumulator,
* shallow commits on the client that are now becoming unshallow
* @param deepenNots
* objects that the client specified using --shallow-exclude
* @param pckOut
* output writer
* @throws IOException
* if an error occurred while generating or writing the pack.
*/
private void sendPack(final boolean sideband,
FetchRequest req,
private void sendPack(ProgressMonitor pm, PacketLineOut pckOut,
OutputStream packOut, FetchRequest req,
PackStatistics.Accumulator accumulator,
@Nullable Collection<Ref> allTags,
List<ObjectId> unshallowCommits,
List<ObjectId> deepenNots,
PacketLineOut pckOut) throws IOException {
ProgressMonitor pm = NullProgressMonitor.INSTANCE;
OutputStream packOut = rawOut;
if (sideband) {
int bufsz = SideBandOutputStream.SMALL_BUF;
if (req.getClientCapabilities().contains(OPTION_SIDE_BAND_64K))
bufsz = SideBandOutputStream.MAX_BUF;
packOut = new SideBandOutputStream(SideBandOutputStream.CH_DATA,
bufsz, rawOut);
if (!req.getClientCapabilities().contains(OPTION_NO_PROGRESS)) {
msgOut = new SideBandOutputStream(
SideBandOutputStream.CH_PROGRESS, bufsz, rawOut);
pm = new SideBandProgressMonitor(msgOut);
}
}
@Nullable Collection<Ref> allTags, List<ObjectId> unshallowCommits,
List<ObjectId> deepenNots) throws IOException {
if (wantAll.isEmpty()) {
preUploadHook.onSendPack(this, wantIds, commonBase);
} else {
@ -2338,9 +2309,6 @@ else if (ref.getName().startsWith(Constants.R_HEADS))
}
pw.close();
}
if (sideband)
pckOut.end();
}
private static void findSymrefs(