From cf7d70d4657b58fe62aab80019aa4bae4e41eef8 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Wed, 4 Jun 2008 15:59:35 +0000 Subject: [PATCH] applied a patch from Martin Ficker. See http://www.nabble.com/Patch-for-Buildorder-td17625563.html git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@9821 71c3de6d-444a-0410-be80-ed276b4c234a --- .../main/java/hudson/model/DependencyGraph.java | 15 ++++++++++++++- core/src/main/java/hudson/tasks/BuildTrigger.java | 11 +++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/DependencyGraph.java b/core/src/main/java/hudson/model/DependencyGraph.java index 11cb9ba4a9..a163f425a4 100644 --- a/core/src/main/java/hudson/model/DependencyGraph.java +++ b/core/src/main/java/hudson/model/DependencyGraph.java @@ -52,7 +52,7 @@ import java.awt.image.BufferedImage; * @see Hudson#getDependencyGraph() * @author Kohsuke Kawaguchi */ -public final class DependencyGraph { +public final class DependencyGraph implements Comparator { private Map> forward = new HashMap>(); private Map> backward = new HashMap>(); @@ -312,4 +312,17 @@ public final class DependencyGraph { }; public static final DependencyGraph EMPTY = new DependencyGraph(false); + + /** + * Compare to Projects based on the topological order defined by this Dependency Graph + */ + public int compare(AbstractProject o1, AbstractProject o2) { + Set o1sdownstreams = getTransitiveDownstream(o1); + Set o2sdownstreams = getTransitiveDownstream(o2); + if (o1sdownstreams.contains(o2)) { + if (o2sdownstreams.contains(o1)) return 0; else return 1; + } else { + if (o2sdownstreams.contains(o1)) return -1; else return 0; + } + } } diff --git a/core/src/main/java/hudson/tasks/BuildTrigger.java b/core/src/main/java/hudson/tasks/BuildTrigger.java index 99e1a43e0d..6b4b7ec4b3 100644 --- a/core/src/main/java/hudson/tasks/BuildTrigger.java +++ b/core/src/main/java/hudson/tasks/BuildTrigger.java @@ -26,7 +26,9 @@ import org.kohsuke.stapler.StaplerResponse; import javax.servlet.ServletException; import java.io.IOException; import java.io.PrintStream; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.StringTokenizer; import java.util.logging.Level; @@ -123,13 +125,18 @@ public class BuildTrigger extends Publisher implements DependecyDeclarer, Matrix if(trigger==null || !build.getResult().isWorseThan(trigger.getThreshold())) { PrintStream logger = listener.getLogger(); //Trigger all downstream Project of the project, not just those defined by this buildtrigger - List downstreamProjects = build.getProject().getDownstreamProjects(); + List downstreamProjects = + new ArrayList (build.getProject().getDownstreamProjects()); + + // Sort topologically + Collections.sort(downstreamProjects, + Collections.reverseOrder (Hudson.getInstance().getDependencyGraph())); + for (AbstractProject p : downstreamProjects) { if(p.isDisabled()) { logger.println(Messages.BuildTrigger_Disabled(p.getName())); continue; } - // this is not completely accurate, as a new build might be triggered // between these calls String name = p.getName()+" #"+p.getNextBuildNumber(); -- GitLab