From da9315b1453cfac00658a80d6082fa2d7aec0e82 Mon Sep 17 00:00:00 2001 From: Asher Baker Date: Sat, 19 Jan 2013 08:34:54 -0800 Subject: [PATCH] Read default values of custom config options Summary: Because the Default configuration provider is loaded before custom libraries, any config options specified in them don't get a default values. Test Plan: Looked at /config/ Reviewers: epriestley, codeblock, btrahan Reviewed By: epriestley CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D4532 --- .../option/PhabricatorApplicationConfigOptions.php | 10 +++++++--- .../env/PhabricatorConfigDefaultSource.php | 6 ++++++ src/infrastructure/env/PhabricatorEnv.php | 11 ++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/applications/config/option/PhabricatorApplicationConfigOptions.php b/src/applications/config/option/PhabricatorApplicationConfigOptions.php index c08758de3e..39d66f7f5e 100644 --- a/src/applications/config/option/PhabricatorApplicationConfigOptions.php +++ b/src/applications/config/option/PhabricatorApplicationConfigOptions.php @@ -132,7 +132,7 @@ abstract class PhabricatorApplicationConfigOptions extends Phobject { ->setGroup($this); } - final public static function loadAll() { + final public static function loadAll($external_only = false) { $symbols = id(new PhutilSymbolLoader()) ->setAncestorClass('PhabricatorApplicationConfigOptions') ->setConcreteOnly(true) @@ -140,6 +140,10 @@ abstract class PhabricatorApplicationConfigOptions extends Phobject { $groups = array(); foreach ($symbols as $symbol) { + if ($external_only && $symbol['library'] == 'phabricator') { + continue; + } + $obj = newv($symbol['name'], array()); $key = $obj->getKey(); if (isset($groups[$key])) { @@ -156,8 +160,8 @@ abstract class PhabricatorApplicationConfigOptions extends Phobject { return $groups; } - final public static function loadAllOptions() { - $groups = self::loadAll(); + final public static function loadAllOptions($external_only = false) { + $groups = self::loadAll($external_only); $options = array(); foreach ($groups as $group) { diff --git a/src/infrastructure/env/PhabricatorConfigDefaultSource.php b/src/infrastructure/env/PhabricatorConfigDefaultSource.php index e8fc3bad13..0316c778ee 100644 --- a/src/infrastructure/env/PhabricatorConfigDefaultSource.php +++ b/src/infrastructure/env/PhabricatorConfigDefaultSource.php @@ -13,4 +13,10 @@ final class PhabricatorConfigDefaultSource $this->setSource(new PhabricatorConfigDictionarySource($options)); } + public function loadExternalOptions() { + $options = PhabricatorApplicationConfigOptions::loadAllOptions(true); + $options = mpull($options, 'getDefault'); + $this->setKeys($options); + } + } diff --git a/src/infrastructure/env/PhabricatorEnv.php b/src/infrastructure/env/PhabricatorEnv.php index 09d801c6c1..79c6b40c49 100644 --- a/src/infrastructure/env/PhabricatorEnv.php +++ b/src/infrastructure/env/PhabricatorEnv.php @@ -132,9 +132,9 @@ final class PhabricatorEnv { $stack = new PhabricatorConfigStackSource(); self::$sourceStack = $stack; - $stack->pushSource( - id(new PhabricatorConfigDefaultSource()) - ->setName(pht('Global Default'))); + $defaultSource = id(new PhabricatorConfigDefaultSource()) + ->setName(pht('Global Default')); + $stack->pushSource($defaultSource); $env = self::getSelectedEnvironmentName(); $stack->pushSource( @@ -152,6 +152,11 @@ final class PhabricatorEnv { phutil_load_library($library); } + // If custom libraries specify config options, they won't get default + // values as the Default source has already been loaded, so we get it to + // pull in all options from non-phabricator libraries now they are loaded. + $defaultSource->loadExternalOptions(); + try { $stack->pushSource( id(new PhabricatorConfigDatabaseSource('default'))