private function getBlockers(PhabricatorRepositoryCommit $commit, HarbormasterBuildPlan $plan, HarbormasterBuild $source)
 {
     $call = new ConduitCall('diffusion.commitparentsquery', array('commit' => $commit->getCommitIdentifier(), 'repository' => $commit->getRepository()->getPHID()));
     $call->setUser(PhabricatorUser::getOmnipotentUser());
     $parents = $call->execute();
     $parents = id(new DiffusionCommitQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withRepository($commit->getRepository())->withIdentifiers($parents)->execute();
     $blockers = array();
     $build_objects = array();
     foreach ($parents as $parent) {
         if (!$parent->isImported()) {
             $blockers[] = pht('Commit %s', $parent->getCommitIdentifier());
         } else {
             $build_objects[] = $parent->getPHID();
         }
     }
     if ($build_objects) {
         $buildables = id(new HarbormasterBuildableQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withBuildablePHIDs($build_objects)->withManualBuildables(false)->execute();
         $buildable_phids = mpull($buildables, 'getPHID');
         if ($buildable_phids) {
             $builds = id(new HarbormasterBuildQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withBuildablePHIDs($buildable_phids)->withBuildPlanPHIDs(array($plan->getPHID()))->execute();
             foreach ($builds as $build) {
                 if (!$build->isComplete()) {
                     $blockers[] = pht('Build %d', $build->getID());
                 }
             }
         }
     }
     return $blockers;
 }
 public static function determineDependencyExecution(HarbormasterBuildPlan $plan)
 {
     $steps = id(new HarbormasterBuildStepQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withBuildPlanPHIDs(array($plan->getPHID()))->execute();
     $steps_by_phid = mpull($steps, null, 'getPHID');
     $step_phids = mpull($steps, 'getPHID');
     if (count($steps) === 0) {
         return array();
     }
     $graph = id(new HarbormasterBuildGraph($steps_by_phid))->addNodes($step_phids);
     $raw_results = $graph->getBestEffortTopographicallySortedNodes();
     $results = array();
     foreach ($raw_results as $node) {
         $results[] = array('node' => $steps_by_phid[$node['node']], 'depth' => $node['depth'], 'cycle' => $node['cycle']);
     }
     return $results;
 }
 public function applyPlan(HarbormasterBuildPlan $plan, array $parameters, $initiator_phid)
 {
     $viewer = PhabricatorUser::getOmnipotentUser();
     $build = HarbormasterBuild::initializeNewBuild($viewer)->setBuildablePHID($this->getPHID())->setBuildPlanPHID($plan->getPHID())->setBuildParameters($parameters)->setBuildStatus(HarbormasterBuildStatus::STATUS_PENDING);
     if ($initiator_phid) {
         $build->setInitiatorPHID($initiator_phid);
     }
     $auto_key = $plan->getPlanAutoKey();
     if ($auto_key) {
         $build->setPlanAutoKey($auto_key);
     }
     $build->save();
     PhabricatorWorker::scheduleTask('HarbormasterBuildWorker', array('buildID' => $build->getID()), array('objectPHID' => $build->getPHID()));
     return $build;
 }
 /**
  * Returns a list of all artifacts made available in the build plan.
  */
 public static function getAvailableArtifacts(HarbormasterBuildPlan $build_plan, $current_build_step, $artifact_type)
 {
     $steps = id(new HarbormasterBuildStepQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withBuildPlanPHIDs(array($build_plan->getPHID()))->execute();
     $artifacts = array();
     $artifact_arrays = array();
     foreach ($steps as $step) {
         if ($current_build_step !== null && $step->getPHID() === $current_build_step->getPHID()) {
             continue;
         }
         $implementation = $step->getStepImplementation();
         $array = $implementation->getArtifactOutputs();
         $array = ipull($array, 'type', 'key');
         foreach ($array as $name => $type) {
             if ($type !== $artifact_type && $artifact_type !== null) {
                 continue;
             }
             $artifacts[$name] = array('type' => $type, 'step' => $step);
         }
     }
     return $artifacts;
 }
 public function applyPlan(HarbormasterBuildPlan $plan)
 {
     $viewer = PhabricatorUser::getOmnipotentUser();
     $build = HarbormasterBuild::initializeNewBuild($viewer)->setBuildablePHID($this->getPHID())->setBuildPlanPHID($plan->getPHID())->setBuildStatus(HarbormasterBuild::STATUS_PENDING)->save();
     PhabricatorWorker::scheduleTask('HarbormasterBuildWorker', array('buildID' => $build->getID()));
     return $build;
 }