From 09417cae504dfecb87a92a59113c1d98fb37f6de Mon Sep 17 00:00:00 2001 From: Radek Benkel Date: Sun, 20 Jul 2014 21:01:17 +0200 Subject: [PATCH] Composer gives .ini hints about missing extensions --- .../SolverProblemsException.php | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/Composer/DependencyResolver/SolverProblemsException.php b/src/Composer/DependencyResolver/SolverProblemsException.php index 9973f9d39681..1dfc116f0d0d 100644 --- a/src/Composer/DependencyResolver/SolverProblemsException.php +++ b/src/Composer/DependencyResolver/SolverProblemsException.php @@ -31,14 +31,23 @@ public function __construct(array $problems, array $installedMap) protected function createMessage() { $text = "\n"; + $hasExtensionProblems = false; foreach ($this->problems as $i => $problem) { $text .= " Problem ".($i + 1).$problem->getPrettyString($this->installedMap)."\n"; + + if (!$hasExtensionProblems && $this->hasExtensionProblems($problem->getReasons())) { + $hasExtensionProblems = true; + } } if (strpos($text, 'could not be found') || strpos($text, 'no matching package found')) { $text .= "\nPotential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see for more details.\n\nRead for further common problems."; } + if ($hasExtensionProblems) { + $text .= $this->createExtensionHint(); + } + return $text; } @@ -46,4 +55,40 @@ public function getProblems() { return $this->problems; } + + private function createExtensionHint() + { + $paths = array(); + + if (($iniPath = php_ini_loaded_file()) !== false) { + $paths[] = $iniPath; + } + + if (!defined('HHVM_VERSION') && $additionalIniPaths = php_ini_scanned_files()) { + $paths = array_merge($paths, array_map("trim", explode(",", $additionalIniPaths))); + } + + if (count($paths) === 0) { + return ''; + } + + $text = "\n Because of missing extensions, please verify whether they are enabled in those .ini files:\n - "; + $text .= implode("\n - ", $paths); + $text .= "\n You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode."; + + return $text; + } + + private function hasExtensionProblems(array $reasonSets) + { + foreach ($reasonSets as $reasonSet) { + foreach($reasonSet as $reason) { + if (isset($reason["rule"]) && 0 === strpos($reason["rule"]->getRequiredPackage(), 'ext-')) { + return true; + } + } + } + + return false; + } }