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 db09d23e79..49eeb7c342 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -246,11 +246,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { public Repository rename(Repository repository, String newNamespace, String newName) { - if (!configuration.getNamespaceStrategy().equals("CustomNamespaceStrategy") - && !repository.getNamespace().equals(newNamespace)) { - throw new ChangeNamespaceNotAllowedException(repository); - } - if (hasNamespaceOrNameNotChanged(repository, newNamespace, newName)) { throw new NoChangesMadeException(repository); } @@ -259,8 +254,13 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { if (!Strings.isNullOrEmpty(newName)) { changedRepository.setName(newName); } - if (!Strings.isNullOrEmpty(newNamespace)) { - changedRepository.setNamespace(newNamespace); + + if (!Strings.isNullOrEmpty(newNamespace) && !repository.getNamespace().equals(newNamespace)) { + NamespaceStrategy strategy = namespaceStrategyProvider.get(); + if (!strategy.canBeChanged()) { + throw new ChangeNamespaceNotAllowedException(repository); + } + changedRepository.setNamespace(strategy.createNamespace(changedRepository)); } managerDaoAdapter.modify( 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 26299a04a8..9a49d86bc9 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -79,7 +79,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -108,6 +107,8 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { @Rule public ExpectedException thrown = ExpectedException.none(); + private NamespaceStrategy namespaceStrategy = mock(NamespaceStrategy.class); + private ScmConfiguration configuration; private String mockedNamespace = "default_namespace"; @@ -390,6 +391,8 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { public void shouldThrowChangeNamespaceNotAllowedException() { Repository repository = new Repository("1", "hg", "space", "x"); RepositoryManager repoManager = createManager(); + when(namespaceStrategy.canBeChanged()).thenReturn(false); + thrown.expect(ChangeNamespaceNotAllowedException.class); repoManager.rename(repository, "hitchhiker", "heart-of-gold"); @@ -397,7 +400,6 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { @Test public void shouldThrowNoChangesMadeException() { - configuration.setNamespaceStrategy("CustomNamespaceStrategy"); Repository repository = new Repository("1", "hg", "space", "x"); RepositoryManager repoManager = createManager(); @@ -410,7 +412,6 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { public void shouldOnlyChangeRepositoryName() { Repository repository = createTestRepository(); RepositoryManager repoManager = (RepositoryManager) manager; - configuration.setNamespaceStrategy("UsernameNamespaceStrategy"); Repository changedRepo = repoManager.rename(repository, "default_namespace", "puzzle42"); assertNotEquals(changedRepo.getName(), repository.getName()); @@ -420,11 +421,12 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { public void shouldRenameRepositoryNamespaceAndName() { Repository repository = createTestRepository(); RepositoryManager repoManager = (RepositoryManager) manager; - configuration.setNamespaceStrategy("CustomNamespaceStrategy"); + when(namespaceStrategy.canBeChanged()).thenReturn(true); + when(namespaceStrategy.createNamespace(any(Repository.class))).thenReturn("hitchhiker"); Repository changedRepo = repoManager.rename(repository, "hitchhiker", "puzzle42"); - assertNotEquals(changedRepo.getName(), repository.getName()); - assertNotEquals(changedRepo.getNamespace(), repository.getNamespace()); + assertEquals("puzzle42", changedRepo.getName()); + assertEquals("hitchhiker", changedRepo.getNamespace()); } //~--- methods -------------------------------------------------------------- @@ -445,7 +447,6 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { this.configuration = new ScmConfiguration(); - NamespaceStrategy namespaceStrategy = mock(NamespaceStrategy.class); when(namespaceStrategy.createNamespace(Mockito.any(Repository.class))).thenAnswer(invocation -> mockedNamespace); return new DefaultRepositoryManager(configuration, contextProvider,