From 4b2283e41c7ce8c67c135208b41aba91b39cc0a0 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 12 Dec 2011 21:14:18 +0100 Subject: [PATCH] Add autoload info to PEAR packages --- src/Composer/Repository/PearRepository.php | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/Composer/Repository/PearRepository.php b/src/Composer/Repository/PearRepository.php index a2229251c..850997d20 100644 --- a/src/Composer/Repository/PearRepository.php +++ b/src/Composer/Repository/PearRepository.php @@ -133,6 +133,17 @@ class PearRepository extends ArrayRepository $packageData += $this->parseDependencies($deps); + // figure out autoload info + try { + $packageInfo = simplexml_load_string($this->rfs->getContents($this->url, $releaseLink . "/package.".$pearVersion.".xml", false)); + $packageData += $this->guessAutoload($packageInfo); + } catch (TransportException $e) { + if (strpos($e->getMessage(), '404')) { + continue; + } + throw $e; + } + try { $this->addPackage($loader->load($packageData)); } catch (\UnexpectedValueException $e) { @@ -279,17 +290,75 @@ class PearRepository extends ArrayRepository $releaseData += $depsData[$version]; } + // figure out autoload info + try { + $releaseLink = $this->url . "/rest/r/".strtolower($packageName); + $packageInfo = simplexml_load_string($this->rfs->getContents($this->url, $releaseLink . "/package.".$version.".xml", false)); + $packageData += $this->guessAutoload($packageInfo); + } catch (TransportException $e) { + if (strpos($e->getMessage(), '404')) { + continue; + } + throw $e; + } + try { $this->addPackage( $loader->load($packageData + $releaseData) ); } catch (\UnexpectedValueException $e) { + // TODO add debug mode with --verbose that outputs those failures continue; } } } } + private function guessAutoload(\SimpleXMLElement $packageInfo) + { + $files = array(); + if (count($packageInfo->contents->dir)) { + foreach ($packageInfo->contents->dir as $dir) { + if (count($dir->file)) { + foreach ($dir->file as $file) { + if ('php' !== (string) $file['role']) { + continue; + } + + $files[] = ltrim($dir['name'].$file['name'], '/'); + } + } + } + } + + // reduce to meaningful unique paths + while (true) { + foreach ($files as $key => $file) { + foreach ($files as $key2 => $file2) { + if ($key === $key2) { + continue; + } + if (false !== strpos($file, '/') && dirname($file) === dirname($file2)) { + unset($files[$key2]); + $files[$key] = dirname($file); + continue 3; + } + if (0 === strpos($file2, $file.'/') || $file === $file2) { + unset($files[$key2]); + continue 3; + } + } + } + break; + } + + return array( + 'autoload' => array( + 'classmap' => $files, + ), + ); + } + /** * @param string $url * @return DOMDocument