diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java index 9f79287a19..813d42818f 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java @@ -4,6 +4,7 @@ import com.google.inject.Injector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.SCMContextProvider; +import sonia.scm.migration.UpdateException; import sonia.scm.migration.UpdateStep; import sonia.scm.plugin.Extension; import sonia.scm.repository.Repository; @@ -22,10 +23,11 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -100,10 +102,23 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { v1Database -> { v1Database.repositoryList.repositories.forEach(this::readMigrationStrategy); v1Database.repositoryList.repositories.forEach(this::update); + backupOldRepositoriesFile(); } ); } + private void backupOldRepositoriesFile() { + Path configDir = contextProvider.getBaseDirectory().toPath().resolve(StoreConstants.CONFIG_DIRECTORY_NAME); + Path oldRepositoriesFile = configDir.resolve("repositories.xml"); + Path backupFile = configDir.resolve("repositories.xml.v1.backup"); + LOG.info("moving old repositories database files to backup file {}", backupFile); + try { + Files.move(oldRepositoriesFile, backupFile); + } catch (IOException e) { + throw new UpdateException("could not backup old repository database file", e); + } + } + private void update(V1Repository v1Repository) { Path destination = handleDataDirectory(v1Repository); Repository repository = new Repository( diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java index 8c0f4bb103..773d7bd447 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java @@ -9,7 +9,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; import org.mockito.ArgumentCaptor; import org.mockito.Captor; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -190,10 +189,18 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldFailForMissingMigrationStrategy() throws JAXBException { + void shouldFailForMissingMigrationStrategy() { lenient().when(migrationStrategyDao.get("c1597b4f-a9f0-49f7-ad1f-37d3aae1c55f")).thenReturn(empty()); assertThrows(IllegalStateException.class, () -> updateStep.doUpdate()); } + + @Test + void shouldBackupOldRepositoryDatabaseFile(@TempDirectory.TempDir Path tempDir) throws JAXBException { + updateStep.doUpdate(); + + assertThat(tempDir.resolve("config").resolve("repositories.xml")).doesNotExist(); + assertThat(tempDir.resolve("config").resolve("repositories.xml.v1.backup")).exists(); + } } @Test @@ -202,12 +209,27 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldNotFailIfFormerV1DatabaseExists(@TempDirectory.TempDir Path tempDir) throws JAXBException, IOException { + void shouldNotFailIfFormerV2DatabaseExists(@TempDirectory.TempDir Path tempDir) throws JAXBException, IOException { + createFormerV2RepositoriesFile(tempDir); + + updateStep.doUpdate(); + } + + @Test + void shouldNotBackupFormerV2DatabaseFile(@TempDirectory.TempDir Path tempDir) throws JAXBException, IOException { + createFormerV2RepositoriesFile(tempDir); + + updateStep.doUpdate(); + + assertThat(tempDir.resolve("config").resolve("repositories.xml")).exists(); + assertThat(tempDir.resolve("config").resolve("repositories.xml.v1.backup")).doesNotExist(); + } + + private void createFormerV2RepositoriesFile(@TempDirectory.TempDir Path tempDir) throws IOException { URL url = Resources.getResource("sonia/scm/repository/update/formerV2RepositoryFile.xml"); Path configDir = tempDir.resolve("config"); Files.createDirectories(configDir); Files.copy(url.openStream(), configDir.resolve("repositories.xml")); - updateStep.doUpdate(); } private Optional findByNamespace(String namespace) {