Skip to content

Commit

Permalink
#204 - check for outer ignore file once when project is opened
Browse files Browse the repository at this point in the history
  • Loading branch information
hsz committed Apr 4, 2016
1 parent 0d33bb1 commit 560d79b
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 71 deletions.
17 changes: 15 additions & 2 deletions src/mobi/hsz/idea/gitignore/lang/IgnoreLanguage.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.intellij.psi.FileViewProvider;
import mobi.hsz.idea.gitignore.IgnoreBundle;
import mobi.hsz.idea.gitignore.file.type.IgnoreFileType;
import mobi.hsz.idea.gitignore.outer.OuterIgnoreLoaderComponent;
import mobi.hsz.idea.gitignore.psi.IgnoreFile;
import mobi.hsz.idea.gitignore.settings.IgnoreSettings;
import org.jetbrains.annotations.NonNls;
Expand Down Expand Up @@ -177,8 +178,20 @@ public IgnoreBundle.Syntax getDefaultSyntax() {
* @return excludes file path
*/
@Nullable
public VirtualFile getOuterFile(@Nullable final Project project) {
return null;
final public VirtualFile getOuterFile(@NotNull final Project project) {
if (!isOuterFileSupported()) {
return null;
}
return OuterIgnoreLoaderComponent.getInstance(project).getOuterFile(this);
}

/**
* Defines if current {@link IgnoreLanguage} supports outer ignore files.
*
* @return supports outer ignore files
*/
public boolean isOuterFileSupported() {
return false;
}

/**
Expand Down
20 changes: 4 additions & 16 deletions src/mobi/hsz/idea/gitignore/lang/kind/FossilLanguage.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,11 @@

package mobi.hsz.idea.gitignore.lang.kind;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import mobi.hsz.idea.gitignore.file.type.IgnoreFileType;
import mobi.hsz.idea.gitignore.file.type.kind.FossilFileType;
import mobi.hsz.idea.gitignore.lang.IgnoreLanguage;
import mobi.hsz.idea.gitignore.util.Icons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* Fossil {@link IgnoreLanguage} definition.
Expand Down Expand Up @@ -65,21 +62,12 @@ public String getFilename() {
}

/**
* Returns path to the global excludes file.
* Defines if {@link FossilLanguage} supports outer ignore files.
*
* @param project current project
* @return excludes file path
* @return supports outer ignore files
*/
@Nullable
@Override
public VirtualFile getOuterFile(@Nullable final Project project) {
if (project == null) {
return null;
}
VirtualFile baseDir = project.getBaseDir();
if (baseDir == null) {
return null;
}
return baseDir.findFileByRelativePath("./.fossil-settings/ignore-glob");
public boolean isOuterFileSupported() {
return true;
}
}
58 changes: 5 additions & 53 deletions src/mobi/hsz/idea/gitignore/lang/kind/GitLanguage.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,11 @@

package mobi.hsz.idea.gitignore.lang.kind;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import git4idea.config.GitVcsApplicationSettings;
import mobi.hsz.idea.gitignore.file.type.IgnoreFileType;
import mobi.hsz.idea.gitignore.file.type.kind.GitFileType;
import mobi.hsz.idea.gitignore.lang.IgnoreLanguage;
import mobi.hsz.idea.gitignore.util.Icons;
import mobi.hsz.idea.gitignore.util.ProcessWithTimeout;
import mobi.hsz.idea.gitignore.util.Utils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* Gitignore {@link IgnoreLanguage} definition.
Expand All @@ -53,12 +40,6 @@ public class GitLanguage extends IgnoreLanguage {
/** The {@link GitLanguage} instance. */
public static final GitLanguage INSTANCE = new GitLanguage();

/** The outer file. */
private static VirtualFile OUTER_FILE;

/** Flag to mark that outer file was fetched. */
private static boolean OUTER_FILE_FETCHED = false;

/** {@link IgnoreLanguage} is a non-instantiable static class. */
private GitLanguage() {
super("Git", "gitignore", ".git", Icons.GIT);
Expand All @@ -71,43 +52,14 @@ public IgnoreFileType getFileType() {
return GitFileType.INSTANCE;
}


/**
* Returns path to the global excludes file.
* Defines if {@link GitLanguage} supports outer ignore files.
*
* @param project current project
* @return excludes file path
* @return supports outer ignore files
*/
@Nullable
@Override
public VirtualFile getOuterFile(@Nullable final Project project) {
if (OUTER_FILE_FETCHED && (OUTER_FILE != null && OUTER_FILE.exists())) {
return OUTER_FILE;
}

if (Utils.isGitPluginEnabled()) {
final String bin = GitVcsApplicationSettings.getInstance().getPathToGit();
if (StringUtil.isNotEmpty(bin)) {
try {
Process pr = Runtime.getRuntime().exec(bin + " config --global core.excludesfile");
pr.waitFor();

ProcessWithTimeout processWithTimeout = new ProcessWithTimeout(pr);
int exitCode = processWithTimeout.waitForProcess(3000);
if (exitCode == Integer.MIN_VALUE) {
pr.destroy();
}

BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String path = Utils.resolveUserDir(reader.readLine());
if (StringUtil.isNotEmpty(path)) {
OUTER_FILE = VfsUtil.findFileByIoFile(new File(path), true);
}
} catch (IOException ignored) {
} catch (InterruptedException ignored) {
}
}
}
OUTER_FILE_FETCHED = true;
return OUTER_FILE;
public boolean isOuterFileSupported() {
return true;
}
}
72 changes: 72 additions & 0 deletions src/mobi/hsz/idea/gitignore/outer/OuterIgnoreLoaderComponent.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,28 @@
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import git4idea.config.GitVcsApplicationSettings;
import mobi.hsz.idea.gitignore.file.type.IgnoreFileType;
import mobi.hsz.idea.gitignore.lang.IgnoreLanguage;
import mobi.hsz.idea.gitignore.lang.kind.FossilLanguage;
import mobi.hsz.idea.gitignore.lang.kind.GitLanguage;
import mobi.hsz.idea.gitignore.settings.IgnoreSettings;
import mobi.hsz.idea.gitignore.util.ProcessWithTimeout;
import mobi.hsz.idea.gitignore.util.Utils;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

import static mobi.hsz.idea.gitignore.settings.IgnoreSettings.KEY;

Expand All @@ -50,7 +64,20 @@
public class OuterIgnoreLoaderComponent extends AbstractProjectComponent {
/** Current project. */
private final Project project;

/** Outer files map. */
private HashMap<IgnoreLanguage, VirtualFile> outerFile = ContainerUtil.newHashMap();

/**
* Returns {@link OuterIgnoreLoaderComponent} service instance.
*
* @param project current project
* @return {@link OuterIgnoreLoaderComponent instance}
*/
public static OuterIgnoreLoaderComponent getInstance(@NotNull final Project project) {
return project.getComponent(OuterIgnoreLoaderComponent.class);
}

/** Constructor. */
public OuterIgnoreLoaderComponent(@NotNull final Project project) {
super(project);
Expand All @@ -75,6 +102,51 @@ public void initComponent() {
myProject.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new IgnoreEditorManagerListener(project));
}

@Override
public void projectOpened() {
// Outer file for {@link GitLanguage}
if (Utils.isGitPluginEnabled()) {
final String bin = GitVcsApplicationSettings.getInstance().getPathToGit();
if (StringUtil.isNotEmpty(bin)) {
try {
Process pr = Runtime.getRuntime().exec(bin + " config --global core.excludesfile");
pr.waitFor();

ProcessWithTimeout processWithTimeout = new ProcessWithTimeout(pr);
int exitCode = processWithTimeout.waitForProcess(3000);
if (exitCode == Integer.MIN_VALUE) {
pr.destroy();
}

BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String path = Utils.resolveUserDir(reader.readLine());
if (StringUtil.isNotEmpty(path)) {
outerFile.put(GitLanguage.INSTANCE, VfsUtil.findFileByIoFile(new File(path), true));
}
} catch (IOException ignored) {
} catch (InterruptedException ignored) {
}
}
}

// Outer file for {@link FossilLanguage}
VirtualFile baseDir = project.getBaseDir();
if (baseDir != null) {
outerFile.put(FossilLanguage.INSTANCE, baseDir.findFileByRelativePath("./.fossil-settings/ignore-glob"));
}
}

/**
* Returns outer file for the given {@link IgnoreLanguage}.
*
* @param language of the outer file
* @return outer file
*/
@Nullable
public VirtualFile getOuterFile(@NotNull IgnoreLanguage language) {
return outerFile.get(language);
}

/**
* Listener for ignore editor manager.
*/
Expand Down

0 comments on commit 560d79b

Please sign in to comment.