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()));
}
}