diff --git a/src/applications/diffusion/controller/DiffusionPushEventViewController.php b/src/applications/diffusion/controller/DiffusionPushEventViewController.php index 027cf16bbe..c5eb6368b4 100644 --- a/src/applications/diffusion/controller/DiffusionPushEventViewController.php +++ b/src/applications/diffusion/controller/DiffusionPushEventViewController.php @@ -1,178 +1,177 @@ getViewer(); $event = id(new PhabricatorRepositoryPushEventQuery()) ->setViewer($viewer) ->withIDs(array($request->getURIData('id'))) ->needLogs(true) ->executeOne(); if (!$event) { return new Aphront404Response(); } $repository = $event->getRepository(); $title = pht('Push %d', $event->getID()); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb( $repository->getName(), $repository->getURI()); $crumbs->addTextCrumb( pht('Push Logs'), $this->getApplicationURI( 'pushlog/?repositories='.$repository->getMonogram())); $crumbs->addTextCrumb($title); $event_properties = $this->buildPropertyList($event); $detail_box = id(new PHUIObjectBoxView()) ->setHeaderText($title) ->addPropertyList($event_properties); $commits = $this->loadCommits($event); $commits_table = $this->renderCommitsTable($event, $commits); $commits_box = id(new PHUIObjectBoxView()) ->setHeaderText(pht('Pushed Commits')) ->setTable($commits_table); $logs = $event->getLogs(); $updates_table = id(new DiffusionPushLogListView()) ->setUser($viewer) - ->setLogs($logs) - ->setHandles($this->loadViewerHandles(mpull($logs, 'getPusherPHID'))); + ->setLogs($logs); $update_box = id(new PHUIObjectBoxView()) ->setHeaderText(pht('All Pushed Updates')) ->setTable($updates_table); return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) ->appendChild( array( $detail_box, $commits_box, $update_box, )); } private function buildPropertyList(PhabricatorRepositoryPushEvent $event) { $viewer = $this->getRequest()->getUser(); $view = new PHUIPropertyListView(); $view->addProperty( pht('Pushed At'), phabricator_datetime($event->getEpoch(), $viewer)); $view->addProperty( pht('Pushed By'), $viewer->renderHandle($event->getPusherPHID())); $view->addProperty( pht('Pushed Via'), $event->getRemoteProtocol()); return $view; } private function loadCommits(PhabricatorRepositoryPushEvent $event) { $viewer = $this->getRequest()->getUser(); $identifiers = array(); foreach ($event->getLogs() as $log) { if ($log->getRefType() == PhabricatorRepositoryPushLog::REFTYPE_COMMIT) { $identifiers[] = $log->getRefNew(); } } if (!$identifiers) { return array(); } // NOTE: Commits may not have been parsed/discovered yet. We need to return // the identifiers no matter what. If possible, we'll also return the // corresponding commits. $commits = id(new DiffusionCommitQuery()) ->setViewer($viewer) ->withRepository($event->getRepository()) ->withIdentifiers($identifiers) ->execute(); $commits = mpull($commits, null, 'getCommitIdentifier'); $results = array(); foreach ($identifiers as $identifier) { $results[$identifier] = idx($commits, $identifier); } return $results; } private function renderCommitsTable( PhabricatorRepositoryPushEvent $event, array $commits) { $viewer = $this->getRequest()->getUser(); $repository = $event->getRepository(); $rows = array(); foreach ($commits as $identifier => $commit) { if ($commit) { $partial_import = PhabricatorRepositoryCommit::IMPORTED_MESSAGE | PhabricatorRepositoryCommit::IMPORTED_CHANGE; if ($commit->isPartiallyImported($partial_import)) { $summary = AphrontTableView::renderSingleDisplayLine( $commit->getSummary()); } else { $summary = phutil_tag('em', array(), pht('Importing...')); } } else { $summary = phutil_tag('em', array(), pht('Discovering...')); } $commit_name = $repository->formatCommitName($identifier); if ($commit) { $commit_name = phutil_tag( 'a', array( 'href' => '/'.$commit_name, ), $commit_name); } $rows[] = array( $commit_name, $summary, ); } $table = id(new AphrontTableView($rows)) ->setNoDataString(pht("This push didn't push any new commits.")) ->setHeaders( array( pht('Commit'), pht('Summary'), )) ->setColumnClasses( array( 'n', 'wide', )); return $table; } } diff --git a/src/applications/diffusion/view/DiffusionPushLogListView.php b/src/applications/diffusion/view/DiffusionPushLogListView.php index b3d78f2369..303f0519f6 100644 --- a/src/applications/diffusion/view/DiffusionPushLogListView.php +++ b/src/applications/diffusion/view/DiffusionPushLogListView.php @@ -1,149 +1,153 @@ logs = $logs; return $this; } - public function setHandles(array $handles) { - $this->handles = $handles; - return $this; - } - public function render() { $logs = $this->logs; - $viewer = $this->getUser(); - $handles = $this->handles; + $viewer = $this->getViewer(); + + $handle_phids = array(); + foreach ($logs as $log) { + $handle_phids[] = $log->getPusherPHID(); + $device_phid = $log->getDevicePHID(); + if ($device_phid) { + $handle_phids[] = $device_phid; + } + } + + $handles = $viewer->loadHandles($handle_phids); // Figure out which repositories are editable. We only let you see remote // IPs if you have edit capability on a repository. $editable_repos = array(); if ($logs) { $editable_repos = id(new PhabricatorRepositoryQuery()) ->setViewer($viewer) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->withPHIDs(mpull($logs, 'getRepositoryPHID')) ->execute(); $editable_repos = mpull($editable_repos, null, 'getPHID'); } $rows = array(); $any_host = false; foreach ($logs as $log) { $repository = $log->getRepository(); // Reveal this if it's valid and the user can edit the repository. $remote_address = '-'; if (isset($editable_repos[$log->getRepositoryPHID()])) { $remote_address = $log->getPushEvent()->getRemoteAddress(); } $event_id = $log->getPushEvent()->getID(); $old_ref_link = null; if ($log->getRefOld() != DiffusionCommitHookEngine::EMPTY_HASH) { $old_ref_link = phutil_tag( 'a', array( 'href' => $repository->getCommitURI($log->getRefOld()), ), $log->getRefOldShort()); } $device_phid = $log->getDevicePHID(); if ($device_phid) { - $device = $handles[$device_phid]->renderLink(); + $device = $viewer->renderHandle($device_phid); $any_host = true; } else { $device = null; } $rows[] = array( phutil_tag( 'a', array( 'href' => '/diffusion/pushlog/view/'.$event_id.'/', ), $event_id), phutil_tag( 'a', array( 'href' => $repository->getURI(), ), $repository->getDisplayName()), - $handles[$log->getPusherPHID()]->renderLink(), + $viewer->renderHandle($log->getPusherPHID()), $remote_address, $log->getPushEvent()->getRemoteProtocol(), $device, $log->getRefType(), $log->getRefName(), $old_ref_link, phutil_tag( 'a', array( 'href' => $repository->getCommitURI($log->getRefNew()), ), $log->getRefNewShort()), // TODO: Make these human-readable. $log->getChangeFlags(), $log->getPushEvent()->getRejectCode(), $viewer->formatShortDateTime($log->getEpoch()), ); } $table = id(new AphrontTableView($rows)) ->setHeaders( array( pht('Push'), pht('Repository'), pht('Pusher'), pht('From'), pht('Via'), pht('Host'), pht('Type'), pht('Name'), pht('Old'), pht('New'), pht('Flags'), pht('Code'), pht('Date'), )) ->setColumnClasses( array( '', '', '', '', '', '', '', 'wide', 'n', 'n', 'right', )) ->setColumnVisibility( array( true, true, true, true, true, $any_host, )); return $table; } } diff --git a/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php b/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php index 320558de21..8fd3baeb54 100644 --- a/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php +++ b/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php @@ -1,120 +1,108 @@ setParameter( 'repositoryPHIDs', $this->readPHIDsFromRequest( $request, 'repositories', array( PhabricatorRepositoryRepositoryPHIDType::TYPECONST, ))); $saved->setParameter( 'pusherPHIDs', $this->readUsersFromRequest( $request, 'pushers')); return $saved; } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { $query = id(new PhabricatorRepositoryPushLogQuery()); $repository_phids = $saved->getParameter('repositoryPHIDs'); if ($repository_phids) { $query->withRepositoryPHIDs($repository_phids); } $pusher_phids = $saved->getParameter('pusherPHIDs'); if ($pusher_phids) { $query->withPusherPHIDs($pusher_phids); } return $query; } public function buildSearchForm( AphrontFormView $form, PhabricatorSavedQuery $saved_query) { $repository_phids = $saved_query->getParameter('repositoryPHIDs', array()); $pusher_phids = $saved_query->getParameter('pusherPHIDs', array()); $form ->appendControl( id(new AphrontFormTokenizerControl()) ->setDatasource(new DiffusionRepositoryDatasource()) ->setName('repositories') ->setLabel(pht('Repositories')) ->setValue($repository_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setDatasource(new PhabricatorPeopleDatasource()) ->setName('pushers') ->setLabel(pht('Pushers')) ->setValue($pusher_phids)); } protected function getURI($path) { return '/diffusion/pushlog/'.$path; } protected function getBuiltinQueryNames() { return array( 'all' => pht('All Push Logs'), ); } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'all': return $query; } return parent::buildSavedQueryFromBuiltin($query_key); } - protected function getRequiredHandlePHIDsForResultList( - array $logs, - PhabricatorSavedQuery $query) { - $phids = array(); - $phids[] = mpull($logs, 'getPusherPHID'); - $phids[] = mpull($logs, 'getDevicePHID'); - $phids = array_mergev($phids); - $phids = array_filter($phids); - return $phids; - } - protected function renderResultList( array $logs, PhabricatorSavedQuery $query, array $handles) { $table = id(new DiffusionPushLogListView()) - ->setUser($this->requireViewer()) - ->setHandles($handles) + ->setViewer($this->requireViewer()) ->setLogs($logs); return id(new PhabricatorApplicationSearchResultView()) ->setTable($table); } }