diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java
index 85704a611a..d806b5526f 100644
--- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java
+++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java
@@ -82,7 +82,10 @@ public class GitRepositoryHandler
/** Field description */
public static final String TYPE_NAME = "git";
-
+
+
+ public static final String DOT_GIT = ".git";
+
private static final Logger logger = LoggerFactory.getLogger(GitRepositoryHandler.class);
/** Field description */
diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java
index bbe4f80115..5369ee1c11 100644
--- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java
+++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java
@@ -35,6 +35,7 @@ package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
@@ -972,24 +973,45 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
}
/**
- * Method description
+ * This method checks whether or not the provided path belongs to the provided repository.
*
- *
- * @param repository
- * @param path
- *
- * @return
+ * @param repository The repository to be tested.
+ * @param path The path that might be part of the repository.
+ * @return Returns true if path belongs to the repository. Returns false otherwise.
*/
- private boolean isNameMatching(Repository repository, String path)
- {
+ private boolean isNameMatching(Repository repository, String path) {
+ return isNameMatching(repository.getType(), repository.getName(), path);
+ }
+
+ /**
+ * This method checks whether or not the provided path belongs to the provided repository.
+ *
+ * @param repositoryType The type of the repository being tested.
+ * @param repositoryName The name of the repository being tested.
+ * @param path The path that might be part of the repository.
+ * @return Returns true if path belongs to the repository. Returns false otherwise.
+ */
+ @VisibleForTesting
+ boolean isNameMatching(String repositoryType, String repositoryName, String path) {
boolean result = false;
- String name = repository.getName();
- if (path.startsWith(name))
- {
- String sub = path.substring(name.length());
+ if (path.startsWith(repositoryName)) {
+
+ String pathPart = path.substring(repositoryName.length());
+
+ //TODO: this introduces a strong coupling to the git plugin. This can be resolved with a "Repository Matcher" API.
+ //ausformulieren, ticketId weg
+ if (GitRepositoryHandler.TYPE_NAME.equals(repositoryType)) {
+
+ //git repository may also be named <>.git by convention
+ if (pathPart.startsWith(GitRepositoryHandler.DOT_GIT)) {
+ //if this is the case, just also cut it away
+ pathPart = pathPart.substring(GitRepositoryHandler.DOT_GIT.length());
+ }
+ }
+
+ result = Util.isEmpty(pathPart) || pathPart.startsWith(HttpUtil.SEPARATOR_PATH);
- result = Util.isEmpty(sub) || sub.startsWith(HttpUtil.SEPARATOR_PATH);
}
return result;
diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java
index 28fa3f862c..7b7c304230 100644
--- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java
+++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java
@@ -46,6 +46,7 @@ import sonia.scm.security.DefaultKeyGenerator;
import sonia.scm.store.JAXBStoreFactory;
import sonia.scm.store.StoreFactory;
+import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@@ -92,6 +93,29 @@ public class DefaultRepositoryManagerTest extends RepositoryManagerTestBase
assertNull(m.getFromUri("/git/project1/test-3/ka/some/path"));
}
+ @Test
+ public void testNameIsMatching() throws Exception {
+ DefaultRepositoryManager m = createManager();
+
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "repo-name"), is(true));
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "repo-name/"), is(true));
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "repo-name/and-more-is-valid"), is(true));
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "repo-name.git/and-more-is-valid"),
+ is(true));
+
+
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "not-the-name"), is(false));
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "repo-na"), is(false));
+
+ assertThat(m.isNameMatching(GitRepositoryHandler.TYPE_NAME, "repo-name", "/repo-name/"), is(false));
+
+ assertThat(m.isNameMatching(HgRepositoryHandler.TYPE_NAME, "repo-name", "repo-name.git/and-more-is-valid"),
+ is(false));
+ assertThat(m.isNameMatching(SvnRepositoryHandler.TYPE_NAME, "repo-name", "repo-name.git/and-more-is-valid"),
+ is(false));
+
+ }
+
//~--- methods --------------------------------------------------------------
/**