diff --git a/build.gradle b/build.gradle index eb9caba..ecc647f 100755 --- a/build.gradle +++ b/build.gradle @@ -152,7 +152,7 @@ configurations { def deployer = uploadJni.repositories.mavenDeployer binaries.withType(SharedLibraryBinary) { binary -> - if (!buildable) { + if (!buildable || targetPlatform.operatingSystem.name == 'linux' && targetPlatform.architecture.name != System.properties['os.arch']) { return } diff --git a/src/main/java/net/rubygrapefruit/platform/PosixFile.java b/src/main/java/net/rubygrapefruit/platform/PosixFiles.java similarity index 96% rename from src/main/java/net/rubygrapefruit/platform/PosixFile.java rename to src/main/java/net/rubygrapefruit/platform/PosixFiles.java index 4141bcd..bde857d 100644 --- a/src/main/java/net/rubygrapefruit/platform/PosixFile.java +++ b/src/main/java/net/rubygrapefruit/platform/PosixFiles.java @@ -22,7 +22,7 @@ import java.io.File; * Functions to query and modify a file's POSIX meta-data. */ @ThreadSafe -public interface PosixFile extends NativeIntegration { +public interface PosixFiles extends NativeIntegration { /** * Sets the mode for the given file. * diff --git a/src/main/java/net/rubygrapefruit/platform/internal/DefaultPosixFile.java b/src/main/java/net/rubygrapefruit/platform/internal/DefaultPosixFiles.java similarity index 94% rename from src/main/java/net/rubygrapefruit/platform/internal/DefaultPosixFile.java rename to src/main/java/net/rubygrapefruit/platform/internal/DefaultPosixFiles.java index e920c67..0f91951 100755 --- a/src/main/java/net/rubygrapefruit/platform/internal/DefaultPosixFile.java +++ b/src/main/java/net/rubygrapefruit/platform/internal/DefaultPosixFiles.java @@ -17,12 +17,12 @@ package net.rubygrapefruit.platform.internal; import net.rubygrapefruit.platform.NativeException; -import net.rubygrapefruit.platform.PosixFile; +import net.rubygrapefruit.platform.PosixFiles; import net.rubygrapefruit.platform.internal.jni.PosixFileFunctions; import java.io.File; -public class DefaultPosixFile implements PosixFile { +public class DefaultPosixFiles implements PosixFiles { public void setMode(File file, int perms) { FunctionResult result = new FunctionResult(); PosixFileFunctions.chmod(file.getPath(), perms, result); @@ -41,7 +41,6 @@ public class DefaultPosixFile implements PosixFile { return stat.mode; } - @Override public String readLink(File link) throws NativeException { FunctionResult result = new FunctionResult(); String contents = PosixFileFunctions.readlink(link.getPath(), result); @@ -51,7 +50,6 @@ public class DefaultPosixFile implements PosixFile { return contents; } - @Override public void symlink(File link, String contents) throws NativeException { FunctionResult result = new FunctionResult(); PosixFileFunctions.symlink(link.getPath(), contents, result); diff --git a/src/main/java/net/rubygrapefruit/platform/internal/Platform.java b/src/main/java/net/rubygrapefruit/platform/internal/Platform.java index f2d5c06..7123c8b 100755 --- a/src/main/java/net/rubygrapefruit/platform/internal/Platform.java +++ b/src/main/java/net/rubygrapefruit/platform/internal/Platform.java @@ -137,8 +137,8 @@ public abstract class Platform { @Override public T get(Class type, NativeLibraryLoader nativeLibraryLoader) { - if (type.equals(PosixFile.class)) { - return type.cast(new DefaultPosixFile()); + if (type.equals(PosixFiles.class)) { + return type.cast(new DefaultPosixFiles()); } if (type.equals(Process.class)) { return type.cast(new WrapperProcess(new DefaultProcess(), false)); diff --git a/src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy b/src/test/groovy/net/rubygrapefruit/platform/PosixFilesTest.groovy similarity index 92% rename from src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy rename to src/test/groovy/net/rubygrapefruit/platform/PosixFilesTest.groovy index 630d058..5a4ff8f 100755 --- a/src/test/groovy/net/rubygrapefruit/platform/PosixFileTest.groovy +++ b/src/test/groovy/net/rubygrapefruit/platform/PosixFilesTest.groovy @@ -1,129 +1,129 @@ -/* - * Copyright 2012 Adam Murdoch - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.rubygrapefruit.platform - -import spock.lang.Specification -import org.junit.Rule -import org.junit.rules.TemporaryFolder -import spock.lang.IgnoreIf -import net.rubygrapefruit.platform.internal.Platform - -@IgnoreIf({Platform.current().windows}) -class PosixFileTest extends Specification { - @Rule TemporaryFolder tmpDir - final PosixFile file = Native.get(PosixFile.class) - - def "caches file instance"() { - expect: - Native.get(PosixFile.class) == file - } - - def "can set mode on a file"() { - def testFile = tmpDir.newFile(fileName) - - when: - file.setMode(testFile, 0740) - - then: - file.getMode(testFile) == 0740 - - where: - fileName << ["test.txt", "test\u03b1\u2295.txt"] - } - - def "cannot set mode on file that does not exist"() { - def testFile = new File(tmpDir.root, "unknown") - - when: - file.setMode(testFile, 0660) - - then: - NativeException e = thrown() - e.message == "Could not set UNIX mode on $testFile: could not chmod file (ENOENT errno 2)" - } - - def "cannot get mode on file that does not exist"() { - def testFile = new File(tmpDir.root, "unknown") - - when: - file.getMode(testFile) - - then: - NativeException e = thrown() - e.message == "Could not get UNIX mode on $testFile: could not stat file (ENOENT errno 2)" - } - - def "can create symbolic link"() { - def testFile = new File(tmpDir.root, "test.txt") - testFile.text = "hi" - def symlinkFile = new File(tmpDir.root, "symlink") - - when: - file.symlink(symlinkFile, testFile.name) - - then: - symlinkFile.file - symlinkFile.text == "hi" - symlinkFile.canonicalFile == testFile.canonicalFile - } - - def "can read symbolic link"() { - def symlinkFile = new File(tmpDir.root, "symlink") - - when: - file.symlink(symlinkFile, "target") - - then: - file.readLink(symlinkFile) == "target" - } - - def "cannot read a symlink that does not exist"() { - def symlinkFile = new File(tmpDir.root, "symlink") - - when: - file.readLink(symlinkFile) - - then: - NativeException e = thrown() - e.message == "Could not read symlink $symlinkFile: could not lstat file (ENOENT errno 2)" - } - - def "cannot read a symlink that is not a symlink"() { - def symlinkFile = tmpDir.newFile("not-a-symlink.txt") - - when: - file.readLink(symlinkFile) - - then: - NativeException e = thrown() - e.message == "Could not read symlink $symlinkFile: could not readlink (errno 22)" - } - - def "can create and read symlink with unicode in its name"() { - def testFile = new File(tmpDir.root, "target\u03b2\u2295") - testFile.text = 'hi' - def symlinkFile = new File(tmpDir.root, "symlink\u03b2\u2296") - - when: - file.symlink(symlinkFile, testFile.name) - - then: - file.readLink(symlinkFile) == testFile.name - symlinkFile.file - symlinkFile.canonicalFile == testFile.canonicalFile - } -} +/* + * Copyright 2012 Adam Murdoch + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.rubygrapefruit.platform + +import spock.lang.Specification +import org.junit.Rule +import org.junit.rules.TemporaryFolder +import spock.lang.IgnoreIf +import net.rubygrapefruit.platform.internal.Platform + +@IgnoreIf({Platform.current().windows}) +class PosixFilesTest extends Specification { + @Rule TemporaryFolder tmpDir + final PosixFiles file = Native.get(PosixFiles.class) + + def "caches file instance"() { + expect: + Native.get(PosixFiles.class) == file + } + + def "can set mode on a file"() { + def testFile = tmpDir.newFile(fileName) + + when: + file.setMode(testFile, 0740) + + then: + file.getMode(testFile) == 0740 + + where: + fileName << ["test.txt", "test\u03b1\u2295.txt"] + } + + def "cannot set mode on file that does not exist"() { + def testFile = new File(tmpDir.root, "unknown") + + when: + file.setMode(testFile, 0660) + + then: + NativeException e = thrown() + e.message == "Could not set UNIX mode on $testFile: could not chmod file (ENOENT errno 2)" + } + + def "cannot get mode on file that does not exist"() { + def testFile = new File(tmpDir.root, "unknown") + + when: + file.getMode(testFile) + + then: + NativeException e = thrown() + e.message == "Could not get UNIX mode on $testFile: could not stat file (ENOENT errno 2)" + } + + def "can create symbolic link"() { + def testFile = new File(tmpDir.root, "test.txt") + testFile.text = "hi" + def symlinkFile = new File(tmpDir.root, "symlink") + + when: + file.symlink(symlinkFile, testFile.name) + + then: + symlinkFile.file + symlinkFile.text == "hi" + symlinkFile.canonicalFile == testFile.canonicalFile + } + + def "can read symbolic link"() { + def symlinkFile = new File(tmpDir.root, "symlink") + + when: + file.symlink(symlinkFile, "target") + + then: + file.readLink(symlinkFile) == "target" + } + + def "cannot read a symlink that does not exist"() { + def symlinkFile = new File(tmpDir.root, "symlink") + + when: + file.readLink(symlinkFile) + + then: + NativeException e = thrown() + e.message == "Could not read symlink $symlinkFile: could not lstat file (ENOENT errno 2)" + } + + def "cannot read a symlink that is not a symlink"() { + def symlinkFile = tmpDir.newFile("not-a-symlink.txt") + + when: + file.readLink(symlinkFile) + + then: + NativeException e = thrown() + e.message == "Could not read symlink $symlinkFile: could not readlink (errno 22)" + } + + def "can create and read symlink with unicode in its name"() { + def testFile = new File(tmpDir.root, "target\u03b2\u2295") + testFile.text = 'hi' + def symlinkFile = new File(tmpDir.root, "symlink\u03b2\u2296") + + when: + file.symlink(symlinkFile, testFile.name) + + then: + file.readLink(symlinkFile) == testFile.name + symlinkFile.file + symlinkFile.canonicalFile == testFile.canonicalFile + } +}