From bc88579b962a46cc227f7c19b7fbc29d6894b87e Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 28 Jun 2022 15:19:00 +0200 Subject: [PATCH] EA-545599 git: better listeners disposal * Do not throw NPE on race between activate and deactivate calls. GitOrigin-RevId: 42c98973a9797afa5bfbc2fe02404627782eb206 --- plugins/git4idea/src/git4idea/GitVcs.java | 18 +++++++----------- .../src/git4idea/vfs/GitVFSListener.java | 5 ++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/plugins/git4idea/src/git4idea/GitVcs.java b/plugins/git4idea/src/git4idea/GitVcs.java index 1118ecd9cc02..bccb11df468c 100644 --- a/plugins/git4idea/src/git4idea/GitVcs.java +++ b/plugins/git4idea/src/git4idea/GitVcs.java @@ -206,19 +206,18 @@ public final class GitVcs extends AbstractVcs { @Override protected void activate() { - myDisposable = Disposer.newDisposable(); + Disposable disposable = Disposer.newDisposable(); + myDisposable = disposable; - BackgroundTaskUtil.executeOnPooledThread(myDisposable, () + BackgroundTaskUtil.executeOnPooledThread(disposable, () -> GitExecutableManager.getInstance().testGitExecutableVersionValid(myProject)); - if (myVFSListener == null) { - myVFSListener = GitVFSListener.createInstance(this); - } + myVFSListener = GitVFSListener.createInstance(this, disposable); // make sure to read the registry before opening commit dialog myProject.getService(VcsUserRegistry.class); - GitAnnotationsListener.registerListener(myProject, myDisposable); - GitAdvancedSettingsListener.registerListener(myProject, myDisposable); + GitAnnotationsListener.registerListener(myProject, disposable); + GitAdvancedSettingsListener.registerListener(myProject, disposable); GitUserRegistry.getInstance(myProject).activate(); GitBranchIncomingOutgoingManager.getInstance(myProject).activate(); @@ -226,10 +225,7 @@ public final class GitVcs extends AbstractVcs { @Override protected void deactivate() { - if (myVFSListener != null) { - Disposer.dispose(myVFSListener); - myVFSListener = null; - } + myVFSListener = null; if (myDisposable != null) { Disposer.dispose(myDisposable); myDisposable = null; diff --git a/plugins/git4idea/src/git4idea/vfs/GitVFSListener.java b/plugins/git4idea/src/git4idea/vfs/GitVFSListener.java index f05b6212aa7d..cfc2d958b545 100644 --- a/plugins/git4idea/src/git4idea/vfs/GitVFSListener.java +++ b/plugins/git4idea/src/git4idea/vfs/GitVFSListener.java @@ -1,10 +1,12 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package git4idea.vfs; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.FilePath; @@ -40,8 +42,9 @@ public final class GitVFSListener extends VcsVFSListener { } @NotNull - public static GitVFSListener createInstance(@NotNull GitVcs vcs) { + public static GitVFSListener createInstance(@NotNull GitVcs vcs, @NotNull Disposable disposable) { GitVFSListener listener = new GitVFSListener(vcs); + Disposer.register(disposable, listener); listener.installListeners(); return listener; }