aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandSymlinkTest.java
blob: 5f6f344445f15966566ea37e2ca4a72feb7079a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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));
			}
		}
	}
}