protected function execute(ConduitAPIRequest $request) { $arc_project_name = $request->getValue('arcProjectName'); if ($arc_project_name) { $arc_project = id(new PhabricatorRepositoryArcanistProject())->loadOneWhere('name = %s', $arc_project_name); if (!$arc_project) { throw id(new ConduitException('ERR_UNKNOWN_ARC'))->setErrorDescription("Unknown Arcanist project '{$arc_project_name}': " . "are you using the correct Conduit URI?"); } $releeph_projects = id(new ReleephProject())->loadAllWhere('arcanistProjectID = %d', $arc_project->getID()); } else { $releeph_projects = id(new ReleephProject())->loadAll(); } $releeph_projects = mfilter($releeph_projects, 'getIsActive'); $result = array(); foreach ($releeph_projects as $releeph_project) { $selector = $releeph_project->getReleephFieldSelector(); $fields = $selector->getFieldSpecifications(); $fields_info = array(); foreach ($fields as $field) { $field->setReleephProject($releeph_project); if ($field->isEditable()) { $key = $field->getKeyForConduit(); $fields_info[$key] = array('class' => get_class($field), 'name' => $field->getName(), 'key' => $key, 'arcHelp' => $field->renderHelpForArcanist()); } } $releeph_branches = mfilter(id(new ReleephBranch())->loadAllWhere('releephProjectID = %d', $releeph_project->getID()), 'getIsActive'); $releeph_branches_struct = array(); foreach ($releeph_branches as $branch) { $releeph_branches_struct[] = array('branchName' => $branch->getName(), 'projectName' => $releeph_project->getName(), 'projectPHID' => $releeph_project->getPHID(), 'branchPHID' => $branch->getPHID()); } $result[] = array('projectName' => $releeph_project->getName(), 'projectPHID' => $releeph_project->getPHID(), 'branches' => $releeph_branches_struct, 'fields' => $fields_info); } return $result; }
public function renderEditControl(array $handles) { $engines = id(new PhutilSymbolLoader())->setAncestorClass('PhabricatorApplicationSearchEngine')->loadObjects(); $engines = mfilter($engines, 'canUseInPanelContext'); $value = $this->getFieldValue(); $queries = array(); $seen = false; foreach ($engines as $engine_class => $engine) { $engine->setViewer($this->getViewer()); $engine_queries = $engine->loadEnabledNamedQueries(); $query_map = mpull($engine_queries, 'getQueryName', 'getQueryKey'); asort($query_map); foreach ($query_map as $key => $name) { $queries[$engine_class][] = array('key' => $key, 'name' => $name); if ($key == $value) { $seen = true; } } } if (strlen($value) && !$seen) { $name = pht('Custom Query ("%s")', $value); } else { $name = pht('(None)'); } $options = array($value => $name); $app_control_key = $this->getFieldConfigValue('control.application'); Javelin::initBehavior('dashboard-query-panel-select', array('applicationID' => $this->getFieldControlID($app_control_key), 'queryID' => $this->getFieldControlID(), 'options' => $queries, 'value' => array('key' => strlen($value) ? $value : null, 'name' => $name))); return id(new AphrontFormSelectControl())->setID($this->getFieldControlID())->setLabel($this->getFieldName())->setCaption($this->getCaption())->setName($this->getFieldKey())->setValue($this->getFieldValue())->setOptions($options); }
private function loadArcProjects() { $viewer = $this->getRequest()->getUser(); $projects = id(new PhabricatorRepositoryArcanistProjectQuery())->setViewer($viewer)->needRepositories(true)->execute(); $projects = mfilter($projects, 'getRepository'); $projects = msort($projects, 'getName'); return $projects; }
public function testMFilterWithEmptyValueNegateFiltered() { $a = new MFilterTestHelper('o', 'p', 'q'); $b = new MFilterTestHelper('o', '', 'q'); $c = new MFilterTestHelper('o', 'p', 'q'); $list = ['a' => $a, 'b' => $b, 'c' => $c]; $actual = mfilter($list, 'getI', true); $expected = ['b' => $b]; $this->assertEquals($expected, $actual); }
public function renderEditControl(array $handles) { $engines = id(new PhutilSymbolLoader())->setAncestorClass('PhabricatorApplicationSearchEngine')->loadObjects(); $engines = mfilter($engines, 'canUseInPanelContext'); $all_apps = id(new PhabricatorApplicationQuery())->setViewer($this->getViewer())->withUnlisted(false)->withInstalled(true)->execute(); foreach ($engines as $index => $engine) { if (!isset($all_apps[$engine->getApplicationClassName()])) { unset($engines[$index]); continue; } } $options = array(); $value = $this->getFieldValue(); if (strlen($value) && empty($engines[$value])) { $options[$value] = $value; } $engines = msort($engines, 'getResultTypeDescription'); foreach ($engines as $class_name => $engine) { $options[$class_name] = $engine->getResultTypeDescription(); } return id(new AphrontFormSelectControl())->setID($this->getFieldControlID())->setLabel($this->getFieldName())->setCaption($this->getCaption())->setName($this->getFieldKey())->setValue($this->getFieldValue())->setOptions($options); }
/** * @task feed */ protected function publishFeedStory(PhabricatorLiskDAO $object, array $xactions, array $mailed_phids) { $xactions = mfilter($xactions, 'shouldHideForFeed', true); if (!$xactions) { return; } $related_phids = $this->getFeedRelatedPHIDs($object, $xactions); $subscribed_phids = $this->getFeedNotifyPHIDs($object, $xactions); $story_type = $this->getFeedStoryType(); $story_data = $this->getFeedStoryData($object, $xactions); id(new PhabricatorFeedStoryPublisher())->setStoryType($story_type)->setStoryData($story_data)->setStoryTime(time())->setStoryAuthorPHID($this->getActingAsPHID())->setRelatedPHIDs($related_phids)->setPrimaryObjectPHID($object->getPHID())->setSubscribedPHIDs($subscribed_phids)->setMailRecipientPHIDs($mailed_phids)->setMailTags($this->getMailTags($object, $xactions))->publish(); }
/** * Generate the core query results. * * This method is used to fill the cache. * * @return map<string, object> Realized class map. * @task exec */ private function loadMap() { $ancestor = $this->ancestorClass; if (!strlen($ancestor)) { throw new PhutilInvalidStateException('setAncestorClass'); } if (!class_exists($ancestor) && !interface_exists($ancestor)) { throw new Exception(pht('Trying to execute a class map query for descendants of class ' . '"%s", but no such class or interface exists.', $ancestor)); } $expand = $this->expandMethod; $filter = $this->filterMethod; $unique = $this->uniqueMethod; $sort = $this->sortMethod; if (strlen($expand)) { if (!strlen($unique)) { throw new Exception(pht('Trying to execute a class map query for descendants of class ' . '"%s", but the query specifies an "expand method" ("%s") without ' . 'specifying a "unique method". Class maps which support expansion ' . 'must have unique keys.', $ancestor, $expand)); } } $objects = id(new PhutilSymbolLoader())->setAncestorClass($ancestor)->loadObjects(); // Apply the "expand" mechanism, if it is configured. if (strlen($expand)) { $list = array(); foreach ($objects as $object) { foreach (call_user_func(array($object, $expand)) as $instance) { $list[] = $instance; } } } else { $list = $objects; } // Apply the "unique" mechanism, if it is configured. if (strlen($unique)) { $map = array(); foreach ($list as $object) { $key = call_user_func(array($object, $unique)); if ($key === null && $this->filterNull) { continue; } if (empty($map[$key])) { $map[$key] = $object; continue; } throw new Exception(pht('Two objects (of classes "%s" and "%s", descendants of ancestor ' . 'class "%s") returned the same key from "%s" ("%s"), but each ' . 'object in this class map must be identified by a unique key.', get_class($object), get_class($map[$key]), $ancestor, $unique . '()', $key)); } } else { $map = $list; } // Apply the "filter" mechanism, if it is configured. if (strlen($filter)) { $map = mfilter($map, $filter); } // Apply the "sort" mechanism, if it is configured. if (strlen($sort)) { $map = msort($map, $sort); } return $map; }
private function loadImages(array $mocks) { assert_instances_of($mocks, 'PholioMock'); $mock_map = mpull($mocks, null, 'getID'); $all_images = id(new PholioImageQuery())->setViewer($this->getViewer())->setMockCache($mock_map)->withMockIDs(array_keys($mock_map))->needInlineComments($this->needInlineComments)->execute(); $image_groups = mgroup($all_images, 'getMockID'); foreach ($mocks as $mock) { $mock_images = idx($image_groups, $mock->getID(), array()); $mock->attachAllImages($mock_images); $active_images = mfilter($mock_images, 'getIsObsolete', true); $mock->attachImages(msort($active_images, 'getSequence')); } }
protected function shouldSendMail(PhabricatorLiskDAO $object, array $xactions) { // Avoid sending emails that only talk about commit discovery. $types = array_unique(mpull($xactions, 'getTransactionType')); if ($types === array(ReleephRequestTransaction::TYPE_DISCOVERY)) { return false; } // Don't email people when we discover that something picks or reverts OK. if ($types === array(ReleephRequestTransaction::TYPE_PICK_STATUS)) { if (!mfilter($xactions, 'isBoringPickStatus', true)) { // If we effectively call "isInterestingPickStatus" and get nothing... return false; } } return true; }
protected function shouldSendMail(PhabricatorLiskDAO $object, array $xactions) { $xactions = mfilter($xactions, 'shouldHide', true); return $xactions; }