diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index b91f8f253e05..2cb70d7bef5b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -112,6 +112,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec }; private final ChangelistConflictTracker myConflictTracker; private VcsDirtyScopeManager myDirtyScopeManager; + private VcsDirtyScopeVfsListener myVfsListener; public static ChangeListManagerImpl getInstanceImpl(final Project project) { return (ChangeListManagerImpl)PeriodicalTasksCloser.getInstance().safeGetComponent(project, ChangeListManager.class); @@ -126,6 +127,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec myFreezeName = new AtomicReference(null); myAdditionalInfo = null; myChangesViewManager = myProject.isDefault() ? new DummyChangesView(myProject) : ChangesViewManager.getInstance(myProject); + myVfsListener = ApplicationManager.getApplication().getComponent(VcsDirtyScopeVfsListener.class); myFileStatusManager = FileStatusManager.getInstance(myProject); myComposite = new FileHolderComposite(project); myIgnoredIdeaLevel = new IgnoredFilesComponent(myProject, true); @@ -1336,6 +1338,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec * Can be called only from not AWT thread; to do smthg after ChangeListManager refresh, call invokeAfterUpdate */ public boolean ensureUpToDate(final boolean canBeCanceled) { + myVfsListener.flushDirt(); final EnsureUpToDateFromNonAWTThread worker = new EnsureUpToDateFromNonAWTThread(myProject); worker.execute(); myUpdater.waitUntilRefreshed(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java index 352ad57981b2..fc641b02df78 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java @@ -56,42 +56,45 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL private final ConstantZipperUpdater myZipperUpdater; private final List myQueue; private final Object myLock; + private final Runnable myDirtReporter; public VcsDirtyScopeVfsListener() { myProjectLocator = ProjectLocator.getInstance(); myMessageBusConnection = ApplicationManager.getApplication().getMessageBus().connect(); myLock = new Object(); myQueue = new ArrayList(); + myDirtReporter = new Runnable() { + @Override + public void run() { + ArrayList list; + synchronized (myLock) { + list = new ArrayList(myQueue); + myQueue.clear(); + } + Map, HashSet>> map = + new HashMap, HashSet>>(); + for (FileAndDirsCollector collector : list) { + Map, HashSet>> pairMap = + collector.map; + for (Map.Entry, HashSet>> entry : pairMap + .entrySet()) { + final VcsDirtyScopeManager key = entry.getKey(); + Pair, HashSet> existing = map.get(key); + Pair, HashSet> value = entry.getValue(); + if (existing != null) { + existing.getFirst().addAll(value.getFirst()); + existing.getSecond().addAll(value.getSecond()); + } + else { + map.put(key, value); + } + } + } + new FileAndDirsCollector().markDirty(map); + } + }; myZipperUpdater = new ConstantZipperUpdater(300, Alarm.ThreadToUse.SHARED_THREAD, ApplicationManager.getApplication(), - new Runnable() { - @Override - public void run() { - ArrayList list; - synchronized (myLock) { - list = new ArrayList(myQueue); - myQueue.clear(); - } - Map, HashSet>> map = - new HashMap, HashSet>>(); - for (FileAndDirsCollector collector : list) { - Map, HashSet>> pairMap = - collector.map; - for (Map.Entry, HashSet>> entry : pairMap - .entrySet()) { - final VcsDirtyScopeManager key = entry.getKey(); - Pair, HashSet> existing = map.get(key); - Pair, HashSet> value = entry.getValue(); - if (existing != null) { - existing.getFirst().addAll(value.getFirst()); - existing.getSecond().addAll(value.getSecond()); - } else { - map.put(key, value); - } - } - } - new FileAndDirsCollector().markDirty(map); - } - }); + myDirtReporter); } public void setForbid(boolean forbid) { @@ -99,6 +102,10 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL myForbid = forbid; } + public void flushDirt() { + myDirtReporter.run(); + } + @Override @NotNull public String getComponentName() {