@ -12,8 +12,10 @@
namespace Composer\Repository;
namespace Composer\Repository;
use Composer\IO\IOInterface;
use Composer\Package\Loader\ArrayLoader;
use Composer\Package\Loader\ArrayLoader;
use Composer\Util\StreamContextFactory;
use Composer\Util\RemoteFilesystem;
use Composer\Downloader\TransportException;
/**
/**
* @author Benjamin Eberlei < kontakt @ beberlei . de >
* @author Benjamin Eberlei < kontakt @ beberlei . de >
@ -23,9 +25,10 @@ class PearRepository extends ArrayRepository
{
{
private $url;
private $url;
private $channel;
private $channel;
private $streamContext;
private $io;
private $rfs;
public function __construct(array $config)
public function __construct(array $config, IOInterface $io, RemoteFilesystem $rfs = null )
{
{
if (!preg_match('{^https?://}', $config['url'])) {
if (!preg_match('{^https?://}', $config['url'])) {
$config['url'] = 'http://'.$config['url'];
$config['url'] = 'http://'.$config['url'];
@ -36,20 +39,17 @@ class PearRepository extends ArrayRepository
}
}
$this->url = rtrim($config['url'], '/');
$this->url = rtrim($config['url'], '/');
$this->channel = !empty($config['channel']) ? $config['channel'] : null;
$this->channel = !empty($config['channel']) ? $config['channel'] : null;
$this->io = $io;
$this->rfs = $rfs ?: new RemoteFilesystem($this->io);
}
}
protected function initialize()
protected function initialize()
{
{
parent::initialize();
parent::initialize();
set_error_handler(function($severity, $message, $file, $line) {
$this->io->write('Initializing PEAR repository '.$this->url);
throw new \ErrorException($message, $severity, $severity, $file, $line);
});
$this->streamContext = StreamContextFactory::getContext();
$this->fetchFromServer();
$this->fetchFromServer();
restore_error_handler();
}
}
protected function fetchFromServer()
protected function fetchFromServer()
@ -68,7 +68,7 @@ class PearRepository extends ArrayRepository
try {
try {
$packagesLink = str_replace("info.xml", "packagesinfo.xml", $link);
$packagesLink = str_replace("info.xml", "packagesinfo.xml", $link);
$this->fetchPear2Packages($this->url . $packagesLink);
$this->fetchPear2Packages($this->url . $packagesLink);
} catch (\Error Exception $e) {
} catch (Transport Exception $e) {
if (false === strpos($e->getMessage(), '404')) {
if (false === strpos($e->getMessage(), '404')) {
throw $e;
throw $e;
}
}
@ -81,7 +81,7 @@ class PearRepository extends ArrayRepository
/**
/**
* @param string $categoryLink
* @param string $categoryLink
* @throws Error Exception
* @throws Transport Exception
* @throws InvalidArgumentException
* @throws InvalidArgumentException
*/
*/
private function fetchPearPackages($categoryLink)
private function fetchPearPackages($categoryLink)
@ -99,7 +99,7 @@ class PearRepository extends ArrayRepository
try {
try {
$releasesXML = $this->requestXml($allReleasesLink);
$releasesXML = $this->requestXml($allReleasesLink);
} catch (\Error Exception $e) {
} catch (Transport Exception $e) {
if (strpos($e->getMessage(), '404')) {
if (strpos($e->getMessage(), '404')) {
continue;
continue;
}
}
@ -120,8 +120,8 @@ class PearRepository extends ArrayRepository
);
);
try {
try {
$deps = file_get_contents( $releaseLink . "/deps.".$pearVersion.".txt", false, $this->streamContext );
$deps = $this->rfs->getContents($this->url, $releaseLink . "/deps.".$pearVersion.".txt", false);
} catch (\Error Exception $e) {
} catch (Transport Exception $e) {
if (strpos($e->getMessage(), '404')) {
if (strpos($e->getMessage(), '404')) {
continue;
continue;
}
}
@ -226,6 +226,7 @@ class PearRepository extends ArrayRepository
{
{
$loader = new ArrayLoader();
$loader = new ArrayLoader();
$packagesXml = $this->requestXml($packagesLink);
$packagesXml = $this->requestXml($packagesLink);
$informations = $packagesXml->getElementsByTagName('pi');
$informations = $packagesXml->getElementsByTagName('pi');
foreach ($informations as $information) {
foreach ($informations as $information) {
$package = $information->getElementsByTagName('p')->item(0);
$package = $information->getElementsByTagName('p')->item(0);
@ -289,7 +290,7 @@ class PearRepository extends ArrayRepository
*/
*/
private function requestXml($url)
private function requestXml($url)
{
{
$content = file_get_contents($url, false, $this->streamContext );
$content = $this->rfs->getContents($this->url, $url, false );
if (!$content) {
if (!$content) {
throw new \UnexpectedValueException('The PEAR channel at '.$url.' did not respond.');
throw new \UnexpectedValueException('The PEAR channel at '.$url.' did not respond.');
}
}