diff --git a/scm-core/src/main/java/sonia/scm/migration/UpdateStep.java b/scm-core/src/main/java/sonia/scm/migration/UpdateStep.java index b135e2172e..ebb9bd0877 100644 --- a/scm-core/src/main/java/sonia/scm/migration/UpdateStep.java +++ b/scm-core/src/main/java/sonia/scm/migration/UpdateStep.java @@ -5,4 +5,6 @@ import sonia.scm.plugin.ExtensionPoint; @ExtensionPoint public interface UpdateStep { void doUpdate(); + + String getTargetVersion(); } diff --git a/scm-webapp/src/main/java/sonia/scm/UpdateEngine.java b/scm-webapp/src/main/java/sonia/scm/UpdateEngine.java index 2fb86b9731..4fb0b8239b 100644 --- a/scm-webapp/src/main/java/sonia/scm/UpdateEngine.java +++ b/scm-webapp/src/main/java/sonia/scm/UpdateEngine.java @@ -1,17 +1,29 @@ package sonia.scm; import sonia.scm.migration.UpdateStep; +import sonia.scm.version.Version; import javax.inject.Inject; +import java.util.Comparator; +import java.util.List; import java.util.Set; +import static java.util.stream.Collectors.toList; + public class UpdateEngine { - private final Set steps; + private final List steps; @Inject public UpdateEngine(Set steps) { - this.steps = steps; + this.steps = sortSteps(steps); + } + + private List sortSteps(Set steps) { + Comparator compareByVersion = Comparator.comparing(step -> Version.parse(step.getTargetVersion())); + return steps.stream() + .sorted(compareByVersion.reversed()) + .collect(toList()); } public void update() { diff --git a/scm-webapp/src/test/java/sonia/scm/UpdateEngineTest.java b/scm-webapp/src/test/java/sonia/scm/UpdateEngineTest.java new file mode 100644 index 0000000000..da72ed2ed0 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/UpdateEngineTest.java @@ -0,0 +1,48 @@ +package sonia.scm; + +import org.junit.jupiter.api.Test; +import sonia.scm.migration.UpdateStep; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class UpdateEngineTest { + + List processedUpdates = new ArrayList<>(); + + @Test + void shouldProcessStepsInCorrectOrder() { + LinkedHashSet updateSteps = new LinkedHashSet<>(); + + updateSteps.add(new FixedVersionUpdateStep("1.1.1")); + updateSteps.add(new FixedVersionUpdateStep("1.2.0")); + updateSteps.add(new FixedVersionUpdateStep("1.1.0")); + + UpdateEngine updateEngine = new UpdateEngine(updateSteps); + updateEngine.update(); + + assertThat(processedUpdates) + .containsExactly("1.1.0", "1.1.1", "1.2.0"); + } + + class FixedVersionUpdateStep implements UpdateStep { + private final String version; + + FixedVersionUpdateStep(String version) { + this.version = version; + } + + @Override + public String getTargetVersion() { + return version; + } + + @Override + public void doUpdate() { + processedUpdates.add(version); + } + } +}