aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java
new file mode 100644
index 0000000000..5f6f344445
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2016, Google Inc. and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.gitrepo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.util.FS;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RepoCommandSymlinkTest extends RepositoryTestCase {
+ @Before
+ public void beforeMethod() {
+ // If this assumption fails the tests are skipped. When running on a
+ // filesystem not supporting symlinks I don't want this tests
+ org.junit.Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
+ }
+
+ private Repository defaultDb;
+
+ private String rootUri;
+ private String defaultUri;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ defaultDb = createWorkRepository();
+ try (Git git = new Git(defaultDb)) {
+ JGitTestUtil.writeTrashFile(defaultDb, "hello.txt", "hello world");
+ git.add().addFilepattern("hello.txt").call();
+ git.commit().setMessage("Initial commit").call();
+ addRepoToClose(defaultDb);
+ }
+
+ defaultUri = defaultDb.getDirectory().toURI().toString();
+ int root = defaultUri.lastIndexOf("/",
+ defaultUri.lastIndexOf("/.git") - 1)
+ + 1;
+ rootUri = defaultUri.substring(0, root)
+ + "manifest";
+ defaultUri = defaultUri.substring(root);
+ }
+
+ @Test
+ public void testLinkFileBare() throws Exception {
+ try (
+ Repository remoteDb = createBareRepository();
+ Repository tempDb = createWorkRepository()) {
+ StringBuilder xmlContent = new StringBuilder();
+ xmlContent
+ .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
+ .append("<manifest>")
+ .append("<remote name=\"remote1\" fetch=\".\" />")
+ .append("<default revision=\"master\" remote=\"remote1\" />")
+ .append("<project path=\"foo\" name=\"").append(defaultUri)
+ .append("\" revision=\"master\" >")
+ .append("<linkfile src=\"hello.txt\" dest=\"LinkedHello\" />")
+ .append("<linkfile src=\"hello.txt\" dest=\"foo/LinkedHello\" />")
+ .append("<linkfile src=\"hello.txt\" dest=\"subdir/LinkedHello\" />")
+ .append("</project>")
+ .append("<project path=\"bar/baz\" name=\"")
+ .append(defaultUri).append("\" revision=\"master\" >")
+ .append("<linkfile src=\"hello.txt\" dest=\"bar/foo/LinkedHello\" />")
+ .append("</project>").append("</manifest>");
+ JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
+ xmlContent.toString());
+ RepoCommand command = new RepoCommand(remoteDb);
+ command.setPath(
+ tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
+ .setURI(rootUri).call();
+ // Clone it
+ File directory = createTempDirectory("testCopyFileBare");
+ try (Repository localDb = Git.cloneRepository()
+ .setDirectory(directory)
+ .setURI(remoteDb.getDirectory().toURI().toString()).call()
+ .getRepository()) {
+
+ // The LinkedHello symlink should exist.
+ File linkedhello = new File(localDb.getWorkTree(),
+ "LinkedHello");
+ assertTrue("The LinkedHello file should exist",
+ localDb.getFS().exists(linkedhello));
+ assertTrue("The LinkedHello file should be a symlink",
+ localDb.getFS().isSymLink(linkedhello));
+ assertEquals("foo/hello.txt",
+ localDb.getFS().readSymLink(linkedhello));
+
+ // The foo/LinkedHello file should be skipped.
+ File linkedfoohello = new File(localDb.getWorkTree(),
+ "foo/LinkedHello");
+ assertFalse("The foo/LinkedHello file should be skipped",
+ localDb.getFS().exists(linkedfoohello));
+
+ // The subdir/LinkedHello file should use a relative ../
+ File linkedsubdirhello = new File(localDb.getWorkTree(),
+ "subdir/LinkedHello");
+ assertTrue("The subdir/LinkedHello file should exist",
+ localDb.getFS().exists(linkedsubdirhello));
+ assertTrue("The subdir/LinkedHello file should be a symlink",
+ localDb.getFS().isSymLink(linkedsubdirhello));
+ assertEquals("../foo/hello.txt",
+ localDb.getFS().readSymLink(linkedsubdirhello));
+
+ // The bar/foo/LinkedHello file should use a single relative ../
+ File linkedbarfoohello = new File(localDb.getWorkTree(),
+ "bar/foo/LinkedHello");
+ assertTrue("The bar/foo/LinkedHello file should exist",
+ localDb.getFS().exists(linkedbarfoohello));
+ assertTrue("The bar/foo/LinkedHello file should be a symlink",
+ localDb.getFS().isSymLink(linkedbarfoohello));
+ assertEquals("../baz/hello.txt",
+ localDb.getFS().readSymLink(linkedbarfoohello));
+ }
+ }
+ }
+}