blob: 2954ad0e255499f557f8a405cef14664fcf8fdfe [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2013, François Rey <eclipse.org_@_francois_._rey_._name>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* François Rey - First implementation as part of handling linked resources
*******************************************************************************/
package org.eclipse.egit.core.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.Arrays;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
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.Path;
import org.eclipse.egit.core.GitProvider;
import org.eclipse.egit.core.IteratorService;
import org.eclipse.egit.core.RepositoryCache;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.WorkingTreeIterator;
import org.eclipse.team.core.RepositoryProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class LinkedResourcesTest {
TestUtils testUtils;
File project1Dir;
File project2Dir;
File otherFolder;
File rootFile;
TestRepository repository1;
TestRepository repository2;
String project1Name = "project1";
String project2Name = "project2";
IProject project1;
IProject project2;
GitResourceDeltaTestHelper resourceDeltaTestHelper1;
GitResourceDeltaTestHelper resourceDeltaTestHelper2;
@Before
public void setUp() throws Exception {
testUtils = new TestUtils();
// Create first repo and project
File rootDir = testUtils.createTempDir("FirstRepository");
project1 = testUtils.createProjectInLocalFileSystem(rootDir,
project1Name);
project1Dir = project1.getRawLocation().toFile();
otherFolder = new File(rootDir, "other_folder");
assertTrue(otherFolder.mkdirs());
File otherFile = new File(otherFolder, "otherFile.txt");
rootFile = new File(rootDir, "rootFile.txt");
Files.write(otherFile.toPath(),
Arrays.<String> asList("Hello", "otherFile"),
Charset.defaultCharset());
Files.write(rootFile.toPath(), Arrays.<String> asList("Hi", "rootFile"),
Charset.defaultCharset());
repository1 = new TestRepository(new File(rootDir,
Constants.DOT_GIT));
testUtils.addFileToProject(project1,
"project1folder1/project1folder1file1.txt", "Hello world");
repository1.connect(project1);
repository1.trackAllFiles(project1);
repository1.track(otherFile);
repository1.track(rootFile);
repository1.commit("Initial commit");
// Create 2nd repo and project
project2 = testUtils.createProjectInLocalFileSystem(project2Name);
project2Dir = project2.getRawLocation().toFile();
repository2 = new TestRepository(new File(project2Dir,
Constants.DOT_GIT));
testUtils.addFileToProject(project2,
"project2folder1/project2folder1file1.txt", "Hello world");
repository2.connect(project2);
repository2.trackAllFiles(project2);
repository2.commit("Initial commit");
// Set up git delta listener
resourceDeltaTestHelper1 = new GitResourceDeltaTestHelper(
repository1.getRepository());
resourceDeltaTestHelper1.setUp();
resourceDeltaTestHelper2 = new GitResourceDeltaTestHelper(
repository2.getRepository());
resourceDeltaTestHelper2.setUp();
}
@After
public void tearDown() throws Exception {
if (resourceDeltaTestHelper1 != null)
resourceDeltaTestHelper1.tearDown();
if (resourceDeltaTestHelper2 != null)
resourceDeltaTestHelper2.tearDown();
project1.delete(true, null);
project2.delete(true, null);
project1 = null;
project2 = null;
repository1.dispose();
repository2.dispose();
repository1 = null;
repository2 = null;
testUtils.deleteTempDirs();
testUtils = null;
RepositoryCache.INSTANCE.clear();
}
@Test
public void testGitProviderCanHandleLinkedResources() throws Exception {
GitProvider provider = (GitProvider) RepositoryProvider
.getProvider(project1);
assertTrue(provider.canHandleLinkedResourceURI());
}
@Test
public void testLinkedResourcesIgnoredByGitResourceDeltaVisitor()
throws Exception {
// Create linked folder in project1 that points to project2
IFolder folder = project1.getFolder("link2project2");
folder.createLink(project2.getLocation(), 0, null);
// Create linked file in project1 that points to a file in project2
IFile file = project1.getFile("link2project2folder1file1.txt");
file.createLink(
project2.getFile("project2folder1/project2folder1file1.txt")
.getLocation(), 0, null);
// Make sure linked folder is refreshed
folder.refreshLocal(IResource.DEPTH_INFINITE, null);
project2.getFile("project2folder1/project2folder1file1.txt")
.touch(null);
// Links are written to the .project file
resourceDeltaTestHelper1
.assertChangedResources(new String[] { "/project1/.project" });
// Changes to linked resources are reported against their repository
resourceDeltaTestHelper2.assertChangedResources(new String[] {
"/project2/project2folder1/project2folder1file1.txt" });
}
@Test
public void testLinkTargetsInSameRepositoryNotIgnoredByGitResourceDeltaVisitor()
throws Exception {
IFile file = project1.getFile("link2rootFile");
file.createLink(Path.fromOSString(rootFile.getAbsolutePath()), 0, null);
IFolder folder = project1.getFolder("link2otherFolder");
folder.createLink(Path.fromOSString(otherFolder.getAbsolutePath()), 0,
null);
project1.refreshLocal(IResource.DEPTH_INFINITE, null);
project1.getFile("link2rootFile").touch(null);
project1.getFile("link2otherFolder/otherFile.txt").touch(null);
resourceDeltaTestHelper1.assertChangedResources(
new String[] { "/project1/.project", "/project1/link2rootFile",
"/project1/link2otherFolder/otherFile.txt" });
}
@Test
public void testLinkedResourcesIgnoredByIteratorService() throws Exception {
// Create linked folder in project1 that points to project2
IFolder folder = project1.getFolder("link2project2");
folder.createLink(project2.getLocation(),
IResource.ALLOW_MISSING_LOCAL, null);
// Linked resources are ignored when searching the container of a folder
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IContainer container = IteratorService.findContainer(root, folder
.getRawLocation().makeAbsolute().toFile());
assertTrue(project2.equals(container));
// Also test when the only project left is the one linking to the folder
repository2.disconnect(project2);
container = IteratorService.findContainer(root, folder.getRawLocation()
.makeAbsolute().toFile());
assertNull(container);
}
@Test
public void testLinkedResourcesIgnoredByContainerTreeIterator()
throws Exception {
// Create linked folder in project1 that points to project2
IFolder folder = project1.getFolder("link2project2");
folder.createLink(project2.getLocation(),
IResource.ALLOW_MISSING_LOCAL, null);
// Create linked file in project1 that points to a file in project2
IFile file = project1.getFile("link2project2folder1file1.txt");
file.createLink(
project2.getFile("project2folder1/project2folder1file1.txt")
.getLocation(), IResource.ALLOW_MISSING_LOCAL, null);
// Test iterator
WorkingTreeIterator iterator = IteratorService
.createInitialIterator(repository1.getRepository());
assertTrue(iterator instanceof FileTreeIterator);
while (!iterator.eof()) {
assertFalse(iterator.getEntryPathString().startsWith("link2"));
iterator.next(1);
}
}
}