diff --git a/build.gradle b/build.gradle index 192a3401..79358795 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ intellij { untilBuild pluginUntilBuild } - plugins 'git4idea' + plugins 'git4idea', 'hg4idea' publishPlugin { username publishUsername diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml index 417cc872..3d4a3ef2 100644 --- a/resources/META-INF/plugin.xml +++ b/resources/META-INF/plugin.xml @@ -109,6 +109,7 @@ com.intellij.modules.lang Git4Idea + hg4idea @@ -332,13 +333,7 @@ - - - - - @@ -400,13 +395,7 @@ - - - - - diff --git a/src/mobi/hsz/idea/gitignore/actions/IgnoreFileGroupAction.java b/src/mobi/hsz/idea/gitignore/actions/IgnoreFileGroupAction.java index 3e3124e4..e8635247 100644 --- a/src/mobi/hsz/idea/gitignore/actions/IgnoreFileGroupAction.java +++ b/src/mobi/hsz/idea/gitignore/actions/IgnoreFileGroupAction.java @@ -35,6 +35,8 @@ import mobi.hsz.idea.gitignore.IgnoreBundle; import mobi.hsz.idea.gitignore.file.type.IgnoreFileType; import mobi.hsz.idea.gitignore.lang.IgnoreLanguage; +import mobi.hsz.idea.gitignore.lang.kind.GitLanguage; +import mobi.hsz.idea.gitignore.lang.kind.MercurialLanguage; import mobi.hsz.idea.gitignore.util.CommonDataKeys; import mobi.hsz.idea.gitignore.util.ExternalFileException; import mobi.hsz.idea.gitignore.util.Utils; @@ -115,6 +117,9 @@ public void update(@NotNull AnActionEvent e) { baseDir = Utils.getModuleRootForFile(file, project); for (IgnoreLanguage language : IgnoreBundle.LANGUAGES) { + //skip already bundled languages for ignore action + if (!(this instanceof UnignoreFileGroupAction) && (language instanceof GitLanguage || language instanceof MercurialLanguage)) continue; + final IgnoreFileType fileType = language.getFileType(); List list = Utils.getSuitableIgnoreFiles(project, fileType, file); Collections.reverse(list); diff --git a/src/mobi/hsz/idea/gitignore/file/IgnoreFileTypeFactory.java b/src/mobi/hsz/idea/gitignore/file/IgnoreFileTypeFactory.java index 921ec3ed..8f500ca5 100644 --- a/src/mobi/hsz/idea/gitignore/file/IgnoreFileTypeFactory.java +++ b/src/mobi/hsz/idea/gitignore/file/IgnoreFileTypeFactory.java @@ -30,6 +30,8 @@ import mobi.hsz.idea.gitignore.IgnoreBundle; import mobi.hsz.idea.gitignore.file.type.IgnoreFileType; import mobi.hsz.idea.gitignore.lang.IgnoreLanguage; +import mobi.hsz.idea.gitignore.lang.kind.GitLanguage; +import mobi.hsz.idea.gitignore.lang.kind.MercurialLanguage; import org.jetbrains.annotations.NotNull; /** @@ -48,6 +50,9 @@ public class IgnoreFileTypeFactory extends FileTypeFactory { public void createFileTypes(@NotNull FileTypeConsumer consumer) { consume(consumer, IgnoreFileType.INSTANCE); for (final IgnoreLanguage language : IgnoreBundle.LANGUAGES) { + //skip already bundled languages + if (language instanceof GitLanguage || language instanceof MercurialLanguage) continue; + consume(consumer, language.getFileType()); } } diff --git a/src/mobi/hsz/idea/gitignore/outer/OuterIgnoreLoaderComponent.java b/src/mobi/hsz/idea/gitignore/outer/OuterIgnoreLoaderComponent.java index e0beb386..d8b54633 100644 --- a/src/mobi/hsz/idea/gitignore/outer/OuterIgnoreLoaderComponent.java +++ b/src/mobi/hsz/idea/gitignore/outer/OuterIgnoreLoaderComponent.java @@ -27,19 +27,24 @@ import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.messages.MessageBusConnection; +import git4idea.ignore.lang.GitIgnoreFileType; import mobi.hsz.idea.gitignore.file.type.IgnoreFileType; import mobi.hsz.idea.gitignore.lang.IgnoreLanguage; import mobi.hsz.idea.gitignore.lang.kind.GitExcludeLanguage; import mobi.hsz.idea.gitignore.lang.kind.GitLanguage; +import mobi.hsz.idea.gitignore.lang.kind.MercurialLanguage; import mobi.hsz.idea.gitignore.settings.IgnoreSettings; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.zmlx.hg4idea.ignore.lang.HgIgnoreFileType; import javax.swing.*; import java.util.Collection; @@ -122,11 +127,12 @@ public IgnoreEditorManagerListener(@NotNull final Project project) { @Override public void fileOpened(@NotNull final FileEditorManager source, @NotNull final VirtualFile file) { final FileType fileType = file.getFileType(); - if (!(fileType instanceof IgnoreFileType) || !IgnoreSettings.getInstance().isOuterIgnoreRules()) { + if (!IgnoreSettings.getInstance().isOuterIgnoreRules()) { return; } - final IgnoreLanguage language = ((IgnoreFileType) fileType).getIgnoreLanguage(); + IgnoreLanguage language = determineIgnoreLanguage(file, fileType); + if (language == null) return; DumbService.getInstance(project).runWhenSmart(() -> { final List outerFiles = @@ -162,6 +168,20 @@ public void fileOpened(@NotNull final FileEditorManager source, @NotNull final V }); } + @Nullable + private IgnoreLanguage determineIgnoreLanguage(@NotNull VirtualFile file, FileType fileType) { + //if language provided by platform (e.g. GitLanguage) then map to language provided by plugin with extended functionality + FileTypeRegistry typeRegistry = FileTypeRegistry.getInstance(); + if (typeRegistry.isFileOfType(file, GitIgnoreFileType.INSTANCE)) { + return GitLanguage.INSTANCE; + } else if (typeRegistry.isFileOfType(file, HgIgnoreFileType.INSTANCE)) { + return MercurialLanguage.INSTANCE; + } else if (fileType instanceof IgnoreFileType) { + return ((IgnoreFileType) fileType).getIgnoreLanguage(); + } + return null; + } + @Override public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { }