From 1e1fd41bda60971f9bc9e52b835402244bde2220 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 13 Oct 2018 17:34:36 +0200 Subject: [PATCH] #994 fixed empty repository name on non bare repositories --- .../sonia/scm/repository/RepositoryUtil.java | 22 +++--- .../scm/repository/RepositoryUtilTest.java | 73 +++++++++++++++++++ 2 files changed, 82 insertions(+), 13 deletions(-) create mode 100644 scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java index 41b1b0aec5..e91722ebfe 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -237,23 +238,18 @@ public final class RepositoryUtil public static String getRepositoryName(File baseDirectory, File directory) throws IOException { - String name = null; String path = directory.getCanonicalPath(); - int directoryLength = baseDirectory.getCanonicalPath().length(); + String basePath = baseDirectory.getCanonicalPath(); - if (directoryLength < path.length()) - { - name = IOUtil.trimSeperatorChars(path.substring(directoryLength)); + Preconditions.checkArgument( + path.startsWith(basePath), + "repository path %s is not in the main repository path %s", path, basePath + ); - // replace windows path seperator - name = name.replaceAll("\\\\", "/"); - } - else if (logger.isWarnEnabled()) - { - logger.warn("path is shorter as the main repository path"); - } + String name = IOUtil.trimSeperatorChars(path.substring(basePath.length())); - return name; + // replace windows path seperator + return name.replaceAll("\\\\", "/"); } /** diff --git a/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java b/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java new file mode 100644 index 0000000000..a32a089181 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java @@ -0,0 +1,73 @@ +package sonia.scm.repository; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.io.File; +import java.io.IOException; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class RepositoryUtilTest { + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Mock + private AbstractRepositoryHandler repositoryHandler; + + private SimpleRepositoryConfig repositoryConfig; + + @Before + public void setUpMocks() { + repositoryConfig = new SimpleRepositoryConfig(); + when(repositoryHandler.getConfig()).thenReturn(repositoryConfig); + } + + @Test + public void testGetRepositoryName() throws IOException { + File repositoryTypeRoot = temporaryFolder.newFolder(); + repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); + + File repository = new File(repositoryTypeRoot, "abc"); + String name = RepositoryUtil.getRepositoryName(repositoryHandler, repository.getPath()); + assertEquals("abc", name); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetRepositoryNameWithInvalidPath() throws IOException { + File repositoryTypeRoot = temporaryFolder.newFolder(); + repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); + + File repository = new File("/etc/abc"); + String name = RepositoryUtil.getRepositoryName(repositoryHandler, repository.getPath()); + assertEquals("abc", name); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetRepositoryNameWithInvalidPathButSameLength() throws IOException { + File repositoryTypeRoot = temporaryFolder.newFolder(); + repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); + + File repository = new File(temporaryFolder.newFolder(), "abc"); + + String name = RepositoryUtil.getRepositoryName(repositoryHandler, repository.getPath()); + assertEquals("abc", name); + } + + @Test + public void testGetRepositoryNameWithSubDirectory() throws IOException { + File repositoryTypeRoot = temporaryFolder.newFolder(); + repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); + + File repository = new File(repositoryTypeRoot, "abc/123"); + String name = RepositoryUtil.getRepositoryName(repositoryHandler, repository.getPath()); + assertEquals("abc/123", name); + } +}