@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Show Drydock resource leases, add DrydockLeaseQuery, allow reuse of working copies

Summary: Minor updates to Drydock things to make them work better. In particular, after this patch working copies are correctly allocated or reused.

Test Plan: Ran "reparse.php --harbormaster <derp derp>", saw reuse of working copies when unleased resources were avilable.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T2015

Differential Revision: https://secure.phabricator.com/D4216

+133 -5
+2
src/__phutil_library_map__.php
··· 432 432 'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php', 433 433 'DrydockLease' => 'applications/drydock/storage/DrydockLease.php', 434 434 'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php', 435 + 'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php', 435 436 'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php', 436 437 'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php', 437 438 'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php', ··· 1721 1722 'DrydockDAO' => 'PhabricatorLiskDAO', 1722 1723 'DrydockLease' => 'DrydockDAO', 1723 1724 'DrydockLeaseListController' => 'DrydockController', 1725 + 'DrydockLeaseQuery' => 'PhabricatorOffsetPagedQuery', 1724 1726 'DrydockLeaseReleaseController' => 'DrydockController', 1725 1727 'DrydockLeaseStatus' => 'DrydockConstants', 1726 1728 'DrydockLeaseViewController' => 'DrydockController',
+10 -3
src/applications/drydock/blueprint/DrydockBlueprint.php
··· 23 23 } 24 24 25 25 protected function loadLease($lease_id) { 26 - $lease = id(new DrydockLease())->load($lease_id); 26 + $query = id(new DrydockLeaseQuery()) 27 + ->withIDs(array($lease_id)) 28 + ->needResources(true) 29 + ->execute(); 30 + 31 + $lease = idx($query, $lease_id); 32 + 27 33 if (!$lease) { 28 34 throw new Exception("No such lease '{$lease_id}'!"); 29 35 } 30 36 31 - $resource = $lease->loadResource(); 32 - $lease->attachResource($resource); 33 37 return $lease; 34 38 } 35 39 ··· 43 47 final public function filterResource( 44 48 DrydockResource $resource, 45 49 DrydockLease $lease) { 50 + 51 + $scope = $this->pushActiveScope($resource, $lease); 52 + 46 53 return $this->canAllocateLease($resource, $lease); 47 54 } 48 55
+2 -1
src/applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php
··· 13 13 $resource_repo = $resource->getAttribute('repositoryID'); 14 14 $lease_repo = $lease->getAttribute('repositoryID'); 15 15 16 - return ($resource_repo && $lease_repo && $resource_repo == $lease_repo); 16 + return ($resource_repo && $lease_repo && ($resource_repo == $lease_repo)); 17 17 } 18 18 19 19 protected function shouldAllocateLease( ··· 66 66 $resource->setStatus(DrydockResourceStatus::STATUS_OPEN); 67 67 $resource->setAttribute('lease.host', $host_lease->getID()); 68 68 $resource->setAttribute('path', $path); 69 + $resource->setAttribute('repositoryID', $repository->getID()); 69 70 $resource->save(); 70 71 71 72 return $resource;
+38
src/applications/drydock/controller/DrydockResourceViewController.php
··· 30 30 $resource_uri = 'resource/'.$resource->getID().'/'; 31 31 $resource_uri = $this->getApplicationURI($resource_uri); 32 32 33 + $leases = id(new DrydockLeaseQuery()) 34 + ->withResourceIDs(array($resource->getID())) 35 + ->execute(); 36 + 37 + $lease_list = $this->buildLeaseListView($leases); 38 + $lease_list->setNoDataString(pht('This resource has no leases.')); 39 + 33 40 $pager = new AphrontPagerView(); 34 41 $pager->setURI(new PhutilURI($resource_uri), 'offset'); 35 42 $pager->setOffset($request->getInt('offset')); ··· 46 53 $header, 47 54 $actions, 48 55 $properties, 56 + $lease_list, 49 57 $log_table, 50 58 )); 51 59 ··· 101 109 phutil_escape_html($key), 102 110 phutil_escape_html($value)); 103 111 } 112 + } 113 + 114 + return $view; 115 + } 116 + 117 + private function buildLeaseListView(array $leases) { 118 + assert_instances_of($leases, 'DrydockLease'); 119 + 120 + $user = $this->getRequest()->getUser(); 121 + 122 + $view = new PhabricatorObjectItemListView(); 123 + 124 + foreach ($leases as $lease) { 125 + $item = id(new PhabricatorObjectItemView()) 126 + ->setHeader($lease->getLeaseName()) 127 + ->setHref($this->getApplicationURI('/lease/'.$lease->getID().'/')); 128 + 129 + $status = DrydockLeaseStatus::getNameForStatus($lease->getStatus()); 130 + $item->addAttribute(phutil_escape_html($status)); 131 + 132 + $date_created = phabricator_date($lease->getDateCreated(), $user); 133 + $item->addAttribute(pht('Created on %s', $date_created)); 134 + 135 + if ($lease->isActive()) { 136 + $item->setBarColor('green'); 137 + } else { 138 + $item->setBarColor('red'); 139 + } 140 + 141 + $view->addItem($item); 104 142 } 105 143 106 144 return $view;
+80
src/applications/drydock/query/DrydockLeaseQuery.php
··· 1 + <?php 2 + 3 + final class DrydockLeaseQuery extends PhabricatorOffsetPagedQuery { 4 + 5 + private $ids; 6 + private $resourceIDs; 7 + private $needResources; 8 + 9 + public function withResourceIDs(array $ids) { 10 + $this->resourceIDs = $ids; 11 + return $this; 12 + } 13 + 14 + public function withIDs(array $ids) { 15 + $this->ids = $ids; 16 + return $this; 17 + } 18 + 19 + public function needResources($need_resources) { 20 + $this->needResources = $need_resources; 21 + return $this; 22 + } 23 + 24 + public function execute() { 25 + $table = new DrydockLease(); 26 + $conn_r = $table->establishConnection('r'); 27 + 28 + $data = queryfx_all( 29 + $conn_r, 30 + 'SELECT lease.* FROM %T lease %Q %Q %Q', 31 + $table->getTableName(), 32 + $this->buildWhereClause($conn_r), 33 + $this->buildOrderClause($conn_r), 34 + $this->buildLimitClause($conn_r)); 35 + 36 + $leases = $table->loadAllFromArray($data); 37 + 38 + if ($leases && $this->needResources) { 39 + $resources = id(new DrydockResource())->loadAllWhere( 40 + 'id IN (%Ld)', 41 + mpull($leases, 'getResourceID')); 42 + 43 + foreach ($leases as $lease) { 44 + if ($lease->getResourceID()) { 45 + $resource = idx($resources, $lease->getResourceID()); 46 + if ($resource) { 47 + $lease->attachResource($resource); 48 + } 49 + } 50 + } 51 + } 52 + 53 + return $leases; 54 + } 55 + 56 + private function buildWhereClause(AphrontDatabaseConnection $conn_r) { 57 + $where = array(); 58 + 59 + if ($this->resourceIDs) { 60 + $where[] = qsprintf( 61 + $conn_r, 62 + 'resourceID IN (%Ld)', 63 + $this->resourceIDs); 64 + } 65 + 66 + if ($this->ids) { 67 + $where[] = qsprintf( 68 + $conn_r, 69 + 'id IN (%Ld)', 70 + $this->ids); 71 + } 72 + 73 + return $this->formatWhereClause($where); 74 + } 75 + 76 + private function buildOrderClause(AphrontDatabaseConnection $conn_r) { 77 + return qsprintf($conn_r, 'ORDER BY id DESC'); 78 + } 79 + 80 + }
+1 -1
src/applications/drydock/storage/DrydockLease.php
··· 123 123 return $this; 124 124 } 125 125 126 - private function isActive() { 126 + public function isActive() { 127 127 switch ($this->status) { 128 128 case DrydockLeaseStatus::STATUS_ACTIVE: 129 129 case DrydockLeaseStatus::STATUS_ACQUIRING: