private Repository createSubdirectoryCloneRepository(final OrganizationalUnit ou, final Repository legacyRepository, Entry<Partition, List<Module>> entry) { final Partition partition = entry.getKey(); final List<Module> modules = entry.getValue(); final String alias = modules.stream() .map(module -> module.getModuleName()) .findFirst() .orElse("migratedproject"); final RepositoryEnvironmentConfigurations configurations = subdirectoryCloneConfiguration(legacyRepository, partition, modules); Repository newRepository = repositoryService.createRepository(ou, GitRepository.SCHEME.toString(), alias, configurations); cleanupOrigin(newRepository); return newRepository; }
@Override public void migrate(final WorkspaceProject legacyWorkspaceProject) { Collection<Repository> newRepositories = copyModulesToRepositories(legacyWorkspaceProject); fireNewProjectEvents(newRepositories); }
private Collection<Repository> copyModulesToRepositories(WorkspaceProject legacyWorkspaceProject) { final OrganizationalUnit ou = legacyWorkspaceProject.getOrganizationalUnit(); final Repository legacyRepository = legacyWorkspaceProject.getRepository(); // Partition modules by root path (ignoring branch) and space. final Map<Partition, List<Module>> modulesByDirectory = getModulesByRootDirAndSpace(ou, legacyRepository); return modulesByDirectory.entrySet() .stream() .map(entry -> createSubdirectoryCloneRepository(ou, legacyRepository, entry)) .collect(toList()); }
when(pathUtil.getNiogitRepoPath(any())).thenReturn(NIOGIT_PATH); service = spy(new WorkspaceProjectMigrationServiceImpl(workspaceProjectService, repositoryService, organizationalUnitService, moduleService)); doAnswer(invocation -> null).when(service).cleanupOrigin(any(Repository.class)); service.migrate(legacyWorkspaceProject);
private RepositoryEnvironmentConfigurations subdirectoryCloneConfiguration(final Repository legacyRepository, final Partition root, final List<Module> modules) { final RepositoryEnvironmentConfigurations configurations = new RepositoryEnvironmentConfigurations(); configurations.setInit(false); configurations.setOrigin(getNiogitRepoPath(legacyRepository)); final String rootWithoutRepoAndSpace = root.branchlessPath.replaceFirst("^[^/]+/[^/]+/", ""); configurations.setSubdirectory(rootWithoutRepoAndSpace); configurations.setMirror(false); final List<String> branches = existingBranchesOf(modules); configurations.setBranches(branches); return configurations; }
@Test public void createOnlyTwoRepositories() throws Exception { verify(repositoryService, times(2)).createRepository(any(OrganizationalUnit.class), eq(GitRepository.SCHEME.toString()), anyString(), configsCaptor.capture()); final List<RepositoryEnvironmentConfigurations> allValues = configsCaptor.getAllValues(); final Set<String> observedSubdirectories = new HashSet<>(); allValues.forEach(configs -> { assertEquals(NIOGIT_PATH, assertInstanceOf(configs.getOrigin(), String.class)); assertFalse(assertInstanceOf(configs.getInit(), Boolean.class)); assertFalse(assertInstanceOf(configs.getMirror(), Boolean.class)); final String subdirectory = assertInstanceOf(configs.getSubdirectory(), String.class); observedSubdirectories.add(subdirectory); @SuppressWarnings("unchecked") final List<String> branches = assertInstanceOf(configs.getBranches(), List.class); final List<String> expectedBranches; if (subdirectory.equals("legacyProject1")) { expectedBranches = Arrays.asList("legacyMasterBranch", "legacyDevBranch"); } else if (subdirectory.equals("legacyProject2")) { expectedBranches = Arrays.asList("legacyDevBranch"); } else { throw new AssertionError("Unrecognized subdirectory: " + subdirectory); } verify(service,times(2)).cleanupOrigin(any()); assertEquals("Unexpected branches for subdirectory " + subdirectory, new HashSet<>(expectedBranches), new HashSet<>(branches)); }); assertEquals(new HashSet<>(Arrays.asList("legacyProject1", "legacyProject2")), observedSubdirectories); }
/** * @return Branches where all given modules exist. */ private List<String> existingBranchesOf(final List<Module> modules) { final List<String> branches = modules.stream() .flatMap(module -> { Optional<String> oBranch = getBranchName(pathUtil.convert(module.getRootPath())); if (oBranch.isPresent()) { return Stream.of(oBranch.get()); } else { return Stream.empty(); } }) .collect(toList()); return branches; }
when(pathUtil.getNiogitRepoPath(any())).thenReturn(NIOGIT_PATH); service = spy(new WorkspaceProjectMigrationServiceImpl(workspaceProjectService, repositoryService, organizationalUnitService, moduleService)); doAnswer(invocation -> null).when(service).cleanupOrigin(any(Repository.class)); service.migrate(legacyWorkspaceProject);
private RepositoryEnvironmentConfigurations subdirectoryCloneConfiguration(final Repository legacyRepository, final Partition root, final List<Module> modules) { final RepositoryEnvironmentConfigurations configurations = new RepositoryEnvironmentConfigurations(); configurations.setInit(false); configurations.setOrigin(getNiogitRepoPath(legacyRepository)); final String rootWithoutRepoAndSpace = root.branchlessPath.replaceFirst("^[^/]+/[^/]+/", ""); configurations.setSubdirectory(rootWithoutRepoAndSpace); configurations.setMirror(false); final List<String> branches = existingBranchesOf(modules); configurations.setBranches(branches); return configurations; }
@Test public void createOnlyTwoRepositories() throws Exception { verify(repositoryService, times(2)).createRepository(any(OrganizationalUnit.class), eq(GitRepository.SCHEME.toString()), anyString(), configsCaptor.capture()); final List<RepositoryEnvironmentConfigurations> allValues = configsCaptor.getAllValues(); final Set<String> observedSubdirectories = new HashSet<>(); allValues.forEach(configs -> { assertEquals(NIOGIT_PATH, assertInstanceOf(configs.getOrigin(), String.class)); assertFalse(assertInstanceOf(configs.getInit(), Boolean.class)); assertFalse(assertInstanceOf(configs.getMirror(), Boolean.class)); final String subdirectory = assertInstanceOf(configs.getSubdirectory(), String.class); observedSubdirectories.add(subdirectory); @SuppressWarnings("unchecked") final List<String> branches = assertInstanceOf(configs.getBranches(), List.class); final List<String> expectedBranches; if (subdirectory.equals("legacyProject1")) { expectedBranches = Arrays.asList("legacyMasterBranch", "legacyDevBranch"); } else if (subdirectory.equals("legacyProject2")) { expectedBranches = Arrays.asList("legacyDevBranch"); } else { throw new AssertionError("Unrecognized subdirectory: " + subdirectory); } verify(service,times(2)).cleanupOrigin(any()); assertEquals("Unexpected branches for subdirectory " + subdirectory, new HashSet<>(expectedBranches), new HashSet<>(branches)); }); assertEquals(new HashSet<>(Arrays.asList("legacyProject1", "legacyProject2")), observedSubdirectories); }
/** * @return Branches where all given modules exist. */ private List<String> existingBranchesOf(final List<Module> modules) { final List<String> branches = modules.stream() .flatMap(module -> { Optional<String> oBranch = getBranchName(pathUtil.convert(module.getRootPath())); if (oBranch.isPresent()) { return Stream.of(oBranch.get()); } else { return Stream.empty(); } }) .collect(toList()); return branches; }
private Repository createSubdirectoryCloneRepository(final OrganizationalUnit ou, final Repository legacyRepository, Entry<Partition, List<Module>> entry) { final Partition partition = entry.getKey(); final List<Module> modules = entry.getValue(); final String alias = modules.stream() .map(module -> module.getModuleName()) .findFirst() .orElse("migratedproject"); final RepositoryEnvironmentConfigurations configurations = subdirectoryCloneConfiguration(legacyRepository, partition, modules); Repository newRepository = repositoryService.createRepository(ou, GitRepository.SCHEME.toString(), alias, configurations); cleanupOrigin(newRepository); return newRepository; }
private Collection<Repository> copyModulesToRepositories(WorkspaceProject legacyWorkspaceProject) { final OrganizationalUnit ou = legacyWorkspaceProject.getOrganizationalUnit(); final Repository legacyRepository = legacyWorkspaceProject.getRepository(); // Partition modules by root path (ignoring branch) and space. final Map<Partition, List<Module>> modulesByDirectory = getModulesByRootDirAndSpace(ou, legacyRepository); return modulesByDirectory.entrySet() .stream() .map(entry -> createSubdirectoryCloneRepository(ou, legacyRepository, entry)) .collect(toList()); }
@Override public void migrate(final WorkspaceProject legacyWorkspaceProject) { Collection<Repository> newRepositories = copyModulesToRepositories(legacyWorkspaceProject); fireNewProjectEvents(newRepositories); }