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); + } + } + } }