diff --git a/src/it/projects/build-changed-first/invoker.properties b/src/it/projects/build-changed-first/invoker.properties new file mode 100644 index 00000000..16d6bbc1 --- /dev/null +++ b/src/it/projects/build-changed-first/invoker.properties @@ -0,0 +1,2 @@ +invoker.name = TEST build changed first +invoker.goals = -e clean install -Dpartial.buildAll=true -Dpartial.buildChangedFirst=true diff --git a/src/it/projects/build-changed-first/pom.xml b/src/it/projects/build-changed-first/pom.xml new file mode 100644 index 00000000..c932c7b9 --- /dev/null +++ b/src/it/projects/build-changed-first/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + child1 + child2 + child3 + child4 + child5 + child6 + child7 + + + parent + parent + 1.0-SNAPSHOT + pom + + + + + com.lesfurets + partial-build-plugin + @project.version@ + true + + true + false + refs/heads/develop + refs/heads/feature/1 + + + + + + diff --git a/src/it/projects/build-changed-first/setup.groovy b/src/it/projects/build-changed-first/setup.groovy new file mode 100644 index 00000000..e806c74e --- /dev/null +++ b/src/it/projects/build-changed-first/setup.groovy @@ -0,0 +1,8 @@ +import com.lesfurets.maven.partial.mocks.ITHelper + +def testProjectBasedir = basedir as File +def pbpBaseDir = sourceDir as String +def pbpVersion = projectVersion as String +new ITHelper(testProjectBasedir, pbpBaseDir, pbpVersion).setupTest() + +return true \ No newline at end of file diff --git a/src/it/projects/build-changed-first/verify.groovy b/src/it/projects/build-changed-first/verify.groovy new file mode 100644 index 00000000..2fcd8aea --- /dev/null +++ b/src/it/projects/build-changed-first/verify.groovy @@ -0,0 +1,24 @@ +import org.codehaus.plexus.util.FileUtils + +def file = new File(basedir, "build.log") +String buildLog = FileUtils.fileRead(file) + +boolean verified = true +verified &= buildLog.contains("Sorting reactor so changed project are built first.") +verified &= buildLog.contains(" subchild2") +verified &= buildLog.contains(" child3") +verified &= buildLog.contains(" child4") +verified &= buildLog.contains(" subchild41") + +verified &= buildLog.contains(" child1") +verified &= buildLog.contains(" child2") +verified &= buildLog.contains(" child5") +verified &= buildLog.contains(" child6") +verified &= buildLog.contains(" child7") +verified &= buildLog.contains(" subchild1") +verified &= buildLog.contains(" subchild42") +verified &= buildLog.contains(" parent") + +verified &= buildLog.contains(" BUILD SUCCESS") + +return verified; diff --git a/src/main/java/com/lesfurets/maven/partial/core/Configuration.java b/src/main/java/com/lesfurets/maven/partial/core/Configuration.java index 78355e6a..49bd0678 100644 --- a/src/main/java/com/lesfurets/maven/partial/core/Configuration.java +++ b/src/main/java/com/lesfurets/maven/partial/core/Configuration.java @@ -35,6 +35,7 @@ public class Configuration { public final boolean makeUpstream; public final boolean skipTestsForNotImpactedModules; public final boolean buildAll; + public final boolean buildChangedFirst; public final boolean compareToMergeBase; public final boolean fetchBaseBranch; public final boolean fetchReferenceBranch; @@ -70,6 +71,7 @@ public Configuration(MavenSession session) throws IOException { untracked = Boolean.valueOf(Property.untracked.getValue()); skipTestsForNotImpactedModules = Boolean.valueOf(Property.skipTestsForNotImpactedModules.getValue()); buildAll = Boolean.valueOf(Property.buildAll.getValue()); + buildChangedFirst = Boolean.valueOf(Property.buildChangedFirst.getValue()); compareToMergeBase = Boolean.valueOf(Property.compareToMergeBase.getValue()); fetchReferenceBranch = Boolean.valueOf(Property.fetchReferenceBranch.getValue()); fetchBaseBranch = Boolean.valueOf(Property.fetchBaseBranch.getValue()); @@ -166,6 +168,7 @@ public String toString() { .append("makeUpstream", makeUpstream) .append("skipTestsForNotImpactedModules", skipTestsForNotImpactedModules) .append("buildAll", buildAll) + .append("buildChangedFirst", buildChangedFirst) .append("compareToMergeBase", compareToMergeBase) .append("fetchBaseBranch", fetchBaseBranch) .append("fetchReferenceBranch", fetchReferenceBranch) diff --git a/src/main/java/com/lesfurets/maven/partial/core/Property.java b/src/main/java/com/lesfurets/maven/partial/core/Property.java index e9445467..4bf42afa 100644 --- a/src/main/java/com/lesfurets/maven/partial/core/Property.java +++ b/src/main/java/com/lesfurets/maven/partial/core/Property.java @@ -10,6 +10,7 @@ public enum Property { untracked("false"), skipTestsForNotImpactedModules("false"), buildAll("false"), + buildChangedFirst("false"), compareToMergeBase("true"), fetchBaseBranch("false"), fetchReferenceBranch("false"), diff --git a/src/main/java/com/lesfurets/maven/partial/core/RebuildProjects.java b/src/main/java/com/lesfurets/maven/partial/core/RebuildProjects.java index 21d1ccb4..ddcb75e9 100644 --- a/src/main/java/com/lesfurets/maven/partial/core/RebuildProjects.java +++ b/src/main/java/com/lesfurets/maven/partial/core/RebuildProjects.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,6 +35,30 @@ public void setUpSession(Collection changedProjects) { final Collection changed = new ArrayList<>(changedProjects); changed.addAll(configuration.ignoredProjects); changed.addAll(configuration.buildAnywaysProjects); + + Comparator comparator; + if (configuration.buildChangedFirst) + { + logger.info("Sorting reactor so changed project are built first."); + + comparator = (project1, project2) -> { + if (changedProjects.contains(project1) + && changedProjects.contains(project2)) + // both projects are changed, keep order + return 0; + + if (changedProjects.contains(project1)) + return -1; + if (changedProjects.contains(project2)) + return 1; + + return 0; + }; + } else { + // do not reshuffle projects + comparator = (project1, project2) -> 0; + } + if (!configuration.buildAll) { Collection rebuildProjects = changed; if (configuration.makeUpstream) { @@ -47,6 +72,7 @@ public void setUpSession(Collection changedProjects) { } else { mavenSession.setProjects(mavenSession.getProjects().stream() .filter(rebuildProjects::contains) + .sorted(comparator) .collect(Collectors.toList())); } } else { @@ -56,6 +82,10 @@ public void setUpSession(Collection changedProjects) { this.ifSkipDependenciesTest(p); this.ifSkipDependenciesSonar(p); }); + + mavenSession.setProjects(mavenSession.getProjects().stream() + .sorted(comparator) + .collect(Collectors.toList())); } }