diff --git a/src/applications/harbormaster/controller/HarbormasterBuildableListController.php b/src/applications/harbormaster/controller/HarbormasterBuildableListController.php index 5a66de2129..1f51a8de46 100644 --- a/src/applications/harbormaster/controller/HarbormasterBuildableListController.php +++ b/src/applications/harbormaster/controller/HarbormasterBuildableListController.php @@ -1,101 +1,102 @@ queryKey = idx($data, 'queryKey'); } public function processRequest() { $request = $this->getRequest(); $controller = id(new PhabricatorApplicationSearchController($request)) ->setQueryKey($this->queryKey) ->setSearchEngine(new HarbormasterBuildableSearchEngine()) ->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); } public function renderResultsList( array $buildables, PhabricatorSavedQuery $query) { assert_instances_of($buildables, 'HarbormasterBuildable'); $viewer = $this->getRequest()->getUser(); $list = new PHUIObjectItemListView(); foreach ($buildables as $buildable) { $id = $buildable->getID(); $item = id(new PHUIObjectItemView()) ->setHeader(pht('Buildable %d', $buildable->getID())); + $item->addAttribute($buildable->getContainerHandle()->getName()); $item->addAttribute($buildable->getBuildableHandle()->getFullName()); if ($id) { $item->setHref("/B{$id}"); } $list->addItem($item); // TODO: This is proof-of-concept for getting meaningful status // information into this list, and should get an improvement pass // once we're a little farther along. $all_pass = true; $any_fail = false; foreach ($buildable->getBuilds() as $build) { if ($build->getBuildStatus() != HarbormasterBuild::STATUS_PASSED) { $all_pass = false; } if ($build->getBuildStatus() == HarbormasterBuild::STATUS_FAILED || $build->getBuildStatus() == HarbormasterBuild::STATUS_ERROR) { $any_fail = true; } } if ($any_fail) { $item->setBarColor('red'); } else if ($all_pass) { $item->setBarColor('green'); } } return $list; } public function buildSideNavView($for_app = false) { $user = $this->getRequest()->getUser(); $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); id(new HarbormasterBuildableSearchEngine()) ->setViewer($user) ->addNavigationItems($nav->getMenu()); if ($for_app) { $nav->addFilter('new/', pht('New Build Plan')); } $nav->addLabel('Utilities'); $nav->addFilter('buildable/edit/', pht('New Manual Build')); $nav->addFilter('plan/', pht('Manage Build Plans')); $nav->selectFilter(null); return $nav; } public function buildApplicationMenu() { return $this->buildSideNavView(true)->getMenu(); } } diff --git a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php index c37aa7da3b..dbf263f8e2 100644 --- a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php +++ b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php @@ -1,51 +1,157 @@ readPHIDsFromRequest( + $request, + 'revisions', + array( + DifferentialPHIDTypeRevision::TYPECONST, + )); + + $repositories = $this->readPHIDsFromRequest( + $request, + 'repositories', + array( + PhabricatorRepositoryPHIDTypeRepository::TYPECONST, + )); + + $container_phids = array_merge($revisions, $repositories); + $saved->setParameter('containerPHIDs', $container_phids); + + $commits = $this->readPHIDsFromRequest( + $request, + 'commits', + array( + PhabricatorRepositoryPHIDTypeCommit::TYPECONST, + )); + + $diffs = $this->readListFromRequest($request, 'diffs'); + if ($diffs) { + $diffs = id(new DifferentialDiffQuery()) + ->setViewer($this->requireViewer()) + ->withIDs($diffs) + ->execute(); + $diffs = mpull($diffs, 'getPHID', 'getPHID'); + } + + $buildable_phids = array_merge($commits, $diffs); + $saved->setParameter('buildablePHIDs', $buildable_phids); + + return $saved; } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { $query = id(new HarbormasterBuildableQuery()) + ->needContainerHandles(true) ->needBuildableHandles(true) ->needBuilds(true); + $container_phids = $saved->getParameter('containerPHIDs', array()); + if ($container_phids) { + $query->withContainerPHIDs($container_phids); + } + + $buildable_phids = $saved->getParameter('buildablePHIDs', array()); + + if ($buildable_phids) { + $query->withBuildablePHIDs($buildable_phids); + } + return $query; } public function buildSearchForm( AphrontFormView $form, PhabricatorSavedQuery $saved_query) { + $container_phids = $saved_query->getParameter('containerPHIDs', array()); + $buildable_phids = $saved_query->getParameter('buildablePHIDs', array()); + + $all_phids = array_merge($container_phids, $buildable_phids); + + $revision_names = array(); + $diff_names = array(); + $repository_names = array(); + $commit_names = array(); + + if ($all_phids) { + $objects = id(new PhabricatorObjectQuery()) + ->setViewer($this->requireViewer()) + ->withPHIDs($all_phids) + ->execute(); + + foreach ($all_phids as $phid) { + $object = idx($objects, $phid); + if (!$object) { + continue; + } + + if ($object instanceof DifferentialRevision) { + $revision_names[] = 'D'.$object->getID(); + } else if ($object instanceof DifferentialDiff) { + $diff_names[] = $object->getID(); + } else if ($object instanceof PhabricatorRepository) { + $repository_names[] = 'r'.$object->getCallsign(); + } else if ($object instanceof PhabricatorRepositoryCommit) { + $repository = $object->getRepository(); + $commit_names[] = $repository->formatCommitName( + $object->getCommitIdentifier()); + } + } + } + + $form + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Differential Revisions')) + ->setName('revisions') + ->setValue(implode(', ', $revision_names))) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Differential Diffs')) + ->setName('diffs') + ->setValue(implode(', ', $diff_names))) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Repositories')) + ->setName('repositories') + ->setValue(implode(', ', $repository_names))) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Commits')) + ->setName('commits') + ->setValue(implode(', ', $commit_names))); } protected function getURI($path) { return '/harbormaster/'.$path; } public function getBuiltinQueryNames() { $names = array( 'all' => pht('All Buildables'), ); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'all': return $query; } return parent::buildSavedQueryFromBuiltin($query_key); } }