477092: support file lookup when Git repository is checked out into an
Eclipse project
Change-Id: Ieb8108301a5bfca587ac18ee08786d4d55999c91
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=477092
Signed-off-by: chris.poon <chris.poon@tasktop.com>
diff --git a/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ScmCore.java b/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ScmCore.java
index b8e55c4..093e6f1 100644
--- a/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ScmCore.java
+++ b/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ScmCore.java
@@ -15,6 +15,7 @@
import java.util.HashMap;
import java.util.List;
+import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -46,6 +47,19 @@
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IPath path = new Path(file);
path.makeRelative();
+ IResource resource = findResource(root, path);
+ if (resource == null) {
+ for (IProject project : root.getProjects()) {
+ resource = project.findMember(path);
+ if (resource != null) {
+ break;
+ }
+ }
+ }
+ return resource;
+ }
+
+ private static IResource findResource(IWorkspaceRoot root, IPath path) {
while (path.segmentCount() > 1) {
IResource resource = root.findMember(path);
if (resource != null) {
diff --git a/org.eclipse.mylyn.versions.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.versions.tests/META-INF/MANIFEST.MF
index 9a09aa6..f904b43 100644
--- a/org.eclipse.mylyn.versions.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.versions.tests/META-INF/MANIFEST.MF
@@ -8,6 +8,7 @@
org.eclipse.core.resources,
org.eclipse.team.core,
org.junit;bundle-version="4.5.0",
+ org.eclipse.mylyn.commons.sdk.util,
org.eclipse.mylyn.versions.core,
org.eclipse.mylyn.versions.ui
Export-Package: org.eclipse.mylyn.versions.core;x-internal:=true,
diff --git a/org.eclipse.mylyn.versions.tests/src/org/eclipse/mylyn/versions/core/ScmCoreTest.java b/org.eclipse.mylyn.versions.tests/src/org/eclipse/mylyn/versions/core/ScmCoreTest.java
index 29159bc..198155c 100644
--- a/org.eclipse.mylyn.versions.tests/src/org/eclipse/mylyn/versions/core/ScmCoreTest.java
+++ b/org.eclipse.mylyn.versions.tests/src/org/eclipse/mylyn/versions/core/ScmCoreTest.java
@@ -12,9 +12,20 @@
package org.eclipse.mylyn.versions.core;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import java.io.IOException;
import java.util.List;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil;
import org.eclipse.mylyn.versions.core.spi.ScmConnector;
import org.eclipse.mylyn.versions.tests.support.MockRepositoryProvider;
import org.eclipse.mylyn.versions.tests.support.MockScmConnector;
@@ -38,4 +49,84 @@
Assert.fail("Expected MockScmConnector in " + connectors.toString());
}
+ @Test
+ public void testGetResource() throws Exception {
+ setupTestWorkspace();
+ IResource expectedResource = ResourcesPlugin.getWorkspace()
+ .getRoot()
+ .findMember("/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java");
+
+ assertEquals(expectedResource,
+ ScmCore.findResource("/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
+ assertEquals(expectedResource,
+ ScmCore.findResource("project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
+ }
+
+ @Test
+ public void testGetResourcePathChild() throws Exception {
+ setupTestWorkspace();
+ IResource expectedResource = ResourcesPlugin.getWorkspace()
+ .getRoot()
+ .findMember("/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java");
+
+ assertEquals(
+ expectedResource,
+ ScmCore.findResource("/root/level1/level2/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
+ assertEquals(
+ expectedResource,
+ ScmCore.findResource("root/level1/level2/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
+
+ }
+
+ @Test
+ public void testGetResourceFromProject() throws Exception {
+ setupTestWorkspace();
+ IResource expectedResource = ResourcesPlugin.getWorkspace()
+ .getRoot()
+ .findMember("/project2/src/org/eclipse/mylar/tests/project2/Project2Plugin.java");
+
+ assertEquals(expectedResource,
+ ScmCore.findResource("/src/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
+ assertEquals(expectedResource, ScmCore.findResource("src/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
+ }
+
+ @Test
+ public void testGetResourceCannotFind() throws Exception {
+ setupTestWorkspace();
+ assertNull(ScmCore.findResource("/project1/randompath"));
+ assertNull(ScmCore.findResource("/2/src/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
+ assertNull(ScmCore.findResource("/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
+ }
+
+ private void setupTestWorkspace() throws CoreException, ZipException, IOException {
+ setupProjectFromZipFile(ScmCoreTest.class, "project1", "project1.zip");
+ setupProjectFromZipFile(ScmCoreTest.class, "project2", "project2.zip");
+ }
+
+ private IProject setupProjectFromZipFile(Object source, String projectName, String zipFileName)
+ throws ZipException, IOException, CoreException {
+ IProject project = createTestProject(projectName);
+ ZipFile zip = new ZipFile(CommonTestUtil.getFile(source, "testdata/projects/" + zipFileName));
+
+ CommonTestUtil.unzip(zip, project.getLocation().toFile());
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ return project;
+ }
+
+ private IProject createTestProject(String projectName) throws CoreException {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IProject project = root.getProject(projectName);
+ if (!project.exists()) {
+ project.create(new NullProgressMonitor());
+ } else {
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ }
+
+ if (!project.isOpen()) {
+ project.open(new NullProgressMonitor());
+ }
+
+ return project;
+ }
+
}
diff --git a/org.eclipse.mylyn.versions.tests/testdata/projects/project1.zip b/org.eclipse.mylyn.versions.tests/testdata/projects/project1.zip
new file mode 100644
index 0000000..fdb0b93
--- /dev/null
+++ b/org.eclipse.mylyn.versions.tests/testdata/projects/project1.zip
Binary files differ
diff --git a/org.eclipse.mylyn.versions.tests/testdata/projects/project2.zip b/org.eclipse.mylyn.versions.tests/testdata/projects/project2.zip
new file mode 100644
index 0000000..280f4cf
--- /dev/null
+++ b/org.eclipse.mylyn.versions.tests/testdata/projects/project2.zip
Binary files differ