protected function executeChecks()
 {
     $ancient_config = self::getAncientConfig();
     $all_keys = PhabricatorEnv::getAllConfigKeys();
     $all_keys = array_keys($all_keys);
     sort($all_keys);
     $defined_keys = PhabricatorApplicationConfigOptions::loadAllOptions();
     foreach ($all_keys as $key) {
         if (isset($defined_keys[$key])) {
             continue;
         }
         if (isset($ancient_config[$key])) {
             $summary = pht('This option has been removed. You may delete it at your ' . 'convenience.');
             $message = pht("The configuration option '%s' has been removed. You may delete " . "it at your convenience." . "\n\n%s", $key, $ancient_config[$key]);
             $short = pht('Obsolete Config');
             $name = pht('Obsolete Configuration Option "%s"', $key);
         } else {
             $summary = pht('This option is not recognized. It may be misspelled.');
             $message = pht("The configuration option '%s' is not recognized. It may be " . "misspelled, or it might have existed in an older version of " . "Phabricator. It has no effect, and should be corrected or deleted.", $key);
             $short = pht('Unknown Config');
             $name = pht('Unknown Configuration Option "%s"', $key);
         }
         $issue = $this->newIssue('config.unknown.' . $key)->setShortName($short)->setName($name)->setSummary($summary);
         $stack = PhabricatorEnv::getConfigSourceStack();
         $stack = $stack->getStack();
         $found = array();
         $found_local = false;
         $found_database = false;
         foreach ($stack as $source_key => $source) {
             $value = $source->getKeys(array($key));
             if ($value) {
                 $found[] = $source->getName();
                 if ($source instanceof PhabricatorConfigDatabaseSource) {
                     $found_database = true;
                 }
                 if ($source instanceof PhabricatorConfigLocalSource) {
                     $found_local = true;
                 }
             }
         }
         $message = $message . "\n\n" . pht('This configuration value is defined in these %d ' . 'configuration source(s): %s.', count($found), implode(', ', $found));
         $issue->setMessage($message);
         if ($found_local) {
             $command = csprintf('phabricator/ $ ./bin/config delete %s', $key);
             $issue->addCommand($command);
         }
         if ($found_database) {
             $issue->addPhabricatorConfig($key);
         }
     }
     $this->executeManiphestFieldChecks();
 }
 public function execute(PhutilArgumentParser $args)
 {
     $console = PhutilConsole::getConsole();
     $key_count = 0;
     $options = PhabricatorApplicationConfigOptions::loadAllOptions();
     $local_config = new PhabricatorConfigLocalSource();
     $database_config = new PhabricatorConfigDatabaseSource('default');
     $config_sources = PhabricatorEnv::getConfigSourceStack()->getStack();
     $console->writeOut("%s\n", pht('Migrating file-based config to more modern config...'));
     foreach ($config_sources as $config_source) {
         if (!$config_source instanceof PhabricatorConfigFileSource) {
             $console->writeOut("%s\n", pht('Skipping config of source type %s...', get_class($config_source)));
             continue;
         }
         $console->writeOut("%s\n", pht('Migrating file source...'));
         $all_keys = $config_source->getAllKeys();
         foreach ($all_keys as $key => $value) {
             $option = idx($options, $key);
             if (!$option) {
                 $console->writeOut("%s\n", pht('Skipping obsolete option: %s', $key));
                 continue;
             }
             $in_local = $local_config->getKeys(array($option->getKey()));
             if ($in_local) {
                 $console->writeOut("%s\n", pht('Skipping option "%s"; already in local config.', $key));
                 continue;
             }
             $is_locked = $option->getLocked();
             if ($is_locked) {
                 $local_config->setKeys(array($option->getKey() => $value));
                 $key_count++;
                 $console->writeOut("%s\n", pht('Migrated option "%s" from file to local config.', $key));
             } else {
                 $in_database = $database_config->getKeys(array($option->getKey()));
                 if ($in_database) {
                     $console->writeOut("%s\n", pht('Skipping option "%s"; already in database config.', $key));
                     continue;
                 } else {
                     $config_entry = PhabricatorConfigEntry::loadConfigEntry($key);
                     $config_entry->setValue($value);
                     $config_entry->save();
                     $key_count++;
                     $console->writeOut("%s\n", pht('Migrated option "%s" from file to database config.', $key));
                 }
             }
         }
     }
     $console->writeOut("%s\n", pht('Done. Migrated %d keys.', $key_count));
     return 0;
 }
 private function renderDefaults(PhabricatorConfigOption $option, PhabricatorConfigEntry $entry)
 {
     $stack = PhabricatorEnv::getConfigSourceStack();
     $stack = $stack->getStack();
     $table = array();
     $table[] = phutil_tag('tr', array('class' => 'column-labels'), array(phutil_tag('th', array(), pht('Source')), phutil_tag('th', array(), pht('Value'))));
     foreach ($stack as $key => $source) {
         $value = $source->getKeys(array($option->getKey()));
         if (!array_key_exists($option->getKey(), $value)) {
             $value = phutil_tag('em', array(), pht('(empty)'));
         } else {
             $value = $this->getDisplayValue($option, $entry, $value[$option->getKey()]);
         }
         $table[] = phutil_tag('tr', array('class' => 'column-labels'), array(phutil_tag('th', array(), $source->getName()), phutil_tag('td', array(), $value)));
     }
     require_celerity_resource('config-options-css');
     return phutil_tag('table', array('class' => 'config-option-table'), $table);
 }