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 32c9abc1a..94cfe6c0a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java @@ -299,6 +299,8 @@ public Set getCapabilities() { // Use the default implementation. }; + private UnpackErrorHandler unpackErrorHandler = new DefaultUnpackErrorHandler(); + /** Hook to report on the commands after execution. */ private PostReceiveHook postReceive; @@ -2144,6 +2146,15 @@ public void setPostReceiveHook(PostReceiveHook h) { postReceive = h != null ? h : PostReceiveHook.NULL; } + /** + * @param unpackErrorHandler + * the unpackErrorHandler to set + * @since 5.7 + */ + public void setUnpackErrorHandler(UnpackErrorHandler unpackErrorHandler) { + this.unpackErrorHandler = unpackErrorHandler; + } + /** * Set whether this class will report command failures as warning messages * before sending the command results. @@ -2220,7 +2231,7 @@ private void service() throws IOException { } catch (IOException | RuntimeException | SubmoduleValidationException | Error err) { unlockPack(); - sendStatusReport(err); + unpackErrorHandler.handleUnpackException(err); throw new UnpackException(err); } } @@ -2289,4 +2300,11 @@ public void close() { filterCommands(Result.OK)); } } + + private class DefaultUnpackErrorHandler implements UnpackErrorHandler { + @Override + public void handleUnpackException(Throwable t) throws IOException { + sendStatusReport(t); + } + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UnpackErrorHandler.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UnpackErrorHandler.java new file mode 100644 index 000000000..12c9a7621 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UnpackErrorHandler.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2019, Google LLC and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.transport; + +import java.io.IOException; + +/** + * Exception handler for processing an incoming pack file. + * + * @since 5.7 + */ +public interface UnpackErrorHandler { + /** + * Handle an exception thrown while unpacking the pack file. + * + * @param t + * exception thrown + * @throws IOException + * thrown when failed to write an error back to the client. + */ + void handleUnpackException(Throwable t) throws IOException; +}