Merge branch 'stable-2.16' into stable-3.0

* stable-2.16:
  Fix project import rollback
  Bump API version to v2.16.8

Change-Id: I265113fc2be606bc0b1106ec9be3328b861cc8e6
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
index 9fed39e..54ff346 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
@@ -14,8 +14,14 @@
 package com.googlesource.gerrit.plugins.github.git;
 
 import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.events.ProjectDeletedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.util.ManualRequestContext;
 import com.google.gerrit.server.util.OneOffRequestContext;
 import com.google.inject.Inject;
@@ -28,6 +34,8 @@
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,6 +49,9 @@
   private final String organisation;
   private final String repository;
   private final File destinationDirectory;
+  private final DynamicSet<ProjectDeletedListener> deletedListeners;
+  private final ProjectCache projectCache;
+  private final GitRepositoryManager repoManager;
 
   public interface Factory {
     GitCloneStep create(
@@ -53,6 +64,9 @@
       GitHubRepository.Factory gitHubRepoFactory,
       GerritApi gerritApi,
       OneOffRequestContext context,
+      DynamicSet<ProjectDeletedListener> deletedListeners,
+      ProjectCache projectCache,
+      GitRepositoryManager repoManager,
       @Assisted("organisation") String organisation,
       @Assisted("name") String repository)
       throws GitException {
@@ -66,6 +80,9 @@
     this.organisation = organisation;
     this.repository = repository;
     this.destinationDirectory = prepareTargetGitDirectory(gitDir, organisation, repository);
+    this.deletedListeners = deletedListeners;
+    this.projectCache = projectCache;
+    this.repoManager = repoManager;
   }
 
   private static File prepareTargetGitDirectory(File gitDir, String organisation, String repository)
@@ -119,11 +136,44 @@
     }
 
     try {
+      String projectName = organisation + "/" + repository;
+      Project.NameKey key = new Project.NameKey(projectName);
+      cleanJGitCache(key);
       FileUtils.deleteDirectory(gitDirectory);
+      projectCache.remove(key);
+      sendProjectDeletedEvent(projectName);
       return true;
     } catch (IOException e) {
       LOG.error("Cannot clean-up output Git directory " + gitDirectory);
       return false;
     }
   }
+
+  private void cleanJGitCache(Project.NameKey key) throws IOException {
+    try (Repository repository = repoManager.openRepository(key)) {
+      RepositoryCache.close(repository);
+    }
+  }
+
+  private void sendProjectDeletedEvent(String projectName) {
+    ProjectDeletedListener.Event event =
+        new ProjectDeletedListener.Event() {
+          @Override
+          public String getProjectName() {
+            return projectName;
+          }
+
+          @Override
+          public NotifyHandling getNotify() {
+            return NotifyHandling.NONE;
+          }
+        };
+    for (ProjectDeletedListener l : deletedListeners) {
+      try {
+        l.onProjectDeleted(event);
+      } catch (RuntimeException e) {
+        LOG.warn("Failure in ProjectDeletedListener", e);
+      }
+    }
+  }
 }