diff --git a/src/applications/harbormaster/controller/HarbormasterPlanViewController.php b/src/applications/harbormaster/controller/HarbormasterPlanViewController.php index c92de97c04..1ce17bf4f4 100644 --- a/src/applications/harbormaster/controller/HarbormasterPlanViewController.php +++ b/src/applications/harbormaster/controller/HarbormasterPlanViewController.php @@ -180,6 +180,7 @@ final class HarbormasterPlanViewController extends HarbormasterPlanController { $plan, $step, null); + $available_artifacts = ipull($available_artifacts, 'type'); list($depends_ui, $has_conflicts) = $this->buildDependsOnList( $depends, diff --git a/src/applications/harbormaster/engine/HarbormasterBuildGraph.php b/src/applications/harbormaster/engine/HarbormasterBuildGraph.php index 3691f4629b..a696a2b3d6 100644 --- a/src/applications/harbormaster/engine/HarbormasterBuildGraph.php +++ b/src/applications/harbormaster/engine/HarbormasterBuildGraph.php @@ -46,7 +46,8 @@ final class HarbormasterBuildGraph extends AbstractDirectedGraph { protected function loadEdges(array $nodes) { $map = array(); foreach ($nodes as $node) { - $deps = $this->stepMap[$node]->getDetail('dependsOn', array()); + $step = $this->stepMap[$node]; + $deps = $step->getStepImplementation()->getDependencies($step); $map[$node] = array(); foreach ($deps as $dep) { diff --git a/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php b/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php index a4e09f6123..433b11165c 100644 --- a/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php +++ b/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php @@ -99,7 +99,28 @@ abstract class HarbormasterBuildStepImplementation { } public function getDependencies(HarbormasterBuildStep $build_step) { - return $build_step->getDetail('dependsOn', array()); + $dependencies = $build_step->getDetail('dependsOn', array()); + + $inputs = $build_step->getStepImplementation()->getArtifactInputs(); + $inputs = ipull($inputs, null, 'key'); + + $artifacts = $this->getAvailableArtifacts( + $build_step->getBuildPlan(), + $build_step, + null); + + foreach ($artifacts as $key => $type) { + if (!array_key_exists($key, $inputs)) { + unset($artifacts[$key]); + } + } + + $artifact_steps = ipull($artifacts, 'step'); + $artifact_steps = mpull($artifact_steps, 'getPHID'); + + $dependencies = array_merge($dependencies, $artifact_steps); + + return $dependencies; } /** @@ -115,6 +136,8 @@ abstract class HarbormasterBuildStepImplementation { ->withBuildPlanPHIDs(array($build_plan->getPHID())) ->execute(); + $artifacts = array(); + $artifact_arrays = array(); foreach ($steps as $step) { if ($current_build_step !== null && @@ -124,19 +147,16 @@ abstract class HarbormasterBuildStepImplementation { } $implementation = $step->getStepImplementation(); - $artifact_arrays[] = $implementation->getArtifactOutputs(); - } - - $artifacts = array(); - foreach ($artifact_arrays as $array) { + $array = $implementation->getArtifactOutputs(); $array = ipull($array, 'type', 'key'); foreach ($array as $name => $type) { if ($type !== $artifact_type && $artifact_type !== null) { continue; } - $artifacts[$name] = $type; + $artifacts[$name] = array('type' => $type, 'step' => $step); } } + return $artifacts; }