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 00ea6ac94..32c9abc1a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java @@ -2213,18 +2213,19 @@ private void service() throws IOException { } if (hasCommands()) { - Throwable unpackError = null; - if (needPack()) { - try { - receivePackAndCheckConnectivity(); - } catch (IOException | RuntimeException - | SubmoduleValidationException | Error err) { - unpackError = err; + try (PostReceiveExecutor e = new PostReceiveExecutor()) { + if (needPack()) { + try { + receivePackAndCheckConnectivity(); + } catch (IOException | RuntimeException + | SubmoduleValidationException | Error err) { + unlockPack(); + sendStatusReport(err); + throw new UnpackException(err); + } } - } - try { - if (unpackError == null) { + try { setAtomic(isCapabilityEnabled(CAPABILITY_ATOMIC)); validateCommands(); @@ -2238,24 +2239,12 @@ private void service() throws IOException { failPendingCommands(); } executeCommands(); + } finally { + unlockPack(); } - } finally { - unlockPack(); - } - sendStatusReport(unpackError); - - if (unpackError != null) { - // we already know which exception to throw. Ignore - // potential additional exceptions raised in postReceiveHooks - try { - postReceive.onPostReceive(this, filterCommands(Result.OK)); - } catch (Throwable e) { - // empty - } - throw new UnpackException(unpackError); + sendStatusReport(null); } - postReceive.onPostReceive(this, filterCommands(Result.OK)); autoGc(); } } @@ -2292,4 +2281,12 @@ static ReceiveCommand parseCommand(String line) } return new ReceiveCommand(oldId, newId, name); } + + private class PostReceiveExecutor implements AutoCloseable { + @Override + public void close() { + postReceive.onPostReceive(ReceivePack.this, + filterCommands(Result.OK)); + } + } }