From a43147207ca914fbf82bde1ac921aa4aa8a0197c Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Wed, 12 Oct 2016 20:51:38 +0300 Subject: [PATCH] [vcs]: provide separated ignored maps for vcses and one for Ide ignored * rename; * return Composite Ignored holder from FileHolder instead of common instance; * add annotations; * provider getter for active ignored files holder for current VCS; * use streams if possible; --- .../vcs/changes/ChangeListManagerImpl.java | 5 +- .../vcs/changes/FileHolderComposite.java | 4 +- .../changes/IgnoredFilesCompositeHolder.java | 61 +++++++++++-------- .../changes/UpdatingChangeListBuilder.java | 3 +- 4 files changed, 43 insertions(+), 30 deletions(-) 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 a003622b4a89..27a29db7d0c5 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 @@ -403,7 +403,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec final Set refreshFiles = new HashSet<>(); try { synchronized (myDataLock) { - final IgnoredFilesHolder fileHolder = (IgnoredFilesHolder)myComposite.get(FileHolder.HolderType.IGNORED); + final IgnoredFilesCompositeHolder fileHolder = myComposite.getIgnoredFileHolder(); for (Iterator iterator = scopes.iterator(); iterator.hasNext(); ) { final VcsModifiableDirtyScope scope = (VcsModifiableDirtyScope)iterator.next(); @@ -805,7 +805,8 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec /** * @return only roots for ignored folders, and ignored files */ - List getIgnoredFiles() { + @NotNull + public List getIgnoredFiles() { synchronized (myDataLock) { return new ArrayList<>(myComposite.getIgnoredFileHolder().values()); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolderComposite.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolderComposite.java index 4e48262ed5b5..f1857ff88ebd 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolderComposite.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolderComposite.java @@ -100,8 +100,8 @@ public class FileHolderComposite implements FileHolder { throw new UnsupportedOperationException(); } - public IgnoredFilesHolder getIgnoredFileHolder() { - return (IgnoredFilesHolder) myHolders.get(HolderType.IGNORED); + public IgnoredFilesCompositeHolder getIgnoredFileHolder() { + return (IgnoredFilesCompositeHolder) myHolders.get(HolderType.IGNORED); } public void notifyVcsStarted(AbstractVcs vcs) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFilesCompositeHolder.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFilesCompositeHolder.java index 9669aef6cc3c..81e4d3e7a853 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFilesCompositeHolder.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFilesCompositeHolder.java @@ -15,52 +15,57 @@ */ package com.intellij.openapi.vcs.changes; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ObjectUtils; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { - private final Map myHolderMap; + private final Map myVcsIgnoredHolderMap; + private IgnoredFilesHolder myIdeIgnoredFilesHolder; private final Project myProject; private AbstractVcs myCurrentVcs; private final ProjectLevelVcsManager myVcsManager; - private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.IgnoredFilesCompositeHolder"); public IgnoredFilesCompositeHolder(final Project project) { super(); myProject = project; - myHolderMap = new HashMap<>(); + myVcsIgnoredHolderMap = new HashMap<>(); + myIdeIgnoredFilesHolder = new RecursiveFileHolder<>(myProject, HolderType.IGNORED); myVcsManager = ProjectLevelVcsManager.getInstance(myProject); } @Override public void cleanAll() { - myHolderMap.clear(); + myVcsIgnoredHolderMap.clear(); + myIdeIgnoredFilesHolder.cleanAll(); } @Override public void cleanAndAdjustScope(VcsModifiableDirtyScope scope) { final AbstractVcs vcs = scope.getVcs(); - if (myHolderMap.containsKey(vcs)) { - myHolderMap.get(vcs).cleanAndAdjustScope(scope); + if (myVcsIgnoredHolderMap.containsKey(vcs)) { + myVcsIgnoredHolderMap.get(vcs).cleanAndAdjustScope(scope); } + myIdeIgnoredFilesHolder.cleanAndAdjustScope(scope); } @Override public FileHolder copy() { final IgnoredFilesCompositeHolder result = new IgnoredFilesCompositeHolder(myProject); - for (Map.Entry entry : myHolderMap.entrySet()) { - result.myHolderMap.put(entry.getKey(), (IgnoredFilesHolder) entry.getValue().copy()); + for (Map.Entry entry : myVcsIgnoredHolderMap.entrySet()) { + result.myVcsIgnoredHolderMap.put(entry.getKey(), (IgnoredFilesHolder)entry.getValue().copy()); } + result.myIdeIgnoredFilesHolder = (IgnoredFilesHolder)myIdeIgnoredFilesHolder.copy(); return result; } @@ -71,39 +76,46 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { @Override public void addFile(VirtualFile file) { - if (!myHolderMap.containsKey(myCurrentVcs)) { - LOG.error("current vcs: " + myCurrentVcs + " file: " + file.getPath()); - } - myHolderMap.get(myCurrentVcs).addFile(file); + myIdeIgnoredFilesHolder.addFile(file); } @Override public boolean containsFile(VirtualFile file) { + if (myIdeIgnoredFilesHolder.containsFile(file)) return true; final AbstractVcs vcs = myVcsManager.getVcsFor(file); if (vcs == null) return false; - final IgnoredFilesHolder ignoredFilesHolder = myHolderMap.get(vcs); + final IgnoredFilesHolder ignoredFilesHolder = myVcsIgnoredHolderMap.get(vcs); return ignoredFilesHolder != null && ignoredFilesHolder.containsFile(file); } @Override public Collection values() { - if (myHolderMap.size() == 1) return myHolderMap.values().iterator().next().values(); - final HashSet result = new HashSet<>(); - for (IgnoredFilesHolder holder : myHolderMap.values()) { - result.addAll(holder.values()); - } + final HashSet result = ContainerUtil.newHashSet(); + result.addAll(myIdeIgnoredFilesHolder.values()); + result.addAll(myVcsIgnoredHolderMap.values().stream().map(IgnoredFilesHolder::values).flatMap(set -> set.stream()).collect(Collectors.toSet())); return result; } @Override public void notifyVcsStarted(AbstractVcs vcs) { myCurrentVcs = vcs; - if (myHolderMap.containsKey(vcs)) return; + if (myVcsIgnoredHolderMap.containsKey(vcs)) return; IgnoredFilesHolder ignoredFilesHolder = ObjectUtils.chooseNotNull(getHolderFromEP(vcs, myProject), new RecursiveFileHolder<>(myProject, HolderType.IGNORED)); ignoredFilesHolder.notifyVcsStarted(vcs); - myHolderMap.put(vcs, ignoredFilesHolder); + myVcsIgnoredHolderMap.put(vcs, ignoredFilesHolder); + } + + @Nullable + public IgnoredFilesHolder getActiveVcsHolder() { + return getIgnoredHolderByVcs(myCurrentVcs); + } + + @Nullable + private IgnoredFilesHolder getIgnoredHolderByVcs(AbstractVcs vcs) { + if (!myVcsIgnoredHolderMap.containsKey(vcs)) return null; + return myVcsIgnoredHolderMap.get(vcs); } @@ -124,13 +136,12 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { if (!(obj instanceof IgnoredFilesCompositeHolder)) { return false; } - IgnoredFilesCompositeHolder other = (IgnoredFilesCompositeHolder) obj; - return myHolderMap.equals(other.myHolderMap); + IgnoredFilesCompositeHolder other = (IgnoredFilesCompositeHolder)obj; + return myVcsIgnoredHolderMap.equals(other.myVcsIgnoredHolderMap) && myIdeIgnoredFilesHolder.equals(other.myIdeIgnoredFilesHolder); } @Override public int hashCode() { - return myHolderMap.hashCode(); + return Objects.hash(myVcsIgnoredHolderMap, myIdeIgnoredFilesHolder); } - } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdatingChangeListBuilder.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdatingChangeListBuilder.java index 5a4b8dc43882..3673d9292203 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdatingChangeListBuilder.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdatingChangeListBuilder.java @@ -25,6 +25,7 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.ObjectUtils; import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.Nullable; @@ -174,7 +175,7 @@ class UpdatingChangeListBuilder implements ChangelistBuilder { checkIfDisposed(); if (isIgnoredByVcs(file)) return; if (myScope.belongsTo(VcsUtil.getFilePath(file))) { - myComposite.getIgnoredFileHolder().addFile(file); + ObjectUtils.assertNotNull(myComposite.getIgnoredFileHolder().getActiveVcsHolder()).addFile(file); } }