Use simple executable check from old java io

This commit is contained in:
Rene Pfeuffer
2020-02-27 13:13:09 +01:00
parent 9c75ff95c8
commit 9b7d5daae3
2 changed files with 6 additions and 47 deletions

View File

@@ -12,13 +12,8 @@ import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Optional;
import java.util.Set;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.util.Optional.empty;
import static java.util.Optional.of;
import static sonia.scm.AlreadyExistsException.alreadyExists;
import static sonia.scm.ContextEntry.ContextBuilder.entity;
import static sonia.scm.NotFoundException.notFound;
@@ -66,34 +61,14 @@ public interface ModifyWorkerHelper extends ModifyCommand.Worker {
if (!targetFile.toFile().exists()) {
throw notFound(createFileContext(path));
}
Optional<Set<PosixFilePermission>> posixFilePermissions = getPosixFilePermissions(targetFile);
boolean executable = Files.isExecutable(targetFile);
Files.move(file.toPath(), targetFile, REPLACE_EXISTING);
posixFilePermissions.ifPresent(permissions -> setPosixFilePermissions(targetFile, permissions));
if (targetFile.toFile().setExecutable(executable)) {
LOG.warn("could not set executable flag for file {}", targetFile);
}
addFileToScm(path, targetFile);
}
default Optional<Set<PosixFilePermission>> getPosixFilePermissions(Path targetFile) {
try {
return of(Files.getPosixFilePermissions(targetFile));
} catch (UnsupportedOperationException e) {
LOG.trace("posix file permissions not supported");
return empty();
} catch (IOException e) {
LOG.info("could not read posix file permissions for file {}", targetFile);
return empty();
}
}
default void setPosixFilePermissions(Path targetFile, Set<PosixFilePermission> permissions) {
try {
Files.setPosixFilePermissions(targetFile, permissions);
} catch (UnsupportedOperationException e) {
LOG.trace("posix file permissions not supported");
} catch (IOException e) {
LOG.info("could not write posix file permissions to file {}", targetFile);
}
}
void addFileToScm(String name, Path file);
default ContextEntry.ContextBuilder createFileContext(String path) {

View File

@@ -1,7 +1,5 @@
package sonia.scm.repository.spi;
import com.google.common.collect.ImmutableSet;
import org.assertj.core.api.Assumptions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junitpioneer.jupiter.TempDirectory;
@@ -10,16 +8,8 @@ import sonia.scm.repository.Repository;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static java.nio.file.attribute.PosixFilePermission.GROUP_EXECUTE;
import static java.nio.file.attribute.PosixFilePermission.GROUP_READ;
import static java.nio.file.attribute.PosixFilePermission.OTHERS_EXECUTE;
import static java.nio.file.attribute.PosixFilePermission.OTHERS_READ;
import static java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE;
import static java.nio.file.attribute.PosixFilePermission.OWNER_READ;
import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;
import static org.assertj.core.api.Assertions.assertThat;
@ExtendWith(TempDirectory.class)
@@ -31,19 +21,13 @@ class ModifyWorkerHelperTest {
File target = createFile(temp, "executable.sh");
File newFile = createFile(temp, "other");
Assumptions.assumeThatThrownBy(() -> {
Files.setPosixFilePermissions(target.toPath(),
ImmutableSet.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_EXECUTE, OTHERS_READ, OTHERS_EXECUTE));
Files.setPosixFilePermissions(newFile.toPath(),
ImmutableSet.of(OWNER_READ, OWNER_WRITE, GROUP_READ, OTHERS_READ));
}).doesNotThrowAnyException(); // ignore this test on systems that does not support posix file permissions
target.setExecutable(true);
ModifyWorkerHelper helper = new MinimalModifyWorkerHelper(temp);
helper.modify("executable.sh", newFile);
assertThat(Files.getPosixFilePermissions(target.toPath()))
.contains(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_EXECUTE, OTHERS_READ, OTHERS_EXECUTE);
assertThat(target.canExecute()).isTrue();
}
private File createFile(Path temp, String fileName) throws IOException {