From 0a84ad2d2ac8153d06564895279ab4fd11ef0e80 Mon Sep 17 00:00:00 2001 From: Jens Baumgart Date: Tue, 3 Apr 2012 17:25:32 +0200 Subject: [PATCH] Unlock DirCache in case of occurring exception A DirCache was not unlocked if an exception occurred in the DirCacheCheckout constructor. Bug: 365449 Change-Id: I231d902d52e3e5e9a7748eedaa63a2bb889ebb13 Signed-off-by: Jens Baumgart --- .../org/eclipse/jgit/api/CheckoutCommand.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java index 854e0b8c9..e03805b72 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java @@ -160,15 +160,21 @@ public class CheckoutCommand extends GitCommand { .parseCommit(headId); RevCommit newCommit = revWalk.parseCommit(branch); RevTree headTree = headCommit == null ? null : headCommit.getTree(); - DirCacheCheckout dco = new DirCacheCheckout(repo, headTree, - repo.lockDirCache(), newCommit.getTree()); - dco.setFailOnConflict(true); + DirCacheCheckout dco; + DirCache dc = repo.lockDirCache(); try { - dco.checkout(); - } catch (org.eclipse.jgit.errors.CheckoutConflictException e) { - status = new CheckoutResult(Status.CONFLICTS, dco - .getConflicts()); - throw new CheckoutConflictException(dco.getConflicts(), e); + dco = new DirCacheCheckout(repo, headTree, dc, + newCommit.getTree()); + dco.setFailOnConflict(true); + try { + dco.checkout(); + } catch (org.eclipse.jgit.errors.CheckoutConflictException e) { + status = new CheckoutResult(Status.CONFLICTS, + dco.getConflicts()); + throw new CheckoutConflictException(dco.getConflicts(), e); + } + } finally { + dc.unlock(); } Ref ref = repo.getRef(name); if (ref != null && !ref.getName().startsWith(Constants.R_HEADS))