From 1df4c49c4aa3a17c1a5995c409af5f14dbcd38a2 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Wed, 28 Sep 2016 19:45:31 +0300 Subject: [PATCH] [vcs]: provide EP for vcs Ignored files holder * move Hg specific holder as EP to hg4idea plugin; * optimize HashSet using one from ContainerUtils; * delegate activation for all specific ignored holders from composite; * remove hacky code from UpdateingChanglistBuilder; * now hg ignored files updating only by fully repo refresh; --- .../src/META-INF/VcsExtensionPoints.xml | 2 + .../openapi/vcs/changes/FileHolder.java | 4 +- .../changes/IgnoredFilesCompositeHolder.java | 45 +++++++------- .../changes/UpdatingChangeListBuilder.java | 10 +--- .../vcs/changes/VcsIgnoredFilesHolder.java | 27 +++++++++ plugins/hg4idea/src/META-INF/plugin.xml | 1 + .../hg4idea/provider/HgIgnoredFileHolder.java | 59 ++++++++----------- 7 files changed, 81 insertions(+), 67 deletions(-) create mode 100644 platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoredFilesHolder.java rename platform/vcs-impl/src/com/intellij/openapi/vcs/changes/MapIgnoredFilesHolder.java => plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgIgnoredFileHolder.java (62%) diff --git a/platform/platform-resources/src/META-INF/VcsExtensionPoints.xml b/platform/platform-resources/src/META-INF/VcsExtensionPoints.xml index c94e541714c4..a21517b72d1a 100644 --- a/platform/platform-resources/src/META-INF/VcsExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/VcsExtensionPoints.xml @@ -55,6 +55,8 @@ interface="com.intellij.openapi.vcs.impl.VcsBaseContentProvider" area="IDEA_PROJECT"/> + + diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolder.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolder.java index 8e5798798668..e9d05bb9b320 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolder.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/FileHolder.java @@ -17,7 +17,7 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.vcs.AbstractVcs; -interface FileHolder { +public interface FileHolder { void cleanAll(); void cleanAndAdjustScope(VcsModifiableDirtyScope scope); FileHolder copy(); @@ -25,7 +25,7 @@ interface FileHolder { void notifyVcsStarted(AbstractVcs scope); - static enum HolderType { + enum HolderType { DELETED, UNVERSIONED, SWITCHED, 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 0e7c9bc264d7..9669aef6cc3c 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 @@ -16,22 +16,18 @@ 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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.*; +import java.util.stream.Stream; -/** - * @author irengrig - * Date: 2/10/11 - * Time: 3:57 PM - */ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { private final Map myHolderMap; private final Project myProject; @@ -73,15 +69,6 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { return HolderType.IGNORED; } - @Nullable - public IgnoredFilesHolder getAppropriateIgnoredHolder() { - if (!myHolderMap.containsKey(myCurrentVcs)) { - LOG.error("current vcs: " + myCurrentVcs); - return null; - } - return myHolderMap.get(myCurrentVcs); - } - @Override public void addFile(VirtualFile file) { if (!myHolderMap.containsKey(myCurrentVcs)) { @@ -95,7 +82,7 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { final AbstractVcs vcs = myVcsManager.getVcsFor(file); if (vcs == null) return false; final IgnoredFilesHolder ignoredFilesHolder = myHolderMap.get(vcs); - return ignoredFilesHolder == null ? false : ignoredFilesHolder.containsFile(file); + return ignoredFilesHolder != null && ignoredFilesHolder.containsFile(file); } @Override @@ -111,10 +98,22 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder { @Override public void notifyVcsStarted(AbstractVcs vcs) { myCurrentVcs = vcs; - if (! myHolderMap.containsKey(vcs)) { - myHolderMap.put(vcs, vcs.reportsIgnoredDirectories() ? new RecursiveFileHolder(myProject, HolderType.IGNORED) : - new MapIgnoredFilesHolder(myProject)); - } + if (myHolderMap.containsKey(vcs)) return; + + IgnoredFilesHolder ignoredFilesHolder = + ObjectUtils.chooseNotNull(getHolderFromEP(vcs, myProject), new RecursiveFileHolder<>(myProject, HolderType.IGNORED)); + ignoredFilesHolder.notifyVcsStarted(vcs); + myHolderMap.put(vcs, ignoredFilesHolder); + } + + + @Nullable + private static VcsIgnoredFilesHolder getHolderFromEP(AbstractVcs vcs, @NotNull Project project) { + Optional ignoredFilesHolder = + Stream.of(Extensions.getExtensions(VcsIgnoredFilesHolder.VCS_IGNORED_FILES_HOLDER_EP, project)) + .filter(holder -> holder.getVcs().equals(vcs)) + .findFirst(); + return ignoredFilesHolder.isPresent() ? ignoredFilesHolder.get() : null; } @Override 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 595d7e8d83d4..5a4b8dc43882 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 @@ -174,15 +174,7 @@ class UpdatingChangeListBuilder implements ChangelistBuilder { checkIfDisposed(); if (isIgnoredByVcs(file)) return; if (myScope.belongsTo(VcsUtil.getFilePath(file))) { - IgnoredFilesHolder ignoredFilesHolder = myComposite.getIgnoredFileHolder(); - if (ignoredFilesHolder instanceof IgnoredFilesCompositeHolder) { - IgnoredFilesHolder holder = ((IgnoredFilesCompositeHolder)ignoredFilesHolder).getAppropriateIgnoredHolder(); - if (holder instanceof MapIgnoredFilesHolder) { - ((MapIgnoredFilesHolder)holder).addByVcsChangeProvider(file); - return; - } - } - ignoredFilesHolder.addFile(file); + myComposite.getIgnoredFileHolder().addFile(file); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoredFilesHolder.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoredFilesHolder.java new file mode 100644 index 000000000000..616f4d55c812 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoredFilesHolder.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.vcs.changes; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.vcs.AbstractVcs; +import org.jetbrains.annotations.NotNull; + +public interface VcsIgnoredFilesHolder extends IgnoredFilesHolder { + ExtensionPointName VCS_IGNORED_FILES_HOLDER_EP = ExtensionPointName.create("com.intellij.vcs.ignoredFilesHolder"); + + @NotNull + AbstractVcs getVcs(); +} diff --git a/plugins/hg4idea/src/META-INF/plugin.xml b/plugins/hg4idea/src/META-INF/plugin.xml index ad4c5b7b2e5a..7332165cc566 100644 --- a/plugins/hg4idea/src/META-INF/plugin.xml +++ b/plugins/hg4idea/src/META-INF/plugin.xml @@ -30,6 +30,7 @@ + diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/MapIgnoredFilesHolder.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgIgnoredFileHolder.java similarity index 62% rename from platform/vcs-impl/src/com/intellij/openapi/vcs/changes/MapIgnoredFilesHolder.java rename to plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgIgnoredFileHolder.java index 017ffa25391a..c7f63f35191f 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/MapIgnoredFilesHolder.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgIgnoredFileHolder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,47 +13,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.openapi.vcs.changes; +package org.zmlx.hg4idea.provider; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.AbstractVcs; +import com.intellij.openapi.vcs.changes.FileHolder; +import com.intellij.openapi.vcs.changes.VcsIgnoredFilesHolder; +import com.intellij.openapi.vcs.changes.VcsModifiableDirtyScope; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; -import gnu.trove.THashSet; +import org.jetbrains.annotations.NotNull; +import org.zmlx.hg4idea.HgVcs; import java.util.Collection; import java.util.Set; -/** - * @author irengrig - * Date: 2/10/11 - * Time: 4:20 PM - */ -public class MapIgnoredFilesHolder extends AbstractIgnoredFilesHolder { - private final static Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.MapIgnoredFilesHolder"); - +public class HgIgnoredFileHolder implements VcsIgnoredFilesHolder { + private final Project myProject; + private HgVcs myVcs; private final Set mySet; private final Set myVcsIgnoredSet; - private final Project myProject; - public MapIgnoredFilesHolder(Project project) { - super(project); + public HgIgnoredFileHolder(Project project) { myProject = project; - mySet = new THashSet<>(); - myVcsIgnoredSet = new THashSet<>(); //collect ignored files from VcsChangeProvider -> processIgnored - } - - @Override - protected void removeFile(VirtualFile file) { - mySet.remove(file); - myVcsIgnoredSet.remove(file); - } - - @Override - protected Collection keys() { - // if mySet has a big size -> idea will process all of this on every typing. see cleanAndAdjustScope() in AbstractIgnoredFilesHolder - return mySet; + myVcs = HgVcs.getInstance(myProject); + mySet = ContainerUtil.newHashSet(); + myVcsIgnoredSet = ContainerUtil.newHashSet(); //collect ignored files from VcsChangeProvider -> processIgnored } @Override @@ -61,9 +46,6 @@ public class MapIgnoredFilesHolder extends AbstractIgnoredFilesHolder { // todo fix more. take from x0x branch //LOG.assertTrue(! file.isDirectory()); mySet.add(file); - } - - public void addByVcsChangeProvider(VirtualFile file) { myVcsIgnoredSet.add(file); } @@ -76,6 +58,10 @@ public class MapIgnoredFilesHolder extends AbstractIgnoredFilesHolder { public Collection values() { return ContainerUtil.union(mySet, myVcsIgnoredSet); } + + @Override + public void cleanAndAdjustScope(final VcsModifiableDirtyScope scope) { + } @Override public void cleanAll() { @@ -85,7 +71,7 @@ public class MapIgnoredFilesHolder extends AbstractIgnoredFilesHolder { @Override public FileHolder copy() { - final MapIgnoredFilesHolder result = new MapIgnoredFilesHolder(myProject); + final HgIgnoredFileHolder result = new HgIgnoredFileHolder(myProject); result.mySet.addAll(mySet); result.myVcsIgnoredSet.addAll(myVcsIgnoredSet); return result; @@ -98,5 +84,12 @@ public class MapIgnoredFilesHolder extends AbstractIgnoredFilesHolder { @Override public void notifyVcsStarted(AbstractVcs scope) { + cleanAll(); + } + + @NotNull + @Override + public AbstractVcs getVcs() { + return myVcs; } }