diff --git a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy index 721f680..d64288d 100644 --- a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy +++ b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy @@ -29,17 +29,20 @@ class FileUtils { static String getLocalPath(FilePath filePath) { IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + String workspacePath = steps.env().WORKSPACE + String fileRemotePath = filePath.getRemote() - def env = steps.env(); + // Нормализуем пути: заменяем обратные слэши на прямые + workspacePath = workspacePath.replace('\\', '/') + fileRemotePath = fileRemotePath.replace('\\', '/') - Path workspacePath = new File(env.WORKSPACE).toPath() - Path rawFilePath = new File(filePath.getRemote()).toPath() + // Проверяем, что файл находится внутри рабочей директории + if (!fileRemotePath.startsWith(workspacePath)) { + throw new IllegalArgumentException("File path is not within the workspace directory") + } - return workspacePath.relativize(rawFilePath) - .toString() - .replaceAll('\\\\\\\\', '/') - .replaceAll('\\\\', '/') - .toString() + // Вычисляем относительный путь + return fileRemotePath.substring(workspacePath.length() + 1) } static void loadFile(String filePathFrom, def env, String filePathTo) { diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java b/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java index 629c656..618fc8f 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java @@ -7,7 +7,7 @@ import java.io.IOException; public class EnvUtils implements EnvironmentAction { - public String NODE_NAME = "node"; + public String NODE_NAME = "built-in"; public String WORKSPACE = "ws"; public String BRANCH_NAME = "master"; diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/utils/FileUtilsTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/utils/FileUtilsTest.java new file mode 100644 index 0000000..99a6dd8 --- /dev/null +++ b/test/unit/groovy/ru/pulsar/jenkins/library/utils/FileUtilsTest.java @@ -0,0 +1,32 @@ +package ru.pulsar.jenkins.library.utils; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import ru.pulsar.jenkins.library.IStepExecutor; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +class FileUtilsTest { + + private final IStepExecutor steps = TestUtils.getMockedStepExecutor(); + + @BeforeEach + void setUp() { + TestUtils.setupMockedContext(steps); + } + + @Test + void testGetLocalPath() { + // given + var env = new EnvUtils(); + when(steps.env()).thenReturn(env); + var filePath = FileUtils.getFilePath(env.WORKSPACE + "/src/cf"); + + // when + String localPath = FileUtils.getLocalPath(filePath); + + // then + assertThat(localPath).isEqualTo("src/cf"); + } +}