Browse Source

Let FS_Win32_Cygwin detect symlink support by creating temporary symlink

The class FS_Win32 was always trying out to create a temporary symlink
in order to find out whether symlinks are supported. FS_Win32_Cygwin was
overwriting this method and always returned true. But when the user
running JGit does not have administrative rights then the creation of
symlinks is forbidden even if he is running on FS_Win32_Cygwin. A lot of
tests failed only on the Windows platform because of this. It was
correctly detected that FS_Win32_Cygwin is the filesystem abstraction to
be used but creation of symlinks always failed because of lacking
privileges of the user running the tests.

This fix teaches FS_Win32_Cygwin to behave like FS_Win32 and to test
whether symlinks can be created in order to find out whether symlinks
are supported.

Change-Id: Ie2394631ffc4c489bd37c3ec142ed44bbfcac726
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-4.3
Christian Halstrick 9 years ago committed by Matthias Sohn
parent
commit
18af2d4265
  1. 6
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
  2. 2
      org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorJava7Test.java
  3. 1
      org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/TreeWalkJava7Test.java
  4. 2
      org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSJava7Test.java
  5. 1
      org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtils7Test.java
  6. 5
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java

6
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java

@ -79,6 +79,7 @@ import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.FileUtils;
import org.junit.Assume;
import org.junit.Test; import org.junit.Test;
public class DirCacheCheckoutTest extends RepositoryTestCase { public class DirCacheCheckoutTest extends RepositoryTestCase {
@ -925,6 +926,7 @@ public class DirCacheCheckoutTest extends RepositoryTestCase {
@Test @Test
public void testCheckoutChangeLinkToEmptyDir() throws Exception { public void testCheckoutChangeLinkToEmptyDir() throws Exception {
Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
String fname = "was_file"; String fname = "was_file";
Git git = Git.wrap(db); Git git = Git.wrap(db);
@ -961,6 +963,7 @@ public class DirCacheCheckoutTest extends RepositoryTestCase {
@Test @Test
public void testCheckoutChangeLinkToEmptyDirs() throws Exception { public void testCheckoutChangeLinkToEmptyDirs() throws Exception {
Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
String fname = "was_file"; String fname = "was_file";
Git git = Git.wrap(db); Git git = Git.wrap(db);
@ -999,6 +1002,7 @@ public class DirCacheCheckoutTest extends RepositoryTestCase {
@Test @Test
public void testCheckoutChangeLinkToNonEmptyDirs() throws Exception { public void testCheckoutChangeLinkToNonEmptyDirs() throws Exception {
Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
String fname = "file"; String fname = "file";
Git git = Git.wrap(db); Git git = Git.wrap(db);
@ -1043,6 +1047,7 @@ public class DirCacheCheckoutTest extends RepositoryTestCase {
@Test @Test
public void testCheckoutChangeLinkToNonEmptyDirsAndNewIndexEntry() public void testCheckoutChangeLinkToNonEmptyDirsAndNewIndexEntry()
throws Exception { throws Exception {
Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
String fname = "file"; String fname = "file";
Git git = Git.wrap(db); Git git = Git.wrap(db);
@ -1364,6 +1369,7 @@ public class DirCacheCheckoutTest extends RepositoryTestCase {
@Test @Test
public void testOverwriteUntrackedLinkModeChange() public void testOverwriteUntrackedLinkModeChange()
throws Exception { throws Exception {
Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
String fname = "file.txt"; String fname = "file.txt";
Git git = Git.wrap(db); Git git = Git.wrap(db);

2
org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorJava7Test.java

@ -67,6 +67,7 @@ import org.junit.Test;
public class FileTreeIteratorJava7Test extends RepositoryTestCase { public class FileTreeIteratorJava7Test extends RepositoryTestCase {
@Test @Test
public void testFileModeSymLinkIsNotATree() throws IOException { public void testFileModeSymLinkIsNotATree() throws IOException {
org.junit.Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
FS fs = db.getFS(); FS fs = db.getFS();
// mål = target in swedish, just to get som unicode in here // mål = target in swedish, just to get som unicode in here
writeTrashFile("mål/data", "targetdata"); writeTrashFile("mål/data", "targetdata");
@ -163,6 +164,7 @@ public class FileTreeIteratorJava7Test extends RepositoryTestCase {
*/ */
@Test @Test
public void testSymlinkActuallyModified() throws Exception { public void testSymlinkActuallyModified() throws Exception {
org.junit.Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
final String NORMALIZED = "target"; final String NORMALIZED = "target";
final byte[] NORMALIZED_BYTES = Constants.encode(NORMALIZED); final byte[] NORMALIZED_BYTES = Constants.encode(NORMALIZED);
try (ObjectInserter oi = db.newObjectInserter()) { try (ObjectInserter oi = db.newObjectInserter()) {

1
org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/TreeWalkJava7Test.java

@ -55,6 +55,7 @@ import org.junit.Test;
public class TreeWalkJava7Test extends RepositoryTestCase { public class TreeWalkJava7Test extends RepositoryTestCase {
@Test @Test
public void testSymlinkToDirNotRecursingViaSymlink() throws Exception { public void testSymlinkToDirNotRecursingViaSymlink() throws Exception {
org.junit.Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
FS fs = db.getFS(); FS fs = db.getFS();
assertTrue(fs.supportsSymlinks()); assertTrue(fs.supportsSymlinks());
writeTrashFile("target/data", "targetdata"); writeTrashFile("target/data", "targetdata");

2
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSJava7Test.java

@ -57,6 +57,7 @@ import java.util.Set;
import org.eclipse.jgit.junit.RepositoryTestCase; import org.eclipse.jgit.junit.RepositoryTestCase;
import org.junit.After; import org.junit.After;
import org.junit.Assume;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -87,6 +88,7 @@ public class FSJava7Test {
*/ */
@Test @Test
public void testSymlinkAttributes() throws IOException, InterruptedException { public void testSymlinkAttributes() throws IOException, InterruptedException {
Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
FS fs = FS.DETECTED; FS fs = FS.DETECTED;
File link = new File(trash, "ä"); File link = new File(trash, "ä");
File target = new File(trash, "å"); File target = new File(trash, "å");

1
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtils7Test.java

@ -73,6 +73,7 @@ public class FileUtils7Test {
@Test @Test
public void testDeleteSymlinkToDirectoryDoesNotDeleteTarget() public void testDeleteSymlinkToDirectoryDoesNotDeleteTarget()
throws IOException { throws IOException {
org.junit.Assume.assumeTrue(FS.DETECTED.supportsSymlinks());
FS fs = FS.DETECTED; FS fs = FS.DETECTED;
File dir = new File(trash, "dir"); File dir = new File(trash, "dir");
File file = new File(dir, "file"); File file = new File(dir, "file");

5
org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java

@ -162,11 +162,6 @@ public class FS_Win32_Cygwin extends FS_Win32 {
errRedirect, stdinArgs); errRedirect, stdinArgs);
} }
@Override
public boolean supportsSymlinks() {
return true;
}
/** /**
* @since 3.7 * @since 3.7
*/ */

Loading…
Cancel
Save