diff --git a/.gitignore b/.gitignore
index d9b0e68b..d565491b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,91 @@
*.iml
/tmp
/src/test/resources/template
-/src/test/resources/template.zip
\ No newline at end of file
+/src/test/resources/template.zip
+
+
+# Created by https://www.gitignore.io/api/m2e,maven,eclipse
+# Edit at https://www.gitignore.io/?templates=m2e,maven,eclipse
+
+
+### Maven ###
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+
+### Eclipse ###
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# CDT- autotools
+.autotools
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Annotation Processing
+.apt_generated/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
+### Eclipse Patch ###
+# Eclipse Core
+.project
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# Annotation Processing
+.apt_generated
+
+.sts4-cache/
+
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()));
}
}