diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java
index a308469..0452273 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java
@@ -36,7 +36,6 @@
 import com.google.inject.Provider;
 import com.google.inject.ProvisionException;
 
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -100,85 +99,74 @@
       return;
     }
 
-    Repository git;
-    try {
-      git = repoManager.openRepository(projectName);
-    } catch (RepositoryNotFoundException x) {
-      log.error(x.getMessage(), x);
-      return;
-    } catch (IOException x) {
-      log.error(x.getMessage(), x);
-      return;
-    }
+    try (final Repository git = repoManager.openRepository(projectName)) {
+      try (final RevWalk rw = new RevWalk(git)) {
+        final ReviewDb reviewDb = schemaFactory.open();
+        try {
+          Change.Id changeId = new Change.Id(Integer.parseInt(e.change.number));
+          PatchSet.Id psId = new PatchSet.Id(changeId, Integer.parseInt(e.patchSet.number));
+          PatchSet ps = reviewDb.patchSets().get(psId);
+          if (ps == null) {
+            log.warn("Patch set " + psId.get() + " not found.");
+            return;
+          }
 
-    try (final RevWalk rw = new RevWalk(git)) {
-      final ReviewDb reviewDb = schemaFactory.open();
-      try {
-        Change.Id changeId = new Change.Id(Integer.parseInt(e.change.number));
-        PatchSet.Id psId = new PatchSet.Id(changeId, Integer.parseInt(e.patchSet.number));
-        PatchSet ps = reviewDb.patchSets().get(psId);
-        if (ps == null) {
-          log.warn("Patch set " + psId.get() + " not found.");
-          return;
-        }
+          final Change change = reviewDb.changes().get(psId.getParentKey());
+          if (change == null) {
+            log.warn("Change " + changeId.get() + " not found.");
+            return;
+          }
 
-        final Change change = reviewDb.changes().get(psId.getParentKey());
-        if (change == null) {
-          log.warn("Change " + changeId.get() + " not found.");
-          return;
-        }
+          final RevCommit commit =
+              rw.parseCommit(ObjectId.fromString(e.patchSet.revision));
 
-        final RevCommit commit =
-            rw.parseCommit(ObjectId.fromString(e.patchSet.revision));
+          final Runnable task =
+              reviewersByBlameFactory.create(commit, change, ps, maxReviewers, git);
 
-        final Runnable task =
-            reviewersByBlameFactory.create(commit, change, ps, maxReviewers, git);
+          workQueue.getDefaultQueue().submit(new Runnable() {
+            @Override
+            public void run() {
+              RequestContext old = tl.setContext(new RequestContext() {
 
-        workQueue.getDefaultQueue().submit(new Runnable() {
-          @Override
-          public void run() {
-            RequestContext old = tl.setContext(new RequestContext() {
+                @Override
+                public CurrentUser getCurrentUser() {
+                  return identifiedUserFactory.create(change.getOwner());
+                }
 
-              @Override
-              public CurrentUser getCurrentUser() {
-                return identifiedUserFactory.create(change.getOwner());
-              }
-
-              @Override
-              public Provider<ReviewDb> getReviewDbProvider() {
-                return new Provider<ReviewDb>() {
-                  @Override
-                  public ReviewDb get() {
-                    if (db == null) {
-                      try {
-                        db = schemaFactory.open();
-                      } catch (OrmException e) {
-                        throw new ProvisionException("Cannot open ReviewDb", e);
+                @Override
+                public Provider<ReviewDb> getReviewDbProvider() {
+                  return new Provider<ReviewDb>() {
+                    @Override
+                    public ReviewDb get() {
+                      if (db == null) {
+                        try {
+                          db = schemaFactory.open();
+                        } catch (OrmException e) {
+                          throw new ProvisionException("Cannot open ReviewDb", e);
+                        }
                       }
+                      return db;
                     }
-                    return db;
-                  }
-                };
-              }
-            });
-            try {
-              task.run();
-            } finally {
-              tl.setContext(old);
-              if (db != null) {
-                db.close();
-                db = null;
+                  };
+                }
+              });
+              try {
+                task.run();
+              } finally {
+                tl.setContext(old);
+                if (db != null) {
+                  db.close();
+                  db = null;
+                }
               }
             }
-          }
-        });
-      } finally {
-        reviewDb.close();
+          });
+        } finally {
+          reviewDb.close();
+        }
       }
     } catch (OrmException|IOException x) {
       log.error(x.getMessage(), x);
-    } finally {
-      git.close();
     }
   }
 
