diff --git a/gradle/changelog/svn_mirror_update.yaml b/gradle/changelog/svn_mirror_update.yaml new file mode 100644 index 0000000000..b51038f675 --- /dev/null +++ b/gradle/changelog/svn_mirror_update.yaml @@ -0,0 +1,2 @@ +- type: Fixed + description: Fix svn mirror update if first initialization failed before ([#1745](https://github.com/scm-manager/scm-manager/pull/1745)) diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnMirrorCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnMirrorCommand.java index d0d1c94ccd..cb47e21966 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnMirrorCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnMirrorCommand.java @@ -85,7 +85,7 @@ public class SvnMirrorCommand extends AbstractSvnCommand implements MirrorComman SVNURL url = createUrlForLocalRepository(); SVNAdminClient admin = createAdminClient(url, mirrorCommandRequest); - consumer.accept(admin); + handleConsumer(mirrorCommandRequest, consumer, url, admin); afterUpdate = context.open().getLatestRevision(); } catch (SVNException e) { LOG.info("Could not mirror svn repository", e); @@ -104,6 +104,19 @@ public class SvnMirrorCommand extends AbstractSvnCommand implements MirrorComman ); } + private void handleConsumer(MirrorCommandRequest mirrorCommandRequest, AdminConsumer consumer, SVNURL url, SVNAdminClient admin) throws SVNException { + try { + consumer.accept(admin); + } catch (SVNException e) { + if (e.getMessage().equals("svn: E204899: Destination repository has not been initialized")) { + SVNURL source = SVNURL.parseURIEncoded(mirrorCommandRequest.getSourceUrl()); + admin.doCompleteSynchronize(source, url); + } else { + throw e; + } + } + } + private SVNURL createUrlForLocalRepository() { try { return SVNURL.fromFile(context.getDirectory()); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java index 93dd81b998..14088e848d 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java @@ -82,6 +82,14 @@ public class SvnMirrorCommandTest extends AbstractSvnCommandTestBase { assertThat(result.getLog()).contains("Updated from revision 0 to revision 5"); } + @Test + public void shouldDoMirrorUpdateOnNotInitializedRepo() { + MirrorCommandResult result = callMirrorUpdate(emptyContext, repositoryDirectory); + + assertThat(result.getResult()).isEqualTo(OK); + assertThat(result.getLog()).contains("Updated from revision 0 to revision 5"); + } + @Test public void shouldUseCredentials() { MirrorCommandResult result = callMirror(emptyContext, repositoryDirectory, createCredential("svnadmin", "secret"));