package com.gratex.perconik.activity.ide; import java.io.IOException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.egit.core.project.GitProjectData; import org.eclipse.egit.core.project.RepositoryMapping; 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 static com.google.common.base.Throwables.propagate; //TODO resolve: not sure why is egit core restricted @SuppressWarnings("restriction") public final class IdeGitProjects { private IdeGitProjects() {} public static GitProjectData getProjectData(final IProject project) { return GitProjectData.get(project); } public static RepositoryMapping getMapping(final IResource resource) { GitProjectData data = getProjectData(resource.getProject()); return data != null ? data.getRepositoryMapping(resource) : null; } public static Repository getRepository(final IResource resource) { RepositoryMapping mapping = getMapping(resource); return mapping != null ? mapping.getRepository() : null; } public static boolean isIgnored(final IPath path) throws IOException { // TODO find better way to resolve this dependency: // RepositoryUtil.isIgnored(path) requires egit 2.3, but eclipse 3.8 has only egit 2.2 //return RepositoryUtil.isIgnored(path); // TODO resolve: code copied from egit 3.4 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 { // TODO resolve: jgit 2.2.0 (and its successors up to Luna) have TreeWalk.release() // but jgit 4.0.0 (as of Mars) replaces it with TreeWalk.close() try { try { walk.getClass().getDeclaredMethod("release").invoke(walk); } catch (NoSuchMethodException e) { walk.getClass().getDeclaredMethod("close").invoke(walk); } } catch (Exception e) { propagate(e); } } return false; } public static boolean isMapped(final IPath path) { return RepositoryMapping.getMapping(path) != null; } }