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