protected function loadPage() { $macro_table = new PhabricatorFileImageMacro(); $conn = $macro_table->establishConnection('r'); $rows = queryfx_all($conn, 'SELECT m.* FROM %T m %Q %Q %Q', $macro_table->getTableName(), $this->buildWhereClause($conn), $this->buildOrderClause($conn), $this->buildLimitClause($conn)); return $macro_table->loadAllFromArray($rows); }
public function loadPage() { $table = new DrydockLease(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT lease.* FROM %T lease %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
protected function loadPage() { $table = new PhortunePaymentProviderConfig(); $conn = $table->establishConnection('r'); $rows = queryfx_all($conn, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn), $this->buildOrderClause($conn), $this->buildLimitClause($conn)); return $table->loadAllFromArray($rows); }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $offset = $request->getInt('offset', 0); $pager = new AphrontPagerView(); $pager->setPageSize(250); $pager->setOffset($offset); $pager->setURI($request->getRequestURI(), 'offset'); $list = new PhabricatorMetaMTAMailingList(); $conn_r = $list->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T ORDER BY name ASC LIMIT %d, %d', $list->getTableName(), $pager->getOffset(), $pager->getPageSize() + 1); $data = $pager->sliceResults($data); $lists = $list->loadAllFromArray($data); $rows = array(); foreach ($lists as $list) { $rows[] = array(phutil_escape_html($list->getName()), phutil_escape_html($list->getEmail()), phutil_render_tag('a', array('class' => 'button grey small', 'href' => $this->getApplicationURI('/edit/' . $list->getID() . '/')), 'Edit')); } $table = new AphrontTableView($rows); $table->setHeaders(array('Name', 'Email', '')); $table->setColumnClasses(array(null, 'wide', 'action')); $panel = new AphrontPanelView(); $panel->appendChild($table); $panel->setHeader('Mailing Lists'); $panel->setCreateButton('Add New List', $this->getApplicationURI('/edit/')); $panel->appendChild($pager); return $this->buildApplicationPage($panel, array('title' => 'Mailing Lists')); }
public function loadPage() { $table = new PhabricatorConduitMethodCallLog(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
private function loadPolls(AphrontPagerView $pager, $view) { $request = $this->getRequest(); $user = $request->getUser(); $poll = new PhabricatorSlowvotePoll(); $conn = $poll->establishConnection('r'); $offset = $pager->getOffset(); $limit = $pager->getPageSize() + 1; switch ($view) { case self::VIEW_ALL: $data = queryfx_all($conn, 'SELECT * FROM %T ORDER BY id DESC LIMIT %d, %d', $poll->getTableName(), $offset, $limit); break; case self::VIEW_CREATED: $data = queryfx_all($conn, 'SELECT * FROM %T WHERE authorPHID = %s ORDER BY id DESC LIMIT %d, %d', $poll->getTableName(), $user->getPHID(), $offset, $limit); break; case self::VIEW_VOTED: $choice = new PhabricatorSlowvoteChoice(); $data = queryfx_all($conn, 'SELECT p.* FROM %T p JOIN %T o ON o.pollID = p.id WHERE o.authorPHID = %s GROUP BY p.id ORDER BY p.id DESC LIMIT %d, %d', $poll->getTableName(), $choice->getTableName(), $user->getPHID(), $offset, $limit); break; } $data = $pager->sliceResults($data); return $poll->loadAllFromArray($data); }
protected function loadPage() { $table = new NuanceQueue(); $conn = $table->establishConnection('r'); $data = queryfx_all($conn, '%Q FROM %T %Q %Q %Q', $this->buildSelectClause($conn), $table->getTableName(), $this->buildWhereClause($conn), $this->buildOrderClause($conn), $this->buildLimitClause($conn)); return $table->loadAllFromArray($data); }
public function loadPage() { $table = new PhabricatorProject(); $conn_r = $table->establishConnection('r'); // NOTE: Because visibility checks for projects depend on whether or not // the user is a project member, we always load their membership. If we're // loading all members anyway we can piggyback on that; otherwise we // do an explicit join. $select_clause = ''; if (!$this->needMembers) { $select_clause = ', vm.dst viewerIsMember'; } $data = queryfx_all($conn_r, 'SELECT p.* %Q FROM %T p %Q %Q %Q %Q %Q', $select_clause, $table->getTableName(), $this->buildJoinClause($conn_r), $this->buildWhereClause($conn_r), $this->buildGroupClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); $projects = $table->loadAllFromArray($data); if ($projects) { $viewer_phid = $this->getViewer()->getPHID(); if ($this->needMembers) { $etype = PhabricatorEdgeConfig::TYPE_PROJ_MEMBER; $members = id(new PhabricatorEdgeQuery())->withSourcePHIDs(mpull($projects, 'getPHID'))->withEdgeTypes(array($etype))->execute(); foreach ($projects as $project) { $phid = $project->getPHID(); $project->attachMemberPHIDs(array_keys($members[$phid][$etype])); $project->setIsUserMember($viewer_phid, isset($members[$phid][$etype][$viewer_phid])); } } else { foreach ($data as $row) { $projects[$row['id']]->setIsUserMember($viewer_phid, $row['viewerIsMember'] !== null); } } } return $projects; }
public function execute() { $task_table = new PhabricatorWorkerArchiveTask(); $conn_r = $task_table->establishConnection('r'); $rows = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $task_table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $task_table->loadAllFromArray($rows); }
public function execute() { $table = new PhabricatorFlag(); $conn_r = $table->establishConnection('r'); $where = $this->buildWhereClause($conn_r); $limit = $this->buildLimitClause($conn_r); $order = $this->buildOrderClause($conn_r); $data = queryfx_all($conn_r, 'SELECT * FROM %T flag %Q %Q %Q', $table->getTableName(), $where, $order, $limit); $flags = $table->loadAllFromArray($data); if ($this->needHandles || $this->needObjects) { $phids = ipull($data, 'objectPHID'); $query = new PhabricatorObjectHandleData($phids); if ($this->needHandles) { $handles = $query->loadHandles(); foreach ($flags as $flag) { $handle = idx($handles, $flag->getObjectPHID()); if ($handle) { $flag->attachHandle($handle); } } } if ($this->needObjects) { $objects = $query->loadObjects(); foreach ($flags as $flag) { $object = idx($objects, $flag->getObjectPHID()); if ($object) { $flag->attachObject($object); } } } } return $flags; }
protected function executeQuery() { $drequest = $this->getRequest(); $repository = $drequest->getRepository(); $commit = $drequest->loadCommit(); $raw_changes = queryfx_all($repository->establishConnection('r'), 'SELECT c.*, p.path pathName, t.path targetPathName FROM %T c LEFT JOIN %T p ON c.pathID = p.id LEFT JOIN %T t on c.targetPathID = t.id WHERE c.commitID = %d AND isDirect = 1', PhabricatorRepository::TABLE_PATHCHANGE, PhabricatorRepository::TABLE_PATH, PhabricatorRepository::TABLE_PATH, $commit->getID()); $changes = array(); $raw_changes = isort($raw_changes, 'pathName'); foreach ($raw_changes as $raw_change) { $type = $raw_change['changeType']; if ($type == DifferentialChangeType::TYPE_CHILD) { continue; } $change = new DiffusionPathChange(); $change->setPath(ltrim($raw_change['pathName'], '/')); $change->setChangeType($raw_change['changeType']); $change->setFileType($raw_change['fileType']); $change->setCommitIdentifier($commit->getCommitIdentifier()); $changes[] = $change; } return $changes; }
private function renderListPanel() { if (!$this->packagePHID) { return id(new AphrontErrorView())->setSeverity(AphrontErrorView::SEVERITY_NOTICE)->setTitle('No package seleted. Please select one from above.'); } $package = id(new PhabricatorOwnersPackage())->loadOneWhere("phid = %s", $this->packagePHID); if ($this->view === 'audit' && !$package->getAuditingEnabled()) { return id(new AphrontErrorView())->setSeverity(AphrontErrorView::SEVERITY_NOTICE)->setTitle("Package doesn't have auditing enabled. " . "Please choose another one."); } $conn_r = id(new PhabricatorOwnersPackageCommitRelationship())->establishConnection('r'); $status_arr = $this->getStatusArr(); $offset = $this->request->getInt('offset', 0); $pager = new AphrontPagerView(); $pager->setPageSize(50); $pager->setOffset($offset); $pager->setURI($this->request->getRequestURI(), 'offset'); $data = queryfx_all($conn_r, 'SELECT commitPHID, auditStatus, auditReasons FROM %T WHERE packagePHID = %s AND auditStatus in (%Ls) ORDER BY id DESC LIMIT %d, %d', id(new PhabricatorOwnersPackageCommitRelationship())->getTableName(), $package->getPHID(), $status_arr, $pager->getOffset(), $pager->getPageSize() + 1); $data = $pager->sliceResults($data); $data = ipull($data, null, 'commitPHID'); $list_panel = $this->renderCommitTable($data, $package); $list_panel->appendChild($pager); return $list_panel; }
protected function loadPage() { $table = new PhortuneProduct(); $conn = $table->establishConnection('r'); $rows = queryfx_all($conn, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn), $this->buildOrderClause($conn), $this->buildLimitClause($conn)); $page = $table->loadAllFromArray($rows); // NOTE: We're loading product implementations here, but also creating any // products which do not yet exist. $class_map = mgroup($page, 'getProductClass'); if ($this->refMap) { $class_map += array_fill_keys(array_keys($this->refMap), array()); } foreach ($class_map as $class => $products) { $refs = mpull($products, null, 'getProductRef'); if (isset($this->refMap[$class])) { $refs += array_fill_keys($this->refMap[$class], null); } $implementations = newv($class, array())->loadImplementationsForRefs($this->getViewer(), array_keys($refs)); $implementations = mpull($implementations, null, 'getRef'); foreach ($implementations as $ref => $implementation) { $product = idx($refs, $ref); if ($product === null) { // If this product does not exist yet, create it and add it to the // result page. $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); $product = PhortuneProduct::initializeNewProduct()->setProductClass($class)->setProductRef($ref)->save(); unset($unguarded); $page[] = $product; } $product->attachImplementation($implementation); } } return $page; }
protected function loadPage() { $question = new PonderQuestion(); $conn_r = $question->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT q.* FROM %T q %Q %Q %Q %Q', $question->getTableName(), $this->buildJoinsClause($conn_r), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $question->loadAllFromArray($data); }
private function loadDocuments(AphrontPagerView $pager) { // TODO: Do we want/need a query object for this? $document_dao = new PhrictionDocument(); $content_dao = new PhrictionContent(); $conn = $document_dao->establishConnection('r'); switch ($this->view) { case 'all': $data = queryfx_all($conn, 'SELECT * FROM %T ORDER BY id DESC LIMIT %d, %d', $document_dao->getTableName(), $pager->getOffset(), $pager->getPageSize() + 1); break; case 'updates': // TODO: This query is a little suspicious, verify we don't need to key // or change it once we get more data. $data = queryfx_all($conn, 'SELECT d.* FROM %T d JOIN %T c ON c.documentID = d.id GROUP BY c.documentID ORDER BY MAX(c.id) DESC LIMIT %d, %d', $document_dao->getTableName(), $content_dao->getTableName(), $pager->getOffset(), $pager->getPageSize() + 1); break; default: throw new Exception("Unknown view '{$this->view}'!"); } $data = $pager->sliceResults($data); $documents = $document_dao->loadAllFromArray($data); if ($documents) { $content = $content_dao->loadAllWhere('documentID IN (%Ld)', mpull($documents, 'getID')); $content = mpull($content, null, 'getDocumentID'); foreach ($documents as $document) { $document->attachContent($content[$document->getID()]); } } return $documents; }
public function getKeys(array $keys) { $results = array(); if ($keys) { $map = $this->digestKeys($keys); $rows = queryfx_all($this->establishConnection('r'), 'SELECT * FROM %T WHERE cacheKeyHash IN (%Ls)', $this->getTableName(), $map); $rows = ipull($rows, null, 'cacheKey'); foreach ($keys as $key) { if (empty($rows[$key])) { continue; } $row = $rows[$key]; if ($row['cacheExpires'] && $row['cacheExpires'] < time()) { continue; } try { $results[$key] = $this->didReadValue($row['cacheFormat'], $row['cacheData']); } catch (Exception $ex) { // Treat this as a cache miss. phlog($ex); } } } return $results; }
public function apply($text) { // NOTE: Negative lookahead for period prevents us from picking up email // addresses, while allowing constructs like "@tomo, lol". The negative // lookbehind for a word character prevents us from matching "mail@lists" // while allowing "@tomo/@mroch". The negative lookahead prevents us from // matching "@joe.com" while allowing us to match "hey, @joe.". $regexp = '/(?<!\\w)@([a-zA-Z0-9]+)\\b(?![.]\\w)/'; $matches = null; $ok = preg_match_all($regexp, $text, $matches); if (!$ok) { // No mentions in this text. return $text; } $usernames = $matches[1]; // TODO: This is a little sketchy perf-wise. Once APC comes up, it is an // ideal candidate to back with an APC cache. $user_table = new PhabricatorUser(); $real_user_names = queryfx_all($user_table->establishConnection('r'), 'SELECT username, phid, realName FROM %T WHERE username IN (%Ls)', $user_table->getTableName(), $usernames); $engine = $this->getEngine(); $metadata_key = 'phabricator.mentioned-user-phids'; $mentioned = $engine->getTextMetadata($metadata_key, array()); foreach ($real_user_names as $row) { $this->actualUsers[strtolower($row['username'])] = $row; $mentioned[$row['phid']] = $row['phid']; } $engine->setTextMetadata($metadata_key, $mentioned); return preg_replace_callback($regexp, array($this, 'markupMention'), $text); }
private function loadComments($phid) { $table = new DifferentialComment(); $conn_r = $table->establishConnection('r'); $rows = queryfx_all($conn_r, 'SELECT comments.* FROM %T comments ' . 'JOIN (' . ' SELECT revisionID FROM %T WHERE objectPHID = %s ' . ' UNION ALL ' . ' SELECT id from differential_revision WHERE authorPHID = %s) rel ' . 'ON (comments.revisionID = rel.revisionID)' . 'WHERE comments.action = %s' . 'AND comments.authorPHID = %s', $table->getTableName(), DifferentialRevision::RELATIONSHIP_TABLE, $phid, $phid, $this->filter, $phid); return $table->loadAllFromArray($rows); }
protected function loadPage() { $table = new PassphraseCredential(); $conn_r = $table->establishConnection('r'); $rows = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($rows); }
public function loadPage() { $table = new PhragmentSnapshotChild(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
public function execute() { $table = new ConpherenceParticipant(); $conn_r = $table->establishConnection('r'); $rows = queryfx_all($conn_r, 'SELECT COUNT(*) as count, participantPHID ' . 'FROM %T participant %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildGroupByClause($conn_r), $this->buildLimitClause($conn_r)); return ipull($rows, 'count', 'participantPHID'); }
public function execute() { $conn_r = id(new PhabricatorRepository())->establishConnection('r'); $where = $this->buildWhereClause($conn_r); $results = queryfx_all($conn_r, 'SELECT * FROM %T %Q', PhabricatorRepository::TABLE_PATH, $where); return ipull($results, null, 'id'); }
protected function loadPage() { $table = new HarbormasterBuild(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
protected function loadPage() { $table = $this->getTemplateApplicationTransaction(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T x %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); $xactions = $table->loadAllFromArray($data); foreach ($xactions as $xaction) { $xaction->attachViewer($this->getViewer()); } if ($this->needComments) { $comment_phids = array_filter(mpull($xactions, 'getCommentPHID')); $comments = array(); if ($comment_phids) { $comments = id(new PhabricatorApplicationTransactionTemplatedCommentQuery())->setTemplate($table->getApplicationTransactionCommentObject())->setViewer($this->getViewer())->withPHIDs($comment_phids)->execute(); $comments = mpull($comments, null, 'getPHID'); } foreach ($xactions as $xaction) { if ($xaction->getCommentPHID()) { $comment = idx($comments, $xaction->getCommentPHID()); if ($comment) { $xaction->attachComment($comment); } } } } else { foreach ($xactions as $xaction) { $xaction->setCommentNotLoaded(true); } } return $xactions; }
protected function loadPage() { $table = new PhrictionDocument(); $conn_r = $table->establishConnection('r'); $rows = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); $documents = $table->loadAllFromArray($rows); if ($documents) { $ancestor_slugs = array(); foreach ($documents as $key => $document) { $document_slug = $document->getSlug(); foreach (PhabricatorSlug::getAncestry($document_slug) as $ancestor) { $ancestor_slugs[$ancestor][] = $key; } } if ($ancestor_slugs) { $ancestors = queryfx_all($conn_r, 'SELECT * FROM %T WHERE slug IN (%Ls)', $document->getTableName(), array_keys($ancestor_slugs)); $ancestors = $table->loadAllFromArray($ancestors); $ancestors = mpull($ancestors, null, 'getSlug'); foreach ($ancestor_slugs as $ancestor_slug => $document_keys) { $ancestor = idx($ancestors, $ancestor_slug); foreach ($document_keys as $document_key) { $documents[$document_key]->attachAncestor($ancestor_slug, $ancestor); } } } } return $documents; }
public function didMarkupText() { $engine = $this->getEngine(); $metadata_key = self::KEY_RULE_MENTION; $metadata = $engine->getTextMetadata($metadata_key, array()); if (empty($metadata)) { // No mentions, or we already processed them. return; } $usernames = array_keys($metadata); $user_table = new PhabricatorUser(); $real_user_names = queryfx_all($user_table->establishConnection('r'), 'SELECT username, phid, realName FROM %T WHERE username IN (%Ls)', $user_table->getTableName(), $usernames); $actual_users = array(); $mentioned_key = self::KEY_MENTIONED; $mentioned = $engine->getTextMetadata($mentioned_key, array()); foreach ($real_user_names as $row) { $actual_users[strtolower($row['username'])] = $row; $mentioned[$row['phid']] = $row['phid']; } $engine->setTextMetadata($mentioned_key, $mentioned); foreach ($metadata as $username => $tokens) { $exists = isset($actual_users[$username]); $class = $exists ? 'phabricator-remarkup-mention-exists' : 'phabricator-remarkup-mention-unknown'; if ($exists) { $tag = phutil_render_tag('a', array('class' => $class, 'href' => '/p/' . $username . '/', 'target' => '_blank', 'title' => $actual_users[$username]['realName']), phutil_escape_html('@' . $username)); } else { $tag = phutil_render_tag('span', array('class' => $class), phutil_escape_html('@' . $username)); } foreach ($tokens as $token) { $engine->overwriteStoredText($token, $tag); } } // Don't re-process these mentions. $engine->setTextMetadata($metadata_key, array()); }
private function buildChartForm() { $request = $this->getRequest(); $user = $request->getUser(); $table = new PhabricatorFactRaw(); $conn_r = $table->establishConnection('r'); $table_name = $table->getTableName(); $facts = queryfx_all($conn_r, 'SELECT DISTINCT factType from %T', $table_name); $specs = PhabricatorFactSpec::newSpecsForFactTypes(PhabricatorFactEngine::loadAllEngines(), ipull($facts, 'factType')); $options = array(); foreach ($specs as $spec) { if ($spec->getUnit() == PhabricatorFactSpec::UNIT_COUNT) { $options[$spec->getType()] = $spec->getName(); } } if (!$options) { return id(new AphrontErrorView())->setSeverity(AphrontErrorView::SEVERITY_NOTICE)->setTitle(pht('No Chartable Facts'))->appendChild('<p>' . pht('There are no facts that can be plotted yet.') . '</p>'); } $form = id(new AphrontFormView())->setUser($user)->appendChild(id(new AphrontFormSelectControl())->setLabel('Y-Axis')->setName('y1')->setOptions($options))->appendChild(id(new AphrontFormSubmitControl())->setValue('Plot Chart')); $panel = new AphrontPanelView(); $panel->appendChild($form); $panel->setWidth(AphrontPanelView::WIDTH_FORM); $panel->setHeader('Plot Chart'); return $panel; }
public function loadPage() { $answer = new PonderAnswer(); $conn_r = $answer->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT a.* FROM %T a %Q %Q %Q', $answer->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $answer->loadAllFromArray($data); }
protected function loadPage() { $table = new PhabricatorRepositoryPushEvent(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
public function execute() { $table = new PhabricatorRepositoryCommit(); $conn_r = $table->establishConnection('r'); $join = $this->buildJoinClause($conn_r); $where = $this->buildWhereClause($conn_r); $order = $this->buildOrderClause($conn_r); $limit = $this->buildLimitClause($conn_r); $data = queryfx_all($conn_r, 'SELECT c.* FROM %T c %Q %Q %Q %Q', $table->getTableName(), $join, $where, $order, $limit); $commits = $table->loadAllFromArray($data); if ($this->needCommitData && $commits) { $data = id(new PhabricatorRepositoryCommitData())->loadAllWhere('commitID in (%Ld)', mpull($commits, 'getID')); $data = mpull($data, null, 'getCommitID'); foreach ($commits as $commit) { if (idx($data, $commit->getID())) { $commit->attachCommitData($data[$commit->getID()]); } else { $commit->attachCommitData(new PhabricatorRepositoryCommitData()); } } } if ($this->needAudits && $commits) { $audits = id(new PhabricatorAuditComment())->loadAllWhere('targetPHID in (%Ls)', mpull($commits, 'getPHID')); $audits = mgroup($audits, 'getTargetPHID'); foreach ($commits as $commit) { $commit->attachAudits(idx($audits, $commit->getPHID(), array())); } } return $commits; }