diff --git a/src/applications/config/check/PhabricatorAPCSetupCheck.php b/src/applications/config/check/PhabricatorAPCSetupCheck.php --- a/src/applications/config/check/PhabricatorAPCSetupCheck.php +++ b/src/applications/config/check/PhabricatorAPCSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorAPCSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { if (!extension_loaded('apc')) { $message = pht( diff --git a/src/applications/config/check/PhabricatorAuthSetupCheck.php b/src/applications/config/check/PhabricatorAuthSetupCheck.php --- a/src/applications/config/check/PhabricatorAuthSetupCheck.php +++ b/src/applications/config/check/PhabricatorAuthSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorAuthSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_IMPORTANT; + } + protected function executeChecks() { // NOTE: We're not actually building these providers. Building providers // can require additional configuration to be present (e.g., to build diff --git a/src/applications/config/check/PhabricatorBaseURISetupCheck.php b/src/applications/config/check/PhabricatorBaseURISetupCheck.php --- a/src/applications/config/check/PhabricatorBaseURISetupCheck.php +++ b/src/applications/config/check/PhabricatorBaseURISetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorBaseURISetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_IMPORTANT; + } + protected function executeChecks() { $base_uri = PhabricatorEnv::getEnvConfig('phabricator.base-uri'); diff --git a/src/applications/config/check/PhabricatorBinariesSetupCheck.php b/src/applications/config/check/PhabricatorBinariesSetupCheck.php --- a/src/applications/config/check/PhabricatorBinariesSetupCheck.php +++ b/src/applications/config/check/PhabricatorBinariesSetupCheck.php @@ -2,6 +2,9 @@ final class PhabricatorBinariesSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } protected function executeChecks() { diff --git a/src/applications/config/check/PhabricatorDaemonsSetupCheck.php b/src/applications/config/check/PhabricatorDaemonsSetupCheck.php --- a/src/applications/config/check/PhabricatorDaemonsSetupCheck.php +++ b/src/applications/config/check/PhabricatorDaemonsSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorDaemonsSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_IMPORTANT; + } + protected function executeChecks() { $task_daemon = id(new PhabricatorDaemonLogQuery()) diff --git a/src/applications/config/check/PhabricatorDatabaseSetupCheck.php b/src/applications/config/check/PhabricatorDatabaseSetupCheck.php --- a/src/applications/config/check/PhabricatorDatabaseSetupCheck.php +++ b/src/applications/config/check/PhabricatorDatabaseSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorDatabaseSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_IMPORTANT; + } + public function getExecutionOrder() { // This must run after basic PHP checks, but before most other checks. return 0.5; diff --git a/src/applications/config/check/PhabricatorElasticSetupCheck.php b/src/applications/config/check/PhabricatorElasticSetupCheck.php --- a/src/applications/config/check/PhabricatorElasticSetupCheck.php +++ b/src/applications/config/check/PhabricatorElasticSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorElasticSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { if (PhabricatorDefaultSearchEngineSelector::shouldUseElasticSearch()) { $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine(); diff --git a/src/applications/config/check/PhabricatorExtensionsSetupCheck.php b/src/applications/config/check/PhabricatorExtensionsSetupCheck.php --- a/src/applications/config/check/PhabricatorExtensionsSetupCheck.php +++ b/src/applications/config/check/PhabricatorExtensionsSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorExtensionsSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_PHP; + } + public function getExecutionOrder() { return 0; } diff --git a/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php b/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php --- a/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php +++ b/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorExtraConfigSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $ancient_config = self::getAncientConfig(); diff --git a/src/applications/config/check/PhabricatorFileinfoSetupCheck.php b/src/applications/config/check/PhabricatorFileinfoSetupCheck.php --- a/src/applications/config/check/PhabricatorFileinfoSetupCheck.php +++ b/src/applications/config/check/PhabricatorFileinfoSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorFileinfoSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { if (!extension_loaded('fileinfo')) { $message = pht( diff --git a/src/applications/config/check/PhabricatorGDSetupCheck.php b/src/applications/config/check/PhabricatorGDSetupCheck.php --- a/src/applications/config/check/PhabricatorGDSetupCheck.php +++ b/src/applications/config/check/PhabricatorGDSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorGDSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { if (!extension_loaded('gd')) { $message = pht( diff --git a/src/applications/config/check/PhabricatorImagemagickSetupCheck.php b/src/applications/config/check/PhabricatorImagemagickSetupCheck.php --- a/src/applications/config/check/PhabricatorImagemagickSetupCheck.php +++ b/src/applications/config/check/PhabricatorImagemagickSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorImagemagickSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $imagemagick = PhabricatorEnv::getEnvConfig('files.enable-imagemagick'); if ($imagemagick) { diff --git a/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php b/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php --- a/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php +++ b/src/applications/config/check/PhabricatorInvalidConfigSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorInvalidConfigSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $groups = PhabricatorApplicationConfigOptions::loadAll(); foreach ($groups as $group) { diff --git a/src/applications/config/check/PhabricatorMailSetupCheck.php b/src/applications/config/check/PhabricatorMailSetupCheck.php --- a/src/applications/config/check/PhabricatorMailSetupCheck.php +++ b/src/applications/config/check/PhabricatorMailSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorMailSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $adapter = PhabricatorEnv::getEnvConfig('metamta.mail-adapter'); diff --git a/src/applications/config/check/PhabricatorMySQLSetupCheck.php b/src/applications/config/check/PhabricatorMySQLSetupCheck.php --- a/src/applications/config/check/PhabricatorMySQLSetupCheck.php +++ b/src/applications/config/check/PhabricatorMySQLSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorMySQLSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_MYSQL; + } + public static function loadRawConfigValue($key) { $conn_raw = id(new PhabricatorUser())->establishConnection('w'); diff --git a/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php b/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php --- a/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php +++ b/src/applications/config/check/PhabricatorPHPConfigSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorPHPConfigSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_PHP; + } + public function getExecutionOrder() { return 0; } diff --git a/src/applications/config/check/PhabricatorPathSetupCheck.php b/src/applications/config/check/PhabricatorPathSetupCheck.php --- a/src/applications/config/check/PhabricatorPathSetupCheck.php +++ b/src/applications/config/check/PhabricatorPathSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorPathSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { // NOTE: We've already appended `environment.append-paths`, so we don't // need to explicitly check for it. diff --git a/src/applications/config/check/PhabricatorPygmentSetupCheck.php b/src/applications/config/check/PhabricatorPygmentSetupCheck.php --- a/src/applications/config/check/PhabricatorPygmentSetupCheck.php +++ b/src/applications/config/check/PhabricatorPygmentSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorPygmentSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $pygment = PhabricatorEnv::getEnvConfig('pygments.enabled'); diff --git a/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php b/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php --- a/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php +++ b/src/applications/config/check/PhabricatorRepositoriesSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorRepositoriesSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $cluster_services = id(new AlmanacServiceQuery()) diff --git a/src/applications/config/check/PhabricatorSecuritySetupCheck.php b/src/applications/config/check/PhabricatorSecuritySetupCheck.php --- a/src/applications/config/check/PhabricatorSecuritySetupCheck.php +++ b/src/applications/config/check/PhabricatorSecuritySetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorSecuritySetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { // This checks for a version of bash with the "Shellshock" vulnerability. diff --git a/src/applications/config/check/PhabricatorSetupCheck.php b/src/applications/config/check/PhabricatorSetupCheck.php --- a/src/applications/config/check/PhabricatorSetupCheck.php +++ b/src/applications/config/check/PhabricatorSetupCheck.php @@ -6,6 +6,11 @@ abstract protected function executeChecks(); + const GROUP_OTHER = 'other'; + const GROUP_MYSQL = 'mysql'; + const GROUP_PHP = 'php'; + const GROUP_IMPORTANT = 'important'; + public function getExecutionOrder() { return 1; } @@ -14,6 +19,7 @@ $issue = id(new PhabricatorSetupIssue()) ->setIssueKey($key); $this->issues[$key] = $issue; + $issue->setGroup($this->getDefaultGroup()); return $issue; } diff --git a/src/applications/config/check/PhabricatorStorageSetupCheck.php b/src/applications/config/check/PhabricatorStorageSetupCheck.php --- a/src/applications/config/check/PhabricatorStorageSetupCheck.php +++ b/src/applications/config/check/PhabricatorStorageSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorStorageSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + /** * @phutil-external-symbol class PhabricatorStartup */ diff --git a/src/applications/config/check/PhabricatorTimezoneSetupCheck.php b/src/applications/config/check/PhabricatorTimezoneSetupCheck.php --- a/src/applications/config/check/PhabricatorTimezoneSetupCheck.php +++ b/src/applications/config/check/PhabricatorTimezoneSetupCheck.php @@ -2,6 +2,10 @@ final class PhabricatorTimezoneSetupCheck extends PhabricatorSetupCheck { + public function getDefaultGroup() { + return self::GROUP_OTHER; + } + protected function executeChecks() { $php_value = ini_get('date.timezone'); if ($php_value) { diff --git a/src/applications/config/controller/PhabricatorConfigIssueListController.php b/src/applications/config/controller/PhabricatorConfigIssueListController.php --- a/src/applications/config/controller/PhabricatorConfigIssueListController.php +++ b/src/applications/config/controller/PhabricatorConfigIssueListController.php @@ -14,18 +14,49 @@ PhabricatorSetupCheck::setOpenSetupIssueCount( PhabricatorSetupCheck::countUnignoredIssues($issues)); - $list = $this->buildIssueList($issues); - $list->setNoDataString(pht('There are no open setup issues.')); - $list->setStackable(true); + $important = $this->buildIssueList( + $issues, PhabricatorSetupCheck::GROUP_IMPORTANT); + $php = $this->buildIssueList( + $issues, PhabricatorSetupCheck::GROUP_PHP); + $mysql = $this->buildIssueList( + $issues, PhabricatorSetupCheck::GROUP_MYSQL); + $other = $this->buildIssueList( + $issues, PhabricatorSetupCheck::GROUP_OTHER); + + $setup_issues = array(); + if ($important) { + $setup_issues[] = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Important Setup Issues')) + ->appendChild($important); + } - $box = id(new PHUIObjectBoxView()) - ->setHeaderText(pht('Open Phabricator Setup Issues')) - ->appendChild($list); + if ($php) { + $setup_issues[] = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('PHP Setup Issues')) + ->appendChild($php); + } - $nav->appendChild( - array( - $box, - )); + if ($mysql) { + $setup_issues[] = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('MySQL Setup Issues')) + ->appendChild($mysql); + } + + if ($other) { + $setup_issues[] = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Other Setup Issues')) + ->appendChild($other); + } + + if (empty($setup_issues)) { + $setup_issues[] = id(new PHUIErrorView()) + ->setTitle(pht('No Issues')) + ->appendChild( + pht('Your install has no current setup issues to resolve.')) + ->setSeverity(PHUIErrorView::SEVERITY_NOTICE); + } + + $nav->appendChild($setup_issues); $title = pht('Setup Issues'); @@ -42,25 +73,30 @@ )); } - private function buildIssueList(array $issues) { + private function buildIssueList(array $issues, $group) { assert_instances_of($issues, 'PhabricatorSetupIssue'); $list = new PHUIObjectItemListView(); + $list->setStackable(true); $ignored_items = array(); + $items = 0; foreach ($issues as $issue) { + if ($issue->getGroup() == $group) { + $items++; $href = $this->getApplicationURI('/issue/'.$issue->getIssueKey().'/'); $item = id(new PHUIObjectItemView()) ->setHeader($issue->getName()) ->setHref($href) ->addAttribute($issue->getSummary()); - if (!$issue->getIsIgnored()) { - $item->setBarColor('yellow'); - $list->addItem($item); - } else { - $item->addIcon('fa-eye-slash', pht('Ignored')); - $item->setDisabled(true); - $item->setBarColor('none'); - $ignored_items[] = $item; + if (!$issue->getIsIgnored()) { + $item->setBarColor('yellow'); + $list->addItem($item); + } else { + $item->addIcon('fa-eye-slash', pht('Ignored')); + $item->setDisabled(true); + $item->setBarColor('none'); + $ignored_items[] = $item; + } } } @@ -68,7 +104,11 @@ $list->addItem($item); } - return $list; + if ($items == 0) { + return null; + } else { + return $list; + } } } diff --git a/src/applications/config/issue/PhabricatorSetupIssue.php b/src/applications/config/issue/PhabricatorSetupIssue.php --- a/src/applications/config/issue/PhabricatorSetupIssue.php +++ b/src/applications/config/issue/PhabricatorSetupIssue.php @@ -8,6 +8,7 @@ private $isFatal; private $summary; private $shortName; + private $group; private $isIgnored = false; private $phpExtensions = array(); @@ -40,6 +41,19 @@ return $this->shortName; } + public function setGroup($group) { + $this->group = $group; + return $this; + } + + public function getGroup() { + if ($this->group) { + return $this->group; + } else { + return PhabricatorSetupCheck::GROUP_OTHER; + } + } + public function setName($name) { $this->name = $name; return $this;