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;
}
}