diff --git a/core/src/main/java/hudson/model/DependencyGraph.java b/core/src/main/java/hudson/model/DependencyGraph.java index e3d8f10da67a7a9f1a18de193605de0a39be4e3d..4880cb430cf5bf7cc7147f0d2591ee580b4d613d 100644 --- a/core/src/main/java/hudson/model/DependencyGraph.java +++ b/core/src/main/java/hudson/model/DependencyGraph.java @@ -130,6 +130,38 @@ public final class DependencyGraph { return false; } + /** + * Gets all the direct and indirect upstream dependencies of the given project. + */ + public Set getTransitiveUpstream(AbstractProject src) { + return getTransitive(backward,src); + } + + /** + * Gets all the direct and indirect downstream dependencies of the given project. + */ + public Set getTransitiveDownstream(AbstractProject src) { + return getTransitive(forward,src); + } + + private Set getTransitive(Map> direction, AbstractProject src) { + Set visited = new HashSet(); + Stack queue = new Stack(); + + queue.add(src); + + while(!queue.isEmpty()) { + AbstractProject p = queue.pop(); + + for (AbstractProject child : get(direction,p)) { + if(visited.add(child)) + queue.add(child); + } + } + + return visited; + } + private void add(Map> map, AbstractProject src, AbstractProject dst) { List set = map.get(src); if(set==null) {