public function updateCanonicalConfigFile(Bundle $bundle)
{
self::$canonicalConfiguration = '';
$gitRepo = $this->gitRepoManager->getRepo($bundle);
/**
* Currently there is only support for bundles whose configuration is stored exactly under Configuration.php
*/
$relativePath = 'DependencyInjection' . DIRECTORY_SEPARATOR . 'Configuration.php';
if ($gitRepo->hasFile($relativePath)) {
$absolutePath = $gitRepo->getDir() . DIRECTORY_SEPARATOR . $relativePath;
$tokens = token_get_all(file_get_contents($absolutePath));
$start = false;
$namespace = '';
foreach ($tokens as $token) {
if ($token == ';') {
break;
}
$tokenName = is_array($token) ? $token[0] : null;
if (T_NAMESPACE === $tokenName) {
$start = true;
continue;
}
// Still not found namespace, skip this part of code
if ($start === false) {
continue;
}
$tokenData = is_array($token) ? $token[1] : $token;
if ($tokenData == ' ') {
continue;
}
$namespace .= $tokenData;
}
unset($tokens);
$autoloaderPath = __DIR__ . '/../../../../../vendor/autoload.php';
$script = <<<EOF
<?php
include_once "{$autoloaderPath}";
include_once "{$absolutePath}";
use Knp\\Bundle\\KnpBundlesBundle\\Github\\Repo;
\$configuration = new \\ReflectionClass("{$namespace}\\Configuration");
// only dumps if it implements interface ConfigurationInterface
if (in_array('Symfony\\Component\\Config\\Definition\\ConfigurationInterface', \$configuration->getInterfaceNames())) {
\$configuration = \$configuration->newInstance();
\$configuration = Repo::outputNode(\$configuration->getConfigTreeBuilder()->buildTree());
echo Repo::\$canonicalConfiguration;
} else {
echo '';
}
?>
EOF;
// Workaround for bundles with external deps called in DI configuration, i.e. FOSRestBundle
$process = new PhpProcess($script);
$process->run();
if ($process->isSuccessful()) {
$bundle->setCanonicalConfig(Repo::$canonicalConfiguration = $process->getOutput());
}
}
}