diff --git a/src/applications/drydock/application/PhabricatorDrydockApplication.php b/src/applications/drydock/application/PhabricatorDrydockApplication.php --- a/src/applications/drydock/application/PhabricatorDrydockApplication.php +++ b/src/applications/drydock/application/PhabricatorDrydockApplication.php @@ -93,6 +93,8 @@ '' => 'DrydockRepositoryOperationViewController', 'status/' => 'DrydockRepositoryOperationStatusController', 'dismiss/' => 'DrydockRepositoryOperationDismissController', + 'logs/(?:query/(?P[^/]+)/)?' => + 'DrydockLogListController', ), ), ), diff --git a/src/applications/drydock/controller/DrydockLogController.php b/src/applications/drydock/controller/DrydockLogController.php --- a/src/applications/drydock/controller/DrydockLogController.php +++ b/src/applications/drydock/controller/DrydockLogController.php @@ -6,6 +6,7 @@ private $blueprint; private $resource; private $lease; + private $operation; public function setBlueprint(DrydockBlueprint $blueprint) { $this->blueprint = $blueprint; @@ -34,6 +35,15 @@ return $this->lease; } + public function setOperation(DrydockRepositoryOperation $operation) { + $this->operation = $operation; + return $this; + } + + public function getOperation() { + return $this->operation; + } + public function buildSideNavView() { $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); @@ -56,6 +66,11 @@ $engine->setLease($lease); } + $operation = $this->getOperation(); + if ($operation) { + $engine->setOperation($operation); + } + $engine->addNavigationItems($nav->getMenu()); $nav->selectFilter(null); @@ -66,9 +81,12 @@ protected function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); + $viewer = $this->getViewer(); + $blueprint = $this->getBlueprint(); $resource = $this->getResource(); $lease = $this->getLease(); + $operation = $this->getOperation(); if ($blueprint) { $id = $blueprint->getID(); @@ -111,6 +129,20 @@ $crumbs->addTextCrumb( pht('Logs'), $this->getApplicationURI("lease/{$id}/logs/")); + } else if ($operation) { + $id = $operation->getID(); + + $crumbs->addTextCrumb( + pht('Operations'), + $this->getApplicationURI('operation/')); + + $crumbs->addTextCrumb( + pht('Repository Operation %d', $id), + $this->getApplicationURI("operation/{$id}/")); + + $crumbs->addTextCrumb( + pht('Logs'), + $this->getApplicationURI("operation/{$id}/logs/")); } return $crumbs; diff --git a/src/applications/drydock/controller/DrydockLogListController.php b/src/applications/drydock/controller/DrydockLogListController.php --- a/src/applications/drydock/controller/DrydockLogListController.php +++ b/src/applications/drydock/controller/DrydockLogListController.php @@ -46,6 +46,17 @@ $engine->setLease($lease); $this->setLease($lease); break; + case 'operation': + $operation = id(new DrydockRepositoryOperationQuery()) + ->setViewer($viewer) + ->withIDs(array($id)) + ->executeOne(); + if (!$operation) { + return new Aphront404Response(); + } + $engine->setOperation($operation); + $this->setOperation($operation); + break; default: return new Aphront404Response(); } diff --git a/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php b/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php --- a/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php +++ b/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php @@ -47,13 +47,22 @@ ->setUser($viewer) ->setOperation($operation); + $log_query = id(new DrydockLogQuery()) + ->withOperationPHIDs(array($operation->getPHID())); + + $logs = $this->buildLogBox( + $log_query, + $this->getApplicationURI("operation/{$id}/logs/query/all/")); + $view = id(new PHUITwoColumnView()) ->setHeader($header) ->setCurtain($curtain) ->addPropertySection(pht('Properties'), $properties) - ->setMainColumn(array( - $status_view, - )); + ->setMainColumn( + array( + $status_view, + $logs, + )); return $this->newPage() ->setTitle($title) diff --git a/src/applications/drydock/query/DrydockLogSearchEngine.php b/src/applications/drydock/query/DrydockLogSearchEngine.php --- a/src/applications/drydock/query/DrydockLogSearchEngine.php +++ b/src/applications/drydock/query/DrydockLogSearchEngine.php @@ -5,6 +5,7 @@ private $blueprint; private $resource; private $lease; + private $operation; public function setBlueprint(DrydockBlueprint $blueprint) { $this->blueprint = $blueprint; @@ -33,6 +34,15 @@ return $this->lease; } + public function setOperation(DrydockRepositoryOperation $operation) { + $this->operation = $operation; + return $this; + } + + public function getOperation() { + return $this->operation; + } + public function canUseInPanelContext() { // Prevent use on Dashboard panels since all log queries currently need a // parent object and these don't seem particularly useful in any case. @@ -65,6 +75,11 @@ $query->withLeasePHIDs(array($lease->getPHID())); } + $operation = $this->getOperation(); + if ($operation) { + $query->withOperationPHIDs(array($operation->getPHID())); + } + return $query; } @@ -97,9 +112,15 @@ return "/drydock/lease/{$id}/logs/{$path}"; } + $operation = $this->getOperation(); + if ($operation) { + $id = $operation->getID(); + return "/drydock/operation/{$id}/logs/{$path}"; + } + throw new Exception( pht( - 'Search engine has no blueprint, resource, or lease.')); + 'Search engine has no blueprint, resource, lease, or operation.')); } protected function getBuiltinQueryNames() {