From 0f355756f5caca4e7289a79baf04d5b85f407ddf Mon Sep 17 00:00:00 2001 From: James Rhodes Date: Thu, 31 Jul 2014 12:27:37 +1000 Subject: [PATCH] Make artifacts imply dependencies on build steps Summary: This makes input artifacts imply the appropriate build step dependencies in the build plan. That is, if you use a host artifact in a build step, it will then implicitly depend on the 'Lease Host' step. Test Plan: Viewed the build plan with the artifacts, saw the dependencies. Ran a build, saw everything execute in the correct order. Reviewers: #blessed_reviewers, epriestley Reviewed By: #blessed_reviewers, epriestley Subscribers: epriestley, Korvin Differential Revision: https://secure.phabricator.com/D10089 --- .../HarbormasterPlanViewController.php | 1 + .../engine/HarbormasterBuildGraph.php | 3 +- .../HarbormasterBuildStepImplementation.php | 34 +++++++++++++++---- 3 files changed, 30 insertions(+), 8 deletions(-) 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; }