diff --git a/src/applications/auth/phid/PhabricatorAuthPHIDTypeAuthFactor.php b/src/applications/auth/phid/PhabricatorAuthPHIDTypeAuthFactor.php index 181882dcdd..58d239a7ea 100644 --- a/src/applications/auth/phid/PhabricatorAuthPHIDTypeAuthFactor.php +++ b/src/applications/auth/phid/PhabricatorAuthPHIDTypeAuthFactor.php @@ -1,39 +1,35 @@ $handle) { $factor = $objects[$phid]; $handle->setName($factor->getFactorName()); } } } diff --git a/src/applications/calendar/phid/PhabricatorCalendarPHIDTypeEvent.php b/src/applications/calendar/phid/PhabricatorCalendarPHIDTypeEvent.php index 0fb7c9d086..a87eafba29 100644 --- a/src/applications/calendar/phid/PhabricatorCalendarPHIDTypeEvent.php +++ b/src/applications/calendar/phid/PhabricatorCalendarPHIDTypeEvent.php @@ -1,41 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $event = $objects[$phid]; $id = $event->getID(); $handle->setName(pht('Event %d', $id)); } } } diff --git a/src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php b/src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php index 5742a7e9e5..793b63955a 100644 --- a/src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php +++ b/src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php @@ -1,42 +1,38 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $entry = $objects[$phid]; $key = $entry->getConfigKey(); $handle->setName($key); $handle->setURI("/config/edit/{$key}/"); } } } diff --git a/src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php b/src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php index 3a6319a954..d644774b5b 100644 --- a/src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php +++ b/src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php @@ -1,44 +1,40 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $thread = $objects[$phid]; $name = $thread->getTitle(); if (!strlen($name)) { $name = pht('[No Title]'); } $handle->setName($name); $handle->setFullName($name); $handle->setURI('/conpherence/'.$thread->getID().'/'); } } } diff --git a/src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php b/src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php index ef60213d36..b859f80d5a 100644 --- a/src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php +++ b/src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php @@ -1,73 +1,69 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $countdown = $objects[$phid]; $name = $countdown->getTitle(); $id = $countdown->getID(); $handle->setName("C{$id}"); $handle->setFullName("C{$id}: {$name}"); $handle->setURI("/countdown/{$id}/"); } } public function canLoadNamedObject($name) { return preg_match('/^C\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PhabricatorCountdownQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypeDashboard.php b/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypeDashboard.php index 0af0fd3d9d..67a27a892c 100644 --- a/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypeDashboard.php +++ b/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypeDashboard.php @@ -1,42 +1,38 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $dashboard = $objects[$phid]; $id = $dashboard->getID(); $handle->setName($dashboard->getName()); $handle->setURI("/dashboard/view/{$id}/"); } } } diff --git a/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypePanel.php b/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypePanel.php index 882f728c1e..ec552a242b 100644 --- a/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypePanel.php +++ b/src/applications/dashboard/phid/PhabricatorDashboardPHIDTypePanel.php @@ -1,77 +1,73 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $panel = $objects[$phid]; $name = $panel->getName(); $monogram = $panel->getMonogram(); $handle->setName($panel->getMonogram()); $handle->setFullName("{$monogram} {$name}"); $handle->setURI("/{$monogram}"); if ($panel->getIsArchived()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } public function canLoadNamedObject($name) { return preg_match('/^W\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PhabricatorDashboardPanelQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/differential/phid/DifferentialPHIDTypeDiff.php b/src/applications/differential/phid/DifferentialPHIDTypeDiff.php index dda8b61b94..c5f6e44dc9 100644 --- a/src/applications/differential/phid/DifferentialPHIDTypeDiff.php +++ b/src/applications/differential/phid/DifferentialPHIDTypeDiff.php @@ -1,42 +1,38 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $diff = $objects[$phid]; $id = $diff->getID(); $handle->setName(pht('Diff %d', $id)); $handle->setURI("/differential/diff/{$id}/"); } } } diff --git a/src/applications/differential/phid/DifferentialPHIDTypeRevision.php b/src/applications/differential/phid/DifferentialPHIDTypeRevision.php index 50a5f42cc4..1cf0154bf5 100644 --- a/src/applications/differential/phid/DifferentialPHIDTypeRevision.php +++ b/src/applications/differential/phid/DifferentialPHIDTypeRevision.php @@ -1,82 +1,78 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $revision = $objects[$phid]; $title = $revision->getTitle(); $id = $revision->getID(); $status = $revision->getStatus(); $handle->setName("D{$id}"); $handle->setURI("/D{$id}"); $handle->setFullName("D{$id}: {$title}"); if ($revision->isClosed()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } public function canLoadNamedObject($name) { return preg_match('/^D\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new DifferentialRevisionQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/diviner/phid/DivinerPHIDTypeAtom.php b/src/applications/diviner/phid/DivinerPHIDTypeAtom.php index 6a057c0741..a47efb322b 100644 --- a/src/applications/diviner/phid/DivinerPHIDTypeAtom.php +++ b/src/applications/diviner/phid/DivinerPHIDTypeAtom.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $atom = $objects[$phid]; $handle->setName($atom->getTitle()); $handle->setURI($atom->getName()); } } } diff --git a/src/applications/diviner/phid/DivinerPHIDTypeBook.php b/src/applications/diviner/phid/DivinerPHIDTypeBook.php index 3bd965ee78..af2ebb11e0 100644 --- a/src/applications/diviner/phid/DivinerPHIDTypeBook.php +++ b/src/applications/diviner/phid/DivinerPHIDTypeBook.php @@ -1,43 +1,39 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $book = $objects[$phid]; $name = $book->getName(); $handle->setName($book->getShortTitle()); $handle->setFullName($book->getTitle()); $handle->setURI("/diviner/book/{$name}/"); } } } diff --git a/src/applications/drydock/phid/DrydockPHIDTypeBlueprint.php b/src/applications/drydock/phid/DrydockPHIDTypeBlueprint.php index 22b074285e..553205cf77 100644 --- a/src/applications/drydock/phid/DrydockPHIDTypeBlueprint.php +++ b/src/applications/drydock/phid/DrydockPHIDTypeBlueprint.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $blueprint = $objects[$phid]; $id = $blueprint->getID(); $handle->setURI("/drydock/blueprint/{$id}/"); } } } diff --git a/src/applications/drydock/phid/DrydockPHIDTypeLease.php b/src/applications/drydock/phid/DrydockPHIDTypeLease.php index f3f34be0c7..55649c9d92 100644 --- a/src/applications/drydock/phid/DrydockPHIDTypeLease.php +++ b/src/applications/drydock/phid/DrydockPHIDTypeLease.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $lease = $objects[$phid]; $id = $lease->getID(); $handle->setURI("/drydock/lease/{$id}/"); } } } diff --git a/src/applications/drydock/phid/DrydockPHIDTypeResource.php b/src/applications/drydock/phid/DrydockPHIDTypeResource.php index f6bc00f689..ffe76c6e7a 100644 --- a/src/applications/drydock/phid/DrydockPHIDTypeResource.php +++ b/src/applications/drydock/phid/DrydockPHIDTypeResource.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $resource = $objects[$phid]; $id = $resource->getID(); $handle->setURI("/drydock/resource/{$id}/"); } } } diff --git a/src/applications/files/phid/PhabricatorFilePHIDTypeFile.php b/src/applications/files/phid/PhabricatorFilePHIDTypeFile.php index 1f6fe80df6..d655511a31 100644 --- a/src/applications/files/phid/PhabricatorFilePHIDTypeFile.php +++ b/src/applications/files/phid/PhabricatorFilePHIDTypeFile.php @@ -1,74 +1,70 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $file = $objects[$phid]; $id = $file->getID(); $name = $file->getName(); $uri = $file->getBestURI(); $handle->setName("F{$id}"); $handle->setFullName("F{$id}: {$name}"); $handle->setURI($uri); } } public function canLoadNamedObject($name) { return preg_match('/^F\d*[1-9]\d*$/', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PhabricatorFileQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuild.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuild.php index 22f0c8bb62..0977134c7a 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuild.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuild.php @@ -1,43 +1,39 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $build = $objects[$phid]; $handles[$phid]->setName(pht( 'Build %d: %s', $build->getID(), $build->getName())); $handles[$phid]->setURI( '/harbormaster/build/'.$build->getID()); } } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildItem.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildItem.php index 4d6fdb1982..83603ec079 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildItem.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildItem.php @@ -1,37 +1,33 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $build_item = $objects[$phid]; } } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildLog.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildLog.php index 385cbcaac6..2612d15556 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildLog.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildLog.php @@ -1,37 +1,33 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $build_log = $objects[$phid]; } } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildPlan.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildPlan.php index d5abaf8f0b..4449974422 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildPlan.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildPlan.php @@ -1,44 +1,40 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $build_plan = $objects[$phid]; $id = $build_plan->getID(); $handles[$phid]->setName(pht('Plan %d %s', $id, $build_plan->getName())); $handles[$phid]->setURI('/harbormaster/plan/'.$id.'/'); } } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildStep.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildStep.php index 3081f32e89..37500a0e73 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildStep.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildStep.php @@ -1,37 +1,33 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $build_step = $objects[$phid]; } } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildTarget.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildTarget.php index 7f893b77b7..fab5a58239 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildTarget.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildTarget.php @@ -1,37 +1,33 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $build_target = $objects[$phid]; } } } diff --git a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildable.php b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildable.php index 6b05ec6d50..d88dfcfc5c 100644 --- a/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildable.php +++ b/src/applications/harbormaster/phid/HarbormasterPHIDTypeBuildable.php @@ -1,74 +1,70 @@ withPHIDs($phids) ->needBuildableHandles(true); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $buildable = $objects[$phid]; $id = $buildable->getID(); $target = $buildable->getBuildableHandle()->getFullName(); $handle->setURI("/B{$id}"); $handle->setName("B{$id}"); $handle->setFullName("B{$id}: ".$target); } } public function canLoadNamedObject($name) { return preg_match('/^B\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new HarbormasterBuildableQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/herald/phid/HeraldPHIDTypeRule.php b/src/applications/herald/phid/HeraldPHIDTypeRule.php index 62b05c696d..3db09494dd 100644 --- a/src/applications/herald/phid/HeraldPHIDTypeRule.php +++ b/src/applications/herald/phid/HeraldPHIDTypeRule.php @@ -1,73 +1,69 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $rule = $objects[$phid]; $id = $rule->getID(); $name = $rule->getName(); $handle->setName("H{$id}"); $handle->setFullName("H{$id} {$name}"); $handle->setURI("/herald/rule/{$id}/"); } } public function canLoadNamedObject($name) { return preg_match('/^H\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new HeraldRuleQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php b/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php index 58cdc582fc..f187ee335f 100644 --- a/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php +++ b/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php @@ -1,74 +1,70 @@ withPHIDs($phids) ->needDocumentBodies(true); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $document = $objects[$phid]; $name = $document->getDocumentBody()->getTitle(); $handle->setName($document->getMonogram().' '.$name); $handle->setURI('/'.$document->getMonogram()); } } public function canLoadNamedObject($name) { return preg_match('/^L\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new LegalpadDocumentQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php b/src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php index 3c9aeb3ea0..9c883b77ab 100644 --- a/src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php +++ b/src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php @@ -1,48 +1,44 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $macro = $objects[$phid]; $id = $macro->getID(); $name = $macro->getName(); $handle->setName($name); $handle->setFullName(pht('Image Macro "%s"', $name)); $handle->setURI("/macro/view/{$id}/"); } } } diff --git a/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php b/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php index 3371d2cf0f..6f0c0de0fb 100644 --- a/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php +++ b/src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php @@ -1,75 +1,71 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $list = $objects[$phid]; $handle->setName($list->getName()); $handle->setURI($list->getURI()); } } public function canLoadNamedObject($name) { return preg_match('/^.+@.+/', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { // Maybe normalize these some day? $id = $name; $id_map[$id][] = $name; } $objects = id(new PhabricatorMailingListQuery()) ->setViewer($query->getViewer()) ->withEmails(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { $email = $object->getEmail(); foreach (idx($id_map, $email, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/maniphest/phid/ManiphestPHIDTypeTask.php b/src/applications/maniphest/phid/ManiphestPHIDTypeTask.php index 732ac82260..093c6aa388 100644 --- a/src/applications/maniphest/phid/ManiphestPHIDTypeTask.php +++ b/src/applications/maniphest/phid/ManiphestPHIDTypeTask.php @@ -1,80 +1,76 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $task = $objects[$phid]; $id = $task->getID(); $title = $task->getTitle(); $handle->setName("T{$id}"); $handle->setFullName("T{$id}: {$title}"); $handle->setURI("/T{$id}"); if ($task->isClosed()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } public function canLoadNamedObject($name) { return preg_match('/^T\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new ManiphestTaskQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php b/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php index 6ce6c27c6c..d35e43e6e8 100644 --- a/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php +++ b/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php @@ -1,41 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $application = $objects[$phid]; $handle->setName($application->getName()); $handle->setURI($application->getApplicationURI()); } } } diff --git a/src/applications/nuance/phid/NuancePHIDTypeItem.php b/src/applications/nuance/phid/NuancePHIDTypeItem.php index 41008847fd..79238343c8 100644 --- a/src/applications/nuance/phid/NuancePHIDTypeItem.php +++ b/src/applications/nuance/phid/NuancePHIDTypeItem.php @@ -1,42 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $item = $objects[$phid]; $handle->setName($item->getLabel($viewer)); $handle->setURI($item->getURI()); } } } diff --git a/src/applications/nuance/phid/NuancePHIDTypeQueue.php b/src/applications/nuance/phid/NuancePHIDTypeQueue.php index 964fe8d2ef..3f914e33ae 100644 --- a/src/applications/nuance/phid/NuancePHIDTypeQueue.php +++ b/src/applications/nuance/phid/NuancePHIDTypeQueue.php @@ -1,42 +1,38 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $queue = $objects[$phid]; $handle->setName($queue->getName()); $handle->setURI($queue->getURI()); } } } diff --git a/src/applications/nuance/phid/NuancePHIDTypeRequestor.php b/src/applications/nuance/phid/NuancePHIDTypeRequestor.php index d0d37f98d3..018c3581cb 100644 --- a/src/applications/nuance/phid/NuancePHIDTypeRequestor.php +++ b/src/applications/nuance/phid/NuancePHIDTypeRequestor.php @@ -1,42 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $requestor = $objects[$phid]; $handle->setName($requestor->getBestName()); $handle->setURI($requestor->getURI()); } } } diff --git a/src/applications/nuance/phid/NuancePHIDTypeSource.php b/src/applications/nuance/phid/NuancePHIDTypeSource.php index 78db3fb0e8..2d43d7ef89 100644 --- a/src/applications/nuance/phid/NuancePHIDTypeSource.php +++ b/src/applications/nuance/phid/NuancePHIDTypeSource.php @@ -1,42 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $source = $objects[$phid]; $handle->setName($source->getName()); $handle->setURI($source->getURI()); } } } diff --git a/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClient.php b/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClient.php index f66101a62f..a1776af81b 100644 --- a/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClient.php +++ b/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClient.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $client = $objects[$phid]; $handle->setName($client->getName()); } } } diff --git a/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClientAuthorization.php b/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClientAuthorization.php index 2784263667..9618ec1f8e 100644 --- a/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClientAuthorization.php +++ b/src/applications/oauthserver/phid/PhabricatorOAuthServerPHIDTypeClientAuthorization.php @@ -1,39 +1,35 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $authorization = $objects[$phid]; $handle->setName(pht('Authorization %d', $authorization->getID())); } } } diff --git a/src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php b/src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php index 6aff840c22..8c7a255114 100644 --- a/src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php +++ b/src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php @@ -1,47 +1,43 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $package = $objects[$phid]; $name = $package->getName(); $id = $package->getID(); $handle->setName($name); $handle->setURI("/owners/package/{$id}/"); } } } diff --git a/src/applications/passphrase/phid/PassphrasePHIDTypeCredential.php b/src/applications/passphrase/phid/PassphrasePHIDTypeCredential.php index ac7fedaa93..cfd994f9bd 100644 --- a/src/applications/passphrase/phid/PassphrasePHIDTypeCredential.php +++ b/src/applications/passphrase/phid/PassphrasePHIDTypeCredential.php @@ -1,76 +1,72 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $credential = $objects[$phid]; $id = $credential->getID(); $name = $credential->getName(); $handle->setName("K{$id}"); $handle->setFullName("K{$id} {$name}"); $handle->setURI("/K{$id}"); if ($credential->getIsDestroyed()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } public function canLoadNamedObject($name) { return preg_match('/^K\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PassphraseCredentialQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php b/src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php index 5e3ef4fd81..6256e2892c 100644 --- a/src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php +++ b/src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php @@ -1,73 +1,69 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $paste = $objects[$phid]; $id = $paste->getID(); $name = $paste->getFullName(); $handle->setName("P{$id}"); $handle->setFullName($name); $handle->setURI("/P{$id}"); } } public function canLoadNamedObject($name) { return preg_match('/^P\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PhabricatorPasteQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php b/src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php index f84d9f3a1a..96ac3f601d 100644 --- a/src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php +++ b/src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $account = $objects[$phid]; $display_name = $account->getDisplayName(); $handle->setName($display_name); } } } diff --git a/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php b/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php index 5f13d0e9a6..4be443a566 100644 --- a/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php +++ b/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php @@ -1,92 +1,88 @@ withPHIDs($phids) ->needProfileImage(true) ->needStatus(true); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $user = $objects[$phid]; $realname = $user->getRealName(); $handle->setName($user->getUsername()); $handle->setURI('/p/'.$user->getUsername().'/'); $handle->setFullName($user->getFullName()); $handle->setImageURI($user->loadProfileImageURI()); $handle->setDisabled(!$user->isUserActivated()); if ($user->hasStatus()) { $status = $user->getStatus(); $handle->setStatus($status->getTextStatus()); $handle->setTitle($status->getTerseSummary($query->getViewer())); } } } public function canLoadNamedObject($name) { return preg_match('/^@.+/', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = substr($name, 1); $id = phutil_utf8_strtolower($id); $id_map[$id][] = $name; } $objects = id(new PhabricatorPeopleQuery()) ->setViewer($query->getViewer()) ->withUsernames(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { $user_key = $object->getUsername(); $user_key = phutil_utf8_strtolower($user_key); foreach (idx($id_map, $user_key, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php b/src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php index 633182dd14..bc38181e5b 100644 --- a/src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php +++ b/src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $blog = $objects[$phid]; $handle->setName($blog->getName()); $handle->setFullName($blog->getName()); $handle->setURI('/phame/blog/view/'.$blog->getID().'/'); } } } diff --git a/src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php b/src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php index 240851a9c3..09080708d6 100644 --- a/src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php +++ b/src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $post = $objects[$phid]; $handle->setName($post->getTitle()); $handle->setFullName($post->getTitle()); $handle->setURI('/phame/post/view/'.$post->getID().'/'); } } } diff --git a/src/applications/phid/type/PhabricatorPHIDType.php b/src/applications/phid/type/PhabricatorPHIDType.php index e1d1647eb2..035f4214f0 100644 --- a/src/applications/phid/type/PhabricatorPHIDType.php +++ b/src/applications/phid/type/PhabricatorPHIDType.php @@ -1,203 +1,224 @@ getConstant('TYPECONST'); + if ($const === false) { + throw new Exception( + pht( + 'PHIDType class "%s" must define an TYPECONST property.', + get_class($this))); + } + + if (!is_string($const) || !preg_match('/^[A-Z]{4}$/', $const)) { + throw new Exception( + pht( + 'PHIDType class "%s" has an invalid TYPECONST property. PHID '. + 'constants must be a four character uppercase string.', + get_class($this))); + } + + return $const; + } + abstract public function getTypeName(); public function newObject() { return null; } public function getTypeIcon() { return null; } /** * Get the class name for the application this type belongs to. * * @return string|null Class name of the corresponding application, or null * if the type is not bound to an application. */ public function getPHIDTypeApplicationClass() { // TODO: Some day this should probably be abstract, but for now it only // affects global search and there's no real burning need to go classify // every PHID type. return null; } /** * Build a @{class:PhabricatorPolicyAwareQuery} to load objects of this type * by PHID. * * If you can not build a single query which satisfies this requirement, you * can provide a dummy implementation for this method and overload * @{method:loadObjects} instead. * * @param PhabricatorObjectQuery Query being executed. * @param list PHIDs to load. * @return PhabricatorPolicyAwareQuery Query object which loads the * specified PHIDs when executed. */ abstract protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids); /** * Load objects of this type, by PHID. For most PHID types, it is only * necessary to implement @{method:buildQueryForObjects} to get object * loading to work. * * @param PhabricatorObjectQuery Query being executed. * @param list PHIDs to load. * @return list Corresponding objects. */ public function loadObjects( PhabricatorObjectQuery $query, array $phids) { $object_query = $this->buildQueryForObjects($query, $phids) ->setViewer($query->getViewer()) ->setParentQuery($query); // If the user doesn't have permission to use the application at all, // just mark all the PHIDs as filtered. This primarily makes these // objects show up as "Restricted" instead of "Unknown" when loaded as // handles, which is technically true. if (!$object_query->canViewerUseQueryApplication()) { $object_query->addPolicyFilteredPHIDs(array_fuse($phids)); return array(); } return $object_query->execute(); } /** * Populate provided handles with application-specific data, like titles and * URIs. * * NOTE: The `$handles` and `$objects` lists are guaranteed to be nonempty * and have the same keys: subclasses are expected to load information only * for handles with visible objects. * * Because of this guarantee, a safe implementation will typically look like* * * foreach ($handles as $phid => $handle) { * $object = $objects[$phid]; * * $handle->setStuff($object->getStuff()); * // ... * } * * In general, an implementation should call `setName()` and `setURI()` on * each handle at a minimum. See @{class:PhabricatorObjectHandle} for other * handle properties. * * @param PhabricatorHandleQuery Issuing query object. * @param list Handles to populate with data. * @param list Objects for these PHIDs loaded by * @{method:buildQueryForObjects()}. * @return void */ abstract public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects); public function canLoadNamedObject($name) { return false; } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { throw new Exception('Not implemented!'); } /** * Get all known PHID types. * * To get PHID types a given user has access to, see * @{method:getAllInstalledTypes}. * * @return dict Map of type constants to types. */ public static function getAllTypes() { static $types; if ($types === null) { $objects = id(new PhutilSymbolLoader()) ->setAncestorClass(__CLASS__) ->loadObjects(); $map = array(); $original = array(); foreach ($objects as $object) { $type = $object->getTypeConstant(); if (isset($map[$type])) { $that_class = $original[$type]; $this_class = get_class($object); throw new Exception( "Two PhabricatorPHIDType classes ({$that_class}, {$this_class}) ". "both handle PHID type '{$type}'. A type may be handled by only ". "one class."); } $original[$type] = get_class($object); $map[$type] = $object; } $types = $map; } return $types; } /** * Get all PHID types of applications installed for a given viewer. * * @param PhabricatorUser Viewing user. * @return dict Map of constants to installed * types. */ public static function getAllInstalledTypes(PhabricatorUser $viewer) { $all_types = self::getAllTypes(); $installed_types = array(); $app_classes = array(); foreach ($all_types as $key => $type) { $app_class = $type->getPHIDTypeApplicationClass(); if ($app_class === null) { // If the PHID type isn't bound to an application, include it as // installed. $installed_types[$key] = $type; continue; } // Otherwise, we need to check if this application is installed before // including the PHID type. $app_classes[$app_class][$key] = $type; } if ($app_classes) { $apps = id(new PhabricatorApplicationQuery()) ->setViewer($viewer) ->withInstalled(true) ->withClasses(array_keys($app_classes)) ->execute(); foreach ($apps as $app_class => $app) { $installed_types += $app_classes[$app_class]; } } return $installed_types; } } diff --git a/src/applications/phlux/phid/PhluxPHIDTypeVariable.php b/src/applications/phlux/phid/PhluxPHIDTypeVariable.php index 165bc6d6e7..dc61151b86 100644 --- a/src/applications/phlux/phid/PhluxPHIDTypeVariable.php +++ b/src/applications/phlux/phid/PhluxPHIDTypeVariable.php @@ -1,43 +1,39 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $variable = $objects[$phid]; $key = $variable->getVariableKey(); $handle->setName($key); $handle->setFullName(pht('Variable "%s"', $key)); $handle->setURI("/phlux/view/{$key}/"); } } } diff --git a/src/applications/pholio/phid/PholioPHIDTypeImage.php b/src/applications/pholio/phid/PholioPHIDTypeImage.php index 54b806cc21..0df43956fc 100644 --- a/src/applications/pholio/phid/PholioPHIDTypeImage.php +++ b/src/applications/pholio/phid/PholioPHIDTypeImage.php @@ -1,45 +1,41 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $image = $objects[$phid]; $id = $image->getID(); $mock_id = $image->getMockID(); $name = $image->getName(); $handle->setURI("/M{$mock_id}/{$id}/"); $handle->setName($name); $handle->setFullName($name); } } } diff --git a/src/applications/pholio/phid/PholioPHIDTypeMock.php b/src/applications/pholio/phid/PholioPHIDTypeMock.php index 39025fcfd8..0cd08c8e68 100644 --- a/src/applications/pholio/phid/PholioPHIDTypeMock.php +++ b/src/applications/pholio/phid/PholioPHIDTypeMock.php @@ -1,81 +1,77 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $mock = $objects[$phid]; $id = $mock->getID(); $name = $mock->getName(); $handle->setURI("/M{$id}"); $handle->setName("M{$id}"); $handle->setFullName("M{$id}: {$name}"); if ($mock->isClosed()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } public function canLoadNamedObject($name) { return preg_match('/^M\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PholioMockQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/phragment/phid/PhragmentPHIDTypeFragment.php b/src/applications/phragment/phid/PhragmentPHIDTypeFragment.php index 0a5484911e..2b26e6717c 100644 --- a/src/applications/phragment/phid/PhragmentPHIDTypeFragment.php +++ b/src/applications/phragment/phid/PhragmentPHIDTypeFragment.php @@ -1,45 +1,40 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $fragment = $objects[$phid]; $handle->setName(pht( 'Fragment %s: %s', $fragment->getID(), $fragment->getName())); $handle->setURI($fragment->getURI()); } } } diff --git a/src/applications/phragment/phid/PhragmentPHIDTypeFragmentVersion.php b/src/applications/phragment/phid/PhragmentPHIDTypeFragmentVersion.php index b667625709..3811bd49e6 100644 --- a/src/applications/phragment/phid/PhragmentPHIDTypeFragmentVersion.php +++ b/src/applications/phragment/phid/PhragmentPHIDTypeFragmentVersion.php @@ -1,45 +1,40 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $version = $objects[$phid]; $handle->setName(pht( 'Fragment Version %d: %s', $version->getSequence(), $version->getFragment()->getName())); $handle->setURI($version->getURI()); } } } diff --git a/src/applications/phragment/phid/PhragmentPHIDTypeSnapshot.php b/src/applications/phragment/phid/PhragmentPHIDTypeSnapshot.php index 29e4c70884..235aaa34ad 100644 --- a/src/applications/phragment/phid/PhragmentPHIDTypeSnapshot.php +++ b/src/applications/phragment/phid/PhragmentPHIDTypeSnapshot.php @@ -1,44 +1,39 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { $viewer = $query->getViewer(); foreach ($handles as $phid => $handle) { $snapshot = $objects[$phid]; $handle->setName(pht( 'Snapshot: %s', $snapshot->getName())); $handle->setURI($snapshot->getURI()); } } } diff --git a/src/applications/phriction/phid/PhrictionPHIDTypeDocument.php b/src/applications/phriction/phid/PhrictionPHIDTypeDocument.php index 01034362c6..f043db7b18 100644 --- a/src/applications/phriction/phid/PhrictionPHIDTypeDocument.php +++ b/src/applications/phriction/phid/PhrictionPHIDTypeDocument.php @@ -1,54 +1,50 @@ withPHIDs($phids) ->needContent(true); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $document = $objects[$phid]; $content = $document->getContent(); $title = $content->getTitle(); $slug = $document->getSlug(); $status = $document->getStatus(); $handle->setName($title); $handle->setURI(PhrictionDocument::getSlugURI($slug)); if ($status != PhrictionDocumentStatus::STATUS_EXISTS) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } } diff --git a/src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php b/src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php index 784ad8926a..225aa22ac1 100644 --- a/src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php +++ b/src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php @@ -1,41 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $policy = $objects[$phid]; $handle->setName($policy->getName()); $handle->setURI($policy->getHref()); } } } diff --git a/src/applications/ponder/phid/PonderPHIDTypeAnswer.php b/src/applications/ponder/phid/PonderPHIDTypeAnswer.php index be6b4d6779..c4a6a7477c 100644 --- a/src/applications/ponder/phid/PonderPHIDTypeAnswer.php +++ b/src/applications/ponder/phid/PonderPHIDTypeAnswer.php @@ -1,42 +1,38 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $answer = $objects[$phid]; $id = $answer->getID(); $handle->setName("Answer {$id}"); $handle->setURI($answer->getURI()); } } } diff --git a/src/applications/ponder/phid/PonderPHIDTypeQuestion.php b/src/applications/ponder/phid/PonderPHIDTypeQuestion.php index 10000df7e0..d057241a95 100644 --- a/src/applications/ponder/phid/PonderPHIDTypeQuestion.php +++ b/src/applications/ponder/phid/PonderPHIDTypeQuestion.php @@ -1,76 +1,72 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $question = $objects[$phid]; $id = $question->getID(); $handle->setName("Q{$id}"); $handle->setURI("/Q{$id}"); $handle->setFullName($question->getFullTitle()); } } public function canLoadNamedObject($name) { return preg_match('/^Q\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PonderQuestionQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php index ff2e764a94..eb22f2ce79 100644 --- a/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php +++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php @@ -1,45 +1,41 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $column = $objects[$phid]; $handle->setName($column->getDisplayName()); $handle->setURI('/project/board/'.$column->getProject()->getID().'/'); $handle->setDisabled($column->isHidden()); } } } diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php index 9148a3e186..5b78350fae 100644 --- a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php +++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php @@ -1,115 +1,111 @@ withPHIDs($phids) ->needImages(true); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $project = $objects[$phid]; $name = $project->getName(); $id = $project->getID(); $slug = $project->getPrimarySlug(); $handle->setName($name); $handle->setObjectName('#'.$slug); $handle->setURI("/tag/{$slug}/"); $handle->setImageURI($project->getProfileImageURI()); $handle->setIcon($project->getIcon()); $handle->setTagColor($project->getColor()); if ($project->isArchived()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); } } } public static function getProjectMonogramPatternFragment() { // NOTE: See some discussion in ProjectRemarkupRule. return '[^\s,#]+'; } public function canLoadNamedObject($name) { $fragment = self::getProjectMonogramPatternFragment(); return preg_match('/^#'.$fragment.'$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { // If the user types "#YoloSwag", we still want to match "#yoloswag", so // we normalize, query, and then map back to the original inputs. $map = array(); foreach ($names as $key => $slug) { $map[$this->normalizeSlug(substr($slug, 1))][] = $slug; } $projects = id(new PhabricatorProjectQuery()) ->setViewer($query->getViewer()) ->withSlugs(array_keys($map)) ->needSlugs(true) ->execute(); $result = array(); foreach ($projects as $project) { $slugs = $project->getSlugs(); $slug_strs = mpull($slugs, 'getSlug'); foreach ($slug_strs as $slug) { $slug_map = idx($map, $slug, array()); foreach ($slug_map as $original) { $result[$original] = $project; } } } return $result; } private function normalizeSlug($slug) { // NOTE: We're using phutil_utf8_strtolower() (and not PhabricatorSlug's // normalize() method) because this normalization should be only somewhat // liberal. We want "#YOLO" to match against "#yolo", but "#\\yo!!lo" // should not. normalize() strips out most punctuation and leads to // excessively aggressive matches. return phutil_utf8_strtolower($slug); } } diff --git a/src/applications/releeph/phid/ReleephPHIDTypeBranch.php b/src/applications/releeph/phid/ReleephPHIDTypeBranch.php index 8978d77853..926021ef1c 100644 --- a/src/applications/releeph/phid/ReleephPHIDTypeBranch.php +++ b/src/applications/releeph/phid/ReleephPHIDTypeBranch.php @@ -1,41 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $branch = $objects[$phid]; $handle->setURI($branch->getURI()); $handle->setName($branch->getBasename()); $handle->setFullName($branch->getName()); } } } diff --git a/src/applications/releeph/phid/ReleephPHIDTypeProduct.php b/src/applications/releeph/phid/ReleephPHIDTypeProduct.php index da7a0a63d9..61bc5c536e 100644 --- a/src/applications/releeph/phid/ReleephPHIDTypeProduct.php +++ b/src/applications/releeph/phid/ReleephPHIDTypeProduct.php @@ -1,40 +1,36 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $product = $objects[$phid]; $handle->setName($product->getName()); $handle->setURI($product->getURI()); } } } diff --git a/src/applications/releeph/phid/ReleephPHIDTypeRequest.php b/src/applications/releeph/phid/ReleephPHIDTypeRequest.php index 36466d86ff..f5352350c1 100644 --- a/src/applications/releeph/phid/ReleephPHIDTypeRequest.php +++ b/src/applications/releeph/phid/ReleephPHIDTypeRequest.php @@ -1,44 +1,40 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $request = $objects[$phid]; $id = $request->getID(); $title = $request->getSummaryForDisplay(); $handle->setURI("/RQ{$id}"); $handle->setName($title); $handle->setFullName("RQ{$id}: {$title}"); } } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php index e42ae18460..dcbb76b3ed 100644 --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php @@ -1,39 +1,35 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $project = $objects[$phid]; $handle->setName($project->getName()); } } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php index 62075cabfb..acd548de05 100644 --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php @@ -1,87 +1,83 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $commit = $objects[$phid]; $repository = $commit->getRepository(); $commit_identifier = $commit->getCommitIdentifier(); $name = $repository->formatCommitName($commit_identifier); $summary = $commit->getSummary(); if (strlen($summary)) { $full_name = $name.': '.$summary; } else { $full_name = $name; } $handle->setName($name); $handle->setFullName($full_name); $handle->setURI($commit->getURI()); $handle->setTimestamp($commit->getEpoch()); } } public static function getCommitObjectNamePattern() { $min_unqualified = PhabricatorRepository::MINIMUM_UNQUALIFIED_HASH; $min_qualified = PhabricatorRepository::MINIMUM_QUALIFIED_HASH; return 'r[A-Z]+[1-9]\d*'. '|'. 'r[A-Z]+[a-f0-9]{'.$min_qualified.',40}'. '|'. '[a-f0-9]{'.$min_unqualified.',40}'; } public function canLoadNamedObject($name) { $pattern = self::getCommitObjectNamePattern(); return preg_match('(^'.$pattern.'$)', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $query = id(new DiffusionCommitQuery()) ->setViewer($query->getViewer()) ->withIdentifiers($names); $query->execute(); return $query->getIdentifierMap(); } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeMirror.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeMirror.php index 8dcf103dc8..541893844e 100644 --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeMirror.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeMirror.php @@ -1,42 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $mirror = $objects[$phid]; $handle->setName( pht('Mirror %d %s', $mirror->getID(), $mirror->getRemoteURI())); $handle->setURI('/diffusion/mirror/'.$mirror->getID().'/'); } } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php index 800101f863..95daf9d2be 100644 --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php @@ -1,40 +1,35 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $event = $objects[$phid]; $handle->setName(pht('Push Event %d', $event->getID())); } } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushLog.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushLog.php index a2e5e57133..c734b05b6c 100644 --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushLog.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushLog.php @@ -1,40 +1,35 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $log = $objects[$phid]; $handle->setName(pht('Push Log %d', $log->getID())); } } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php index 4b92c2d6b3..7f20c3d02d 100644 --- a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php +++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php @@ -1,80 +1,76 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $repository = $objects[$phid]; $monogram = $repository->getMonogram(); $callsign = $repository->getCallsign(); $name = $repository->getName(); $handle->setName($monogram); $handle->setFullName("{$monogram} {$name}"); $handle->setURI("/diffusion/{$callsign}/"); } } public function canLoadNamedObject($name) { return preg_match('/^r[A-Z]+$/', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PhabricatorRepositoryQuery()) ->setViewer($query->getViewer()) ->withCallsigns(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $object) { $callsign = $object->getCallsign(); foreach (idx($id_map, $callsign, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php b/src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php index 36ad531375..834b70c698 100644 --- a/src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php +++ b/src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php @@ -1,70 +1,66 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $poll = $objects[$phid]; $handle->setName('V'.$poll->getID()); $handle->setFullName('V'.$poll->getID().': '.$poll->getQuestion()); $handle->setURI('/V'.$poll->getID()); } } public function canLoadNamedObject($name) { return preg_match('/^V\d*[1-9]\d*$/i', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { $id_map = array(); foreach ($names as $name) { $id = (int)substr($name, 1); $id_map[$id][] = $name; } $objects = id(new PhabricatorSlowvoteQuery()) ->setViewer($query->getViewer()) ->withIDs(array_keys($id_map)) ->execute(); $results = array(); foreach ($objects as $id => $object) { foreach (idx($id_map, $id, array()) as $name) { $results[$name] = $object; } } return $results; } } diff --git a/src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php b/src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php index c641a1efbd..ee5e5375ab 100644 --- a/src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php +++ b/src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php @@ -1,41 +1,37 @@ withPHIDs($phids); } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { foreach ($handles as $phid => $handle) { $token = $objects[$phid]; $name = $token->getName(); $handle->setName("{$name} Token"); } } } diff --git a/src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php b/src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php index 97841ba04f..195686d7bb 100644 --- a/src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php +++ b/src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php @@ -1,92 +1,88 @@ setAncestorClass('PhabricatorApplicationTransactionQuery') ->loadObjects(); $queries = array(); foreach ($objects as $object) { $type = $object ->getTemplateApplicationTransaction() ->getApplicationTransactionType(); $queries[$type] = $object; } } $phid_subtypes = array(); foreach ($phids as $phid) { $subtype = phid_get_subtype($phid); if ($subtype) { $phid_subtypes[$subtype][] = $phid; } } $results = array(); foreach ($phid_subtypes as $subtype => $subtype_phids) { $query = idx($queries, $subtype); if (!$query) { continue; } $xaction_query = id(clone $query) ->setViewer($object_query->getViewer()) ->setParentQuery($object_query) ->withPHIDs($subtype_phids); if (!$xaction_query->canViewerUseQueryApplication()) { $object_query->addPolicyFilteredPHIDs(array_fuse($subtype_phids)); continue; } $xactions = $xaction_query->execute(); $results += mpull($xactions, null, 'getPHID'); } return $results; } public function loadHandles( PhabricatorHandleQuery $query, array $handles, array $objects) { // NOTE: We don't produce meaningful handles here because they're // impractical to produce and no application uses them. } }