diff --git a/src/Composer/Downloader/PearDownloader.php b/src/Composer/Downloader/PearDownloader.php index a622b4754..6f250abd3 100644 --- a/src/Composer/Downloader/PearDownloader.php +++ b/src/Composer/Downloader/PearDownloader.php @@ -12,25 +12,41 @@ namespace Composer\Downloader; +use Composer\Package\PackageInterface; + /** * Downloader for pear packages * * @author Jordi Boggiano * @author Kirill chEbba Chebunin */ -class PearDownloader extends TarDownloader +class PearDownloader extends FileDownloader { /** * {@inheritDoc} */ - protected function extract($file, $path) + public function download(PackageInterface $package, $path) { - parent::extract($file, $path); - if (file_exists($path . '/package.sig')) { - unlink($path . '/package.sig'); + parent::download($package, $path); + + $fileName = $this->getFileName($package, $path); + if ($this->io->isVerbose()) { + $this->io->write(' Installing PEAR package'); } - if (file_exists($path . '/package.xml')) { - unlink($path . '/package.xml'); + try { + $pearExtractor = new PearPackageExtractor($fileName); + $pearExtractor->extractTo($path); + + if ($this->io->isVerbose()) { + $this->io->write(' Cleaning up'); + } + unlink($fileName); + } catch (\Exception $e) { + // clean up + $this->filesystem->removeDirectory($path); + throw $e; } + + $this->io->write(''); } } diff --git a/tests/Composer/Test/Downloader/PearDownloaderTest.php b/tests/Composer/Test/Downloader/PearDownloaderTest.php new file mode 100644 index 000000000..d3cc8d0fd --- /dev/null +++ b/tests/Composer/Test/Downloader/PearDownloaderTest.php @@ -0,0 +1,38 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Downloader; + +use Composer\Downloader\PearDownloader; + +class PearDownloaderTest extends \PHPUnit_Framework_TestCase +{ + public function testErrorMessages() + { + $packageMock = $this->getMock('Composer\Package\PackageInterface'); + $packageMock->expects($this->any()) + ->method('getDistUrl') + ->will($this->returnValue('file://'.__FILE__)) + ; + + $io = $this->getMock('Composer\IO\IOInterface'); + $downloader = new PearDownloader($io); + + try { + $downloader->download($packageMock, sys_get_temp_dir().'/composer-pear-test'); + $this->fail('Download of invalid pear packages should throw an exception'); + } catch (\UnexpectedValueException $e) { + $this->assertContains('Failed to extract PEAR package', $e->getMessage()); + } + } + +}