Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix windows breaking paths #317

Merged
merged 5 commits into from
Dec 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/main/java/tech/jhipster/lite/common/domain/FileUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Expand All @@ -19,6 +20,7 @@
public class FileUtils {

private static final Logger log = LoggerFactory.getLogger(FileUtils.class);
private static final String FILE_SEPARATOR = "/";

private FileUtils() {}

Expand All @@ -43,15 +45,15 @@ public static String tmpDirForTest() {
}

public static String getPath(String... paths) {
return String.join(File.separator, paths).replaceAll("/", File.separator).replaceAll("\\\\", File.separator);
return String.join(FILE_SEPARATOR, paths).replaceAll("\\\\", FILE_SEPARATOR);
}

public static Path getPathOf(String... paths) {
return Path.of(getPath(paths));
}

public static InputStream getInputStream(String... paths) {
InputStream in = FileUtils.class.getResourceAsStream(File.separator + getPath(paths));
InputStream in = FileUtils.class.getResourceAsStream(FILE_SEPARATOR + getPath(paths));
if (in == null) {
throw new GeneratorException("File not found in classpath");
}
Expand Down Expand Up @@ -118,4 +120,8 @@ public static String replaceInFile(String filename, String regexp, String replac
public static String replace(String text, String regexp, String replacement) {
return Pattern.compile(regexp).matcher(text).replaceAll(replacement);
}

public static boolean isPosix() {
return FileSystems.getDefault().supportedFileAttributeViews().contains("posix");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public Optional<String> getPackageName() {
}

public Optional<String> getPackageNamePath() {
return getPackageName().map(packageName -> packageName.replaceAll("\\.", File.separator));
return getPackageName().map(packageName -> packageName.replaceAll("\\.", "/"));
}

public Optional<String> getStringConfig(String key) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
Expand Down Expand Up @@ -113,6 +114,9 @@ public void write(Project project, String text, String destination, String desti

@Override
public void setExecutable(Project project, String source, String sourceFilename) {
if (!FileUtils.isPosix()) {
return;
}
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);
Expand All @@ -124,7 +128,6 @@ public void setExecutable(Project project, String source, String sourceFilename)

perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);

File file = new File(getPath(project.getFolder(), source, sourceFilename));
try {
Files.setPosixFilePermissions(file.toPath(), perms);
Expand Down
24 changes: 22 additions & 2 deletions src/test/java/tech/jhipster/lite/common/domain/FileUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static tech.jhipster.lite.TestUtils.assertFileNotExist;
import static tech.jhipster.lite.common.domain.FileUtils.getPath;
import static tech.jhipster.lite.common.domain.FileUtils.isPosix;

import java.io.File;
import java.io.IOException;
Expand All @@ -15,6 +16,9 @@
import java.util.List;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;
import tech.jhipster.lite.UnitTest;
import tech.jhipster.lite.error.domain.GeneratorException;
import tech.jhipster.lite.error.domain.MissingMandatoryValueException;
Expand Down Expand Up @@ -98,7 +102,7 @@ class GetPath {
void shouldGetPath() {
String result = getPath("chips", "beer");

assertThat(result).isEqualTo("chips" + File.separator + "beer");
assertThat(result).isEqualTo("chips/beer");
}

@Test
Expand All @@ -112,7 +116,7 @@ void shouldGetPathForLinux() {
void shouldGetPathForWindows() {
String result = getPath("C:\\chips\\beer");

assertThat(result).isEqualTo("C:" + File.separator + "chips" + File.separator + "beer");
assertThat(result).isEqualTo("C:/chips/beer");
}

@Test
Expand Down Expand Up @@ -324,4 +328,20 @@ void shouldNotReplaceInFileWhenFileNotExist() {
.isInstanceOf(IOException.class);
}
}

@Nested
class FileSystem {

@Test
@EnabledOnOs(OS.WINDOWS)
void shouldReturnPosixFalseForWindows() {
assertFalse(isPosix());
}

@Test
@DisabledOnOs(OS.WINDOWS)
void shouldReturnPosixTrueForNonWindows() {
assertTrue(isPosix());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.common.domain.FileUtils.getPath;
import static tech.jhipster.lite.common.domain.FileUtils.getPathOf;
import static tech.jhipster.lite.common.domain.FileUtils.*;
import static tech.jhipster.lite.generator.project.domain.Constants.MAIN_RESOURCES;
import static tech.jhipster.lite.generator.project.domain.Constants.TEST_TEMPLATE_RESOURCES;

Expand Down Expand Up @@ -211,6 +212,21 @@ void shouldNotWriteWhenDestinationCantBeCreated() {
.isExactlyInstanceOf(GeneratorException.class);
}

@Test
void shouldNotSetExecutableForNonPosix() {
Project project = tmpProjectWithPomXml();
try (
MockedStatic<FileUtils> fileUtilsMock = Mockito.mockStatic(FileUtils.class);
MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class)
) {
fileUtilsMock.when(() -> FileUtils.getPath(Mockito.any(String.class))).thenReturn(project.getFolder());
fileUtilsMock.when(FileUtils::isPosix).thenReturn(false);

repository.setExecutable(project, "", "pom.xml");
filesMock.verify(() -> Files.setPosixFilePermissions(Mockito.any(), Mockito.any()), never());
}
}

@Test
void shouldSetExecutable() throws IOException {
Project project = tmpProjectWithPomXml();
Expand Down