From 84f3e5d473d90e3971beecbfb580d218d10b18a7 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 28 Mar 2024 15:19:14 +0100 Subject: [PATCH] EA-691278 vcs: workaround 'Project already disposed' in VcsRepositoryManager GitOrigin-RevId: 3855f83a6d543631250da39cb61d148a0b19f4b3 --- .../src/com/intellij/dvcs/repo/RepositoryImpl.java | 9 +++++++-- .../src/git4idea/repo/GitRepositoryImpl.java | 14 ++++++++++---- .../org/zmlx/hg4idea/repo/HgRepositoryImpl.java | 14 ++++++++++---- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/repo/RepositoryImpl.java b/platform/dvcs-impl/src/com/intellij/dvcs/repo/RepositoryImpl.java index 8b7eeebe7cca..af7668e8a675 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/repo/RepositoryImpl.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/repo/RepositoryImpl.java @@ -29,10 +29,15 @@ public abstract class RepositoryImpl implements Repository { private boolean myDisposed; protected RepositoryImpl(@NotNull Project project, - @NotNull VirtualFile dir, - @NotNull Disposable parentDisposable) { + @NotNull VirtualFile dir) { myProject = project; myRootDir = dir; + } + + protected RepositoryImpl(@NotNull Project project, + @NotNull VirtualFile dir, + @NotNull Disposable parentDisposable) { + this(project, dir); Disposer.register(parentDisposable, this); } diff --git a/plugins/git4idea/src/git4idea/repo/GitRepositoryImpl.java b/plugins/git4idea/src/git4idea/repo/GitRepositoryImpl.java index 71996702e43b..2c0abb23da3c 100644 --- a/plugins/git4idea/src/git4idea/repo/GitRepositoryImpl.java +++ b/plugins/git4idea/src/git4idea/repo/GitRepositoryImpl.java @@ -4,6 +4,7 @@ package git4idea.repo; import com.intellij.dvcs.repo.RepositoryImpl; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; @@ -54,9 +55,8 @@ public final class GitRepositoryImpl extends RepositoryImpl implements GitReposi */ private GitRepositoryImpl(@NotNull VirtualFile rootDir, @NotNull VirtualFile gitDir, - @NotNull Project project, - @NotNull Disposable parentDisposable) { - super(project, rootDir, parentDisposable); + @NotNull Project project) { + super(project, rootDir); myVcs = GitVcs.getInstance(project); myGitDir = gitDir; myRepositoryFiles = GitRepositoryFiles.createInstance(rootDir, gitDir); @@ -112,9 +112,15 @@ public final class GitRepositoryImpl extends RepositoryImpl implements GitReposi @NotNull Project project, @NotNull Disposable parentDisposable) { ProgressManager.checkCanceled(); - GitRepositoryImpl repository = new GitRepositoryImpl(root, gitDir, project, parentDisposable); + GitRepositoryImpl repository = new GitRepositoryImpl(root, gitDir, project); repository.setupUpdater(); GitRepositoryManager.getInstance(project).notifyListenersAsync(repository); + + ReadAction.run(() -> { + if (!Disposer.tryRegister(parentDisposable, repository)) { + Disposer.dispose(repository); + } + }); return repository; } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java index f9332d70d14e..d92fcbc2b189 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java @@ -5,6 +5,7 @@ package org.zmlx.hg4idea.repo; import com.intellij.dvcs.ignore.VcsIgnoredHolderUpdateListener; import com.intellij.dvcs.repo.RepositoryImpl; import com.intellij.openapi.Disposable; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.util.BackgroundTaskUtil; @@ -46,9 +47,8 @@ public final class HgRepositoryImpl extends RepositoryImpl implements HgReposito @SuppressWarnings("ConstantConditions") - private HgRepositoryImpl(@NotNull VirtualFile rootDir, @NotNull HgVcs vcs, - @NotNull Disposable parentDisposable) { - super(vcs.getProject(), rootDir, parentDisposable); + private HgRepositoryImpl(@NotNull VirtualFile rootDir, @NotNull HgVcs vcs) { + super(vcs.getProject(), rootDir); myVcs = vcs; myHgDir = rootDir.findChild(HgUtil.DOT_HG); assert myHgDir != null : ".hg directory wasn't found under " + rootDir.getPresentableUrl(); @@ -69,8 +69,14 @@ public final class HgRepositoryImpl extends RepositoryImpl implements HgReposito if (vcs == null) { throw new IllegalArgumentException("Vcs not found for project " + project); } - HgRepositoryImpl repository = new HgRepositoryImpl(root, vcs, parentDisposable); + HgRepositoryImpl repository = new HgRepositoryImpl(root, vcs); repository.setupUpdater(); + + ReadAction.run(() -> { + if (!Disposer.tryRegister(parentDisposable, repository)) { + Disposer.dispose(repository); + } + }); return repository; }