提交 39a20e7a 编写于 作者: C Christoph Kutzinski

Merge pull request #200 from kutzi/maven-dep-graph-enhancement

Enhancements for Maven dependency graph
......@@ -70,6 +70,12 @@ Upcoming changes</a>
<li class=bug>
Some CLI command are not available.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-10418">issue 10418</a>)
<li class=rfe>
Maven jobs deploying or installing artifacts should be used for dependency graph instead of jobs which don't
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-10366">issue 10366</a>)
<li class=rfe>
Maven jobs which are disabled should be excluded from dependency graph
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-10367">issue 10367</a>)
</ul>
</div><!--=TRUNK-END=-->
......
......@@ -40,6 +40,8 @@ import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.export.Exported;
import com.google.common.util.concurrent.MoreExecutors;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
......@@ -387,7 +389,7 @@ public final class MavenModule extends AbstractMavenProject<MavenModule,MavenBui
}
protected void buildDependencyGraph(DependencyGraph graph) {
if(isDisabled() || getParent().ignoreUpstremChanges()) return;
if(!isBuildable() || getParent().ignoreUpstremChanges()) return;
MavenDependencyComputationData data = graph.getComputationalData(MavenDependencyComputationData.class);
......@@ -402,11 +404,13 @@ public final class MavenModule extends AbstractMavenProject<MavenModule,MavenBui
Map<ModuleDependency,MavenModule> modules = new HashMap<ModuleDependency,MavenModule>();
for (MavenModule m : Jenkins.getInstance().getAllItems(MavenModule.class)) {
if(m.isDisabled()) continue;
if(!m.isBuildable()) continue;
ModuleDependency moduleDependency = m.asDependency();
modules.put(moduleDependency,m);
MavenModule old = modules.get(moduleDependency);
MavenModule relevant = chooseMoreRelevantModule(old, m, moduleDependency);
modules.put(moduleDependency, relevant);
if (hasDependenciesWithUnknownVersion) {
modules.put(moduleDependency.withUnknownVersion(),m);
modules.put(moduleDependency.withUnknownVersion(),relevant);
}
}
data = new MavenDependencyComputationData(modules);
......@@ -477,6 +481,67 @@ public final class MavenModule extends AbstractMavenProject<MavenModule,MavenBui
}
return false;
}
private MavenModule chooseMoreRelevantModule(MavenModule mm1, MavenModule mm2, ModuleDependency moduleDependency) {
if (mm1 == null) {
return mm2;
}
if (mm2 == null) {
return mm1;
}
final MavenModule moreRelevant;
final MavenModule lessRelevant;
int relevancy1 = getDependencyRelevancy(mm1);
int relevancy2 = getDependencyRelevancy(mm2);
if (relevancy1 > relevancy2) {
moreRelevant = mm1;
lessRelevant = mm2;
} else if (relevancy2 > relevancy1) {
moreRelevant = mm2;
lessRelevant = mm1;
} else {
// arbitrary, but reproduceable
if (mm1.getParent().getName().compareTo(mm2.getParent().getName()) < 0) {
moreRelevant = mm2;
lessRelevant = mm1;
} else { // should always mean > 0 as name is unique
moreRelevant = mm1;
lessRelevant = mm2;
}
}
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer("Choosing " + moreRelevant.getParent().getName() + " over " + lessRelevant.getParent().getName()
+ " for module " + moduleDependency.getName() + ". Relevancies: " + relevancy1 + ", " + relevancy2);
}
return moreRelevant;
}
private int getDependencyRelevancy(MavenModule mm) {
int relevancy = 0;
for (String goal : Util.tokenize(mm.getGoals())) {
if ("deploy".equals(goal) || "deploy:deploy".equals(goal)) {
return 2;
}
if ("install".equals(goal)) {
relevancy = 1;
}
}
for (Publisher publisher : mm.getParent().getPublishers()) {
if (publisher instanceof RedeployPublisher) {
return 2;
}
}
return relevancy;
}
private static class MavenDependencyComputationData {
boolean withUnknownVersions = false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册