diff options
-rw-r--r-- | org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java | 42 | ||||
-rw-r--r-- | org.eclipse.egit.core/src/org/eclipse/egit/core/op/IgnoreOperation.java | 29 |
2 files changed, 44 insertions, 27 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java index a075ce06c8..bd2b9febd6 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java @@ -23,12 +23,15 @@ import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -40,6 +43,10 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.storage.file.CheckoutEntry; import org.eclipse.jgit.storage.file.ReflogEntry; import org.eclipse.jgit.storage.file.ReflogReader; +import org.eclipse.jgit.treewalk.FileTreeIterator; +import org.eclipse.jgit.treewalk.TreeWalk; +import org.eclipse.jgit.treewalk.WorkingTreeIterator; +import org.eclipse.jgit.treewalk.filter.PathFilter; import org.eclipse.jgit.util.FS; import org.osgi.service.prefs.BackingStoreException; @@ -463,4 +470,39 @@ public class RepositoryUtil { walk.release(); } } + + /** + * Checks if resource with given path is to be ignored. + * + * @param path + * Path to be checked + * @return true if the path matches an ignore rule or no repository mapping + * could be found, false otherwise + * @throws IOException + * @since 2.3 + */ + public static boolean isIgnored(IPath path) throws IOException { + RepositoryMapping mapping = RepositoryMapping.getMapping(path); + if (mapping == null) + return true; // Linked resources may not be mapped + Repository repository = mapping.getRepository(); + String repoRelativePath = mapping.getRepoRelativePath(path); + TreeWalk walk = new TreeWalk(repository); + try { + walk.addTree(new FileTreeIterator(repository)); + walk.setFilter(PathFilter.create(repoRelativePath)); + while (walk.next()) { + WorkingTreeIterator workingTreeIterator = walk.getTree(0, + WorkingTreeIterator.class); + if (walk.getPathString().equals(repoRelativePath)) + return workingTreeIterator.isEntryIgnored(); + if (workingTreeIterator.getEntryFileMode() + .equals(FileMode.TREE)) + walk.enterSubtree(); + } + } finally { + walk.release(); + } + return false; + } } diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/IgnoreOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/IgnoreOperation.java index 9b64564f0b..1a58189590 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/IgnoreOperation.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/IgnoreOperation.java @@ -35,15 +35,11 @@ import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.egit.core.Activator; import org.eclipse.egit.core.CoreText; +import org.eclipse.egit.core.RepositoryUtil; import org.eclipse.egit.core.internal.job.RuleUtil; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.treewalk.FileTreeIterator; -import org.eclipse.jgit.treewalk.TreeWalk; -import org.eclipse.jgit.treewalk.WorkingTreeIterator; -import org.eclipse.jgit.treewalk.filter.PathFilter; import org.eclipse.osgi.util.NLS; /** @@ -96,7 +92,7 @@ public class IgnoreOperation implements IEGitOperation { // NB This does the same thing in // DecoratableResourceAdapter, but neither currently // consult .gitignore - if (!isIgnored(path)) + if (!RepositoryUtil.isIgnored(path)) addIgnore(monitor, path); monitor.worked(1); } @@ -109,27 +105,6 @@ public class IgnoreOperation implements IEGitOperation { } } - private boolean isIgnored(IPath path) throws IOException { - RepositoryMapping mapping = RepositoryMapping.getMapping(path); - if (mapping == null) - return true; // Linked resources may not be mapped - Repository repository = mapping.getRepository(); - String repoRelativePath = mapping.getRepoRelativePath(path); - TreeWalk walk = new TreeWalk(repository); - walk.addTree(new FileTreeIterator(repository)); - walk.setFilter(PathFilter.create(repoRelativePath)); - while (walk.next()) { - WorkingTreeIterator workingTreeIterator = walk.getTree(0, - WorkingTreeIterator.class); - if (walk.getPathString().equals(repoRelativePath)) { - return workingTreeIterator.isEntryIgnored(); - } - if (workingTreeIterator.getEntryFileMode().equals(FileMode.TREE)) - walk.enterSubtree(); - } - return false; - } - /** * @return true if a gitignore file outside the workspace was changed. In * this case the caller may need to perform manual UI refreshes |