From d4eaa81e27f42f4ef68a7ff6935c0e2288fd3d31 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 24 Jan 2025 18:55:45 +0100 Subject: [PATCH] =?UTF-8?q?=D0=94=D1=80=D1=83=D0=B3=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=20=D1=80=D0=B0=D1=81=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20FilePath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/utils/FileUtils.groovy | 19 ++++++----- .../jenkins/library/utils/EnvUtils.java | 2 +- .../jenkins/library/utils/FileUtilsTest.java | 32 +++++++++++++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 test/unit/groovy/ru/pulsar/jenkins/library/utils/FileUtilsTest.java diff --git a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy index 721f6800..d64288df 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 629c6561..618fc8f3 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 @@ 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 00000000..99a6dd89 --- /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"); + } +}