From ab62b121d7d071e71c86ae1f7f2ebc53105be37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 3 Jul 2019 08:16:08 +0200 Subject: [PATCH] Store repository id in svn config for each repository This is needed after migration from v1 to v2 and is done in SvnV1UpdateStep.java. --- .../sonia/scm/repository/SvnConfigHelper.java | 33 +++++++++++ .../scm/repository/SvnRepositoryHandler.java | 20 +------ .../sonia/scm/repository/SvnV1UpdateStep.java | 56 +++++++++++++++++++ 3 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfigHelper.java create mode 100644 scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnV1UpdateStep.java diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfigHelper.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfigHelper.java new file mode 100644 index 0000000000..ab01393b29 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfigHelper.java @@ -0,0 +1,33 @@ +package sonia.scm.repository; + +import sonia.scm.ContextEntry; +import sonia.scm.io.INIConfiguration; +import sonia.scm.io.INIConfigurationReader; +import sonia.scm.io.INIConfigurationWriter; +import sonia.scm.io.INISection; + +import java.io.File; +import java.io.IOException; + +class SvnConfigHelper { + + private static final String CONFIG_FILE_NAME = "scm-manager.conf"; + private static final String CONFIG_SECTION_SCMM = "scmm"; + private static final String CONFIG_KEY_REPOSITORY_ID = "repositoryid"; + + void writeRepositoryId(Repository repository, File directory) throws IOException { + INISection iniSection = new INISection(CONFIG_SECTION_SCMM); + iniSection.setParameter(CONFIG_KEY_REPOSITORY_ID, repository.getId()); + INIConfiguration iniConfiguration = new INIConfiguration(); + iniConfiguration.addSection(iniSection); + new INIConfigurationWriter().write(iniConfiguration, new File(directory, CONFIG_FILE_NAME)); + } + + String getRepositoryId(File directory) { + try { + return new INIConfigurationReader().read(new File(directory, CONFIG_FILE_NAME)).getSection(CONFIG_SECTION_SCMM).getParameter(CONFIG_KEY_REPOSITORY_ID); + } catch (IOException e) { + throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("Directory", directory.toString()), "could not read scm configuration file", e); + } + } +} diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index c32310e7e7..f3be47e0c2 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -46,11 +46,6 @@ import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.util.SVNDebugLog; -import sonia.scm.ContextEntry; -import sonia.scm.io.INIConfiguration; -import sonia.scm.io.INIConfigurationReader; -import sonia.scm.io.INIConfigurationWriter; -import sonia.scm.io.INISection; import sonia.scm.logging.SVNKitLogger; import sonia.scm.plugin.Extension; import sonia.scm.plugin.PluginLoader; @@ -87,9 +82,6 @@ public class SvnRepositoryHandler public static final RepositoryType TYPE = new RepositoryType(TYPE_NAME, TYPE_DISPLAYNAME, SvnRepositoryServiceProvider.COMMANDS); - private static final String CONFIG_FILE_NAME = "scm-manager.conf"; - private static final String CONFIG_SECTION_SCMM = "scmm"; - private static final String CONFIG_KEY_REPOSITORY_ID = "repositoryid"; private static final Logger logger = LoggerFactory.getLogger(SvnRepositoryHandler.class); @@ -223,18 +215,10 @@ public class SvnRepositoryHandler @Override protected void postCreate(Repository repository, File directory) throws IOException { - INISection iniSection = new INISection(CONFIG_SECTION_SCMM); - iniSection.setParameter(CONFIG_KEY_REPOSITORY_ID, repository.getId()); - INIConfiguration iniConfiguration = new INIConfiguration(); - iniConfiguration.addSection(iniSection); - new INIConfigurationWriter().write(iniConfiguration, new File(directory, CONFIG_FILE_NAME)); + new SvnConfigHelper().writeRepositoryId(repository, directory); } String getRepositoryId(File directory) { - try { - return new INIConfigurationReader().read(new File(directory, CONFIG_FILE_NAME)).getSection(CONFIG_SECTION_SCMM).getParameter(CONFIG_KEY_REPOSITORY_ID); - } catch (IOException e) { - throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("Directory", directory.toString()), "could not read scm configuration file", e); - } + return new SvnConfigHelper().getRepositoryId(directory); } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnV1UpdateStep.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnV1UpdateStep.java new file mode 100644 index 0000000000..fe96a7e945 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnV1UpdateStep.java @@ -0,0 +1,56 @@ +package sonia.scm.repository; + +import sonia.scm.migration.UpdateException; +import sonia.scm.migration.UpdateStep; +import sonia.scm.plugin.Extension; +import sonia.scm.update.UpdateStepRepositoryMetadataAccess; +import sonia.scm.version.Version; + +import javax.inject.Inject; +import java.io.IOException; +import java.nio.file.Path; + +import static sonia.scm.version.Version.parse; + +@Extension +public class SvnV1UpdateStep implements UpdateStep { + + private final RepositoryLocationResolver locationResolver; + private final UpdateStepRepositoryMetadataAccess repositoryMetadataAccess; + + @Inject + public SvnV1UpdateStep(RepositoryLocationResolver locationResolver, UpdateStepRepositoryMetadataAccess repositoryMetadataAccess) { + this.locationResolver = locationResolver; + this.repositoryMetadataAccess = repositoryMetadataAccess; + } + + @Override + public void doUpdate() { + locationResolver.forClass(Path.class).forAllLocations( + (repositoryId, path) -> { + Repository repository = repositoryMetadataAccess.read(path); + if (isSvnDirectory(repository)) { + try { + new SvnConfigHelper().writeRepositoryId(repository, path.toFile()); + } catch (IOException e) { + throw new UpdateException("could not update repository with id " + repositoryId + " in path " + path, e); + } + } + } + ); + } + + private boolean isSvnDirectory(Repository repository) { + return SvnRepositoryHandler.TYPE_NAME.equals(repository.getType()); + } + + @Override + public Version getTargetVersion() { + return parse("2.0.0"); + } + + @Override + public String getAffectedDataType() { + return "sonia.scm.plugin.svn"; + } +}