diff --git a/src/Composer/Downloader/FileDownloader.php b/src/Composer/Downloader/FileDownloader.php index 8c98eb785..07a768985 100644 --- a/src/Composer/Downloader/FileDownloader.php +++ b/src/Composer/Downloader/FileDownloader.php @@ -79,18 +79,38 @@ class FileDownloader implements DownloaderInterface */ public function download(PackageInterface $package, $path) { - $url = $package->getDistUrl(); - if (!$url) { + if (!$package->getDistUrl()) { throw new \InvalidArgumentException('The given package is missing url information'); } + $this->io->write(" - Installing " . $package->getName() . " (" . VersionParser::formatVersion($package) . ")"); + + $urls = $package->getDistUrls(); + while ($url = array_shift($urls)) { + try { + $this->doDownload($package, $path, $url); + break; + } catch (\Exception $e) { + if ($this->io->isDebug()) { + $this->io->write(''); + $this->io->write('Failed: ['.get_class($e).'] '.$e->getMessage()); + } elseif (count($urls)) { + $this->io->write(''); + $this->io->write(' Failed, trying the next URL'); + } else { + throw $e; + } + } + } + } + + protected function doDownload(PackageInterface $package, $path, $url) + { $this->filesystem->removeDirectory($path); $this->filesystem->ensureDirectoryExists($path); $fileName = $this->getFileName($package, $path); - $this->io->write(" - Installing " . $package->getName() . " (" . VersionParser::formatVersion($package) . ")"); - $processedUrl = $this->processUrl($package, $url); $hostname = parse_url($processedUrl, PHP_URL_HOST); diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index 3186117ae..2dc7532a9 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -26,7 +26,7 @@ class GitDownloader extends VcsDownloader /** * {@inheritDoc} */ - public function doDownload(PackageInterface $package, $path) + public function doDownload(PackageInterface $package, $path, $url) { $this->cleanEnv(); $path = $this->normalizePath($path); @@ -40,8 +40,8 @@ class GitDownloader extends VcsDownloader return sprintf($command, escapeshellarg($url), escapeshellarg($path), escapeshellarg($ref)); }; - $this->runCommand($commandCallable, $package->getSourceUrl(), $path, true); - $this->setPushUrl($package, $path); + $this->runCommand($commandCallable, $url, $path, true); + $this->setPushUrl($path, $url); if ($newRef = $this->updateToCommit($path, $ref, $package->getPrettyVersion(), $package->getReleaseDate())) { if ($package->getDistReference() === $package->getSourceReference()) { @@ -54,7 +54,7 @@ class GitDownloader extends VcsDownloader /** * {@inheritDoc} */ - public function doUpdate(PackageInterface $initial, PackageInterface $target, $path) + public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { $this->cleanEnv(); $path = $this->normalizePath($path); @@ -76,7 +76,7 @@ class GitDownloader extends VcsDownloader return sprintf($command, escapeshellarg($url)); }; - $this->runCommand($commandCallable, $target->getSourceUrl(), $path); + $this->runCommand($commandCallable, $url, $path); if ($newRef = $this->updateToCommit($path, $ref, $target->getPrettyVersion(), $target->getReleaseDate())) { if ($target->getDistReference() === $target->getSourceReference()) { $target->setDistReference($newRef); @@ -412,10 +412,10 @@ class GitDownloader extends VcsDownloader return preg_replace('{://([^@]+?):.+?@}', '://$1:***@', $message); } - protected function setPushUrl(PackageInterface $package, $path) + protected function setPushUrl($path, $url) { // set push url for github projects - if (preg_match('{^(?:https?|git)://'.$this->getGitHubDomainsRegex().'/([^/]+)/([^/]+?)(?:\.git)?$}', $package->getSourceUrl(), $match)) { + if (preg_match('{^(?:https?|git)://'.$this->getGitHubDomainsRegex().'/([^/]+)/([^/]+?)(?:\.git)?$}', $url, $match)) { $protocols = $this->config->get('github-protocols'); $pushUrl = 'git@'.$match[1].':'.$match[2].'/'.$match[3].'.git'; if ($protocols[0] !== 'git') { diff --git a/src/Composer/Downloader/HgDownloader.php b/src/Composer/Downloader/HgDownloader.php index 7252bf4fe..69e8ba886 100644 --- a/src/Composer/Downloader/HgDownloader.php +++ b/src/Composer/Downloader/HgDownloader.php @@ -22,9 +22,9 @@ class HgDownloader extends VcsDownloader /** * {@inheritDoc} */ - public function doDownload(PackageInterface $package, $path) + public function doDownload(PackageInterface $package, $path, $url) { - $url = escapeshellarg($package->getSourceUrl()); + $url = escapeshellarg($url); $ref = escapeshellarg($package->getSourceReference()); $this->io->write(" Cloning ".$package->getSourceReference()); $command = sprintf('hg clone %s %s', $url, escapeshellarg($path)); @@ -40,9 +40,9 @@ class HgDownloader extends VcsDownloader /** * {@inheritDoc} */ - public function doUpdate(PackageInterface $initial, PackageInterface $target, $path) + public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { - $url = escapeshellarg($target->getSourceUrl()); + $url = escapeshellarg($url); $ref = escapeshellarg($target->getSourceReference()); $this->io->write(" Updating to ".$target->getSourceReference()); diff --git a/src/Composer/Downloader/SvnDownloader.php b/src/Composer/Downloader/SvnDownloader.php index 8fefbdfc1..495979d40 100644 --- a/src/Composer/Downloader/SvnDownloader.php +++ b/src/Composer/Downloader/SvnDownloader.php @@ -24,10 +24,9 @@ class SvnDownloader extends VcsDownloader /** * {@inheritDoc} */ - public function doDownload(PackageInterface $package, $path) + public function doDownload(PackageInterface $package, $path, $url) { SvnUtil::cleanEnv(); - $url = $package->getSourceUrl(); $ref = $package->getSourceReference(); $this->io->write(" Checking out ".$package->getSourceReference()); @@ -37,10 +36,9 @@ class SvnDownloader extends VcsDownloader /** * {@inheritDoc} */ - public function doUpdate(PackageInterface $initial, PackageInterface $target, $path) + public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { SvnUtil::cleanEnv(); - $url = $target->getSourceUrl(); $ref = $target->getSourceReference(); if (!is_dir($path.'/.svn')) { diff --git a/src/Composer/Downloader/VcsDownloader.php b/src/Composer/Downloader/VcsDownloader.php index 4e06d63f8..7ebadf51c 100644 --- a/src/Composer/Downloader/VcsDownloader.php +++ b/src/Composer/Downloader/VcsDownloader.php @@ -56,7 +56,23 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa $this->io->write(" - Installing " . $package->getName() . " (" . VersionParser::formatVersion($package) . ")"); $this->filesystem->removeDirectory($path); - $this->doDownload($package, $path); + + $urls = $package->getSourceUrls(); + while ($url = array_shift($urls)) { + try { + $this->doDownload($package, $path, $url); + break; + } catch (\Exception $e) { + if ($this->io->isDebug()) { + $this->io->write('Failed: ['.get_class($e).'] '.$e->getMessage()); + } elseif (count($urls)) { + $this->io->write(' Failed, trying the next URL'); + } else { + throw $e; + } + } + } + $this->io->write(''); } @@ -87,17 +103,28 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa $this->io->write(" - Updating " . $name . " (" . $from . " => " . $to . ")"); $this->cleanChanges($initial, $path, true); - try { - $this->doUpdate($initial, $target, $path); - } catch (\Exception $e) { - // in case of failed update, try to reapply the changes before aborting - $this->reapplyChanges($path); + $urls = $target->getSourceUrls(); + while ($url = array_shift($urls)) { + try { + $this->doUpdate($initial, $target, $path, $url); + break; + } catch (\Exception $e) { + if ($this->io->isDebug()) { + $this->io->write('Failed: ['.get_class($e).'] '.$e->getMessage()); + } elseif (count($urls)) { + $this->io->write(' Failed, trying the next URL'); + } else { + // in case of failed update, try to reapply the changes before aborting + $this->reapplyChanges($path); - throw $e; + throw $e; + } + } } + $this->reapplyChanges($path); - //print the commit logs if in verbose mode + // print the commit logs if in verbose mode if ($this->io->isVerbose()) { $message = 'Pulling in changes:'; $logs = $this->getCommitLogs($initial->getSourceReference(), $target->getSourceReference(), $path); @@ -176,8 +203,9 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa * * @param PackageInterface $package package instance * @param string $path download path + * @param string $url package url */ - abstract protected function doDownload(PackageInterface $package, $path); + abstract protected function doDownload(PackageInterface $package, $path, $url); /** * Updates specific package in specific folder from initial to target version. @@ -185,8 +213,9 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path + * @param string $url package url */ - abstract protected function doUpdate(PackageInterface $initial, PackageInterface $target, $path); + abstract protected function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url); /** * Fetches the commit logs between two commits diff --git a/src/Composer/Package/AliasPackage.php b/src/Composer/Package/AliasPackage.php index c90221027..cf4da14ba 100644 --- a/src/Composer/Package/AliasPackage.php +++ b/src/Composer/Package/AliasPackage.php @@ -209,6 +209,10 @@ class AliasPackage extends BasePackage implements CompletePackageInterface { return $this->aliasOf->getSourceUrl(); } + public function getSourceUrls() + { + return $this->aliasOf->getSourceUrls(); + } public function getSourceReference() { return $this->aliasOf->getSourceReference(); @@ -217,6 +221,14 @@ class AliasPackage extends BasePackage implements CompletePackageInterface { return $this->aliasOf->setSourceReference($reference); } + public function setSourceMirrors($mirrors) + { + return $this->aliasOf->setSourceMirrors($mirrors); + } + public function getSourceMirrors() + { + return $this->aliasOf->getSourceMirrors(); + } public function getDistType() { return $this->aliasOf->getDistType(); @@ -225,6 +237,10 @@ class AliasPackage extends BasePackage implements CompletePackageInterface { return $this->aliasOf->getDistUrl(); } + public function getDistUrls() + { + return $this->aliasOf->getDistUrls(); + } public function getDistReference() { return $this->aliasOf->getDistReference(); @@ -241,6 +257,14 @@ class AliasPackage extends BasePackage implements CompletePackageInterface { return $this->aliasOf->getTransportOptions(); } + public function setDistMirrors($mirrors) + { + return $this->aliasOf->setDistMirrors($mirrors); + } + public function getDistMirrors() + { + return $this->aliasOf->getDistMirrors(); + } public function getScripts() { return $this->aliasOf->getScripts(); diff --git a/src/Composer/Package/Dumper/ArrayDumper.php b/src/Composer/Package/Dumper/ArrayDumper.php index 8741acefb..67318c04a 100644 --- a/src/Composer/Package/Dumper/ArrayDumper.php +++ b/src/Composer/Package/Dumper/ArrayDumper.php @@ -49,6 +49,9 @@ class ArrayDumper $data['source']['type'] = $package->getSourceType(); $data['source']['url'] = $package->getSourceUrl(); $data['source']['reference'] = $package->getSourceReference(); + if ($mirrors = $package->getSourceMirrors()) { + $data['source']['mirrors'] = $mirrors; + } } if ($package->getDistType()) { @@ -56,6 +59,9 @@ class ArrayDumper $data['dist']['url'] = $package->getDistUrl(); $data['dist']['reference'] = $package->getDistReference(); $data['dist']['shasum'] = $package->getDistSha1Checksum(); + if ($mirrors = $package->getDistMirrors()) { + $data['dist']['mirrors'] = $mirrors; + } } if ($package->getArchiveExcludes()) { diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 66d48f65e..142b15c72 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -87,6 +87,9 @@ class ArrayLoader implements LoaderInterface $package->setSourceType($config['source']['type']); $package->setSourceUrl($config['source']['url']); $package->setSourceReference($config['source']['reference']); + if (isset($config['source']['mirrors'])) { + $package->setSourceMirrors($config['source']['mirrors']); + } } if (isset($config['dist'])) { @@ -103,6 +106,9 @@ class ArrayLoader implements LoaderInterface $package->setDistUrl($config['dist']['url']); $package->setDistReference(isset($config['dist']['reference']) ? $config['dist']['reference'] : null); $package->setDistSha1Checksum(isset($config['dist']['shasum']) ? $config['dist']['shasum'] : null); + if (isset($config['dist']['mirrors'])) { + $package->setDistMirrors($config['dist']['mirrors']); + } } foreach (Package\BasePackage::$supportedLinkTypes as $type => $opts) { diff --git a/src/Composer/Package/Package.php b/src/Composer/Package/Package.php index 8fab59a8a..ffc759f62 100644 --- a/src/Composer/Package/Package.php +++ b/src/Composer/Package/Package.php @@ -27,10 +27,12 @@ class Package extends BasePackage protected $sourceType; protected $sourceUrl; protected $sourceReference; + protected $sourceMirrors; protected $distType; protected $distUrl; protected $distReference; protected $distSha1Checksum; + protected $distMirrors; protected $version; protected $prettyVersion; protected $releaseDate; @@ -217,6 +219,30 @@ class Package extends BasePackage return $this->sourceReference; } + /** + * @param array|null $mirrors + */ + public function setSourceMirrors($mirrors) + { + $this->sourceMirrors = $mirrors; + } + + /** + * {@inheritDoc} + */ + public function getSourceMirrors() + { + return $this->sourceMirrors; + } + + /** + * {@inheritDoc} + */ + public function getSourceUrls() + { + return $this->getUrls($this->sourceUrl, $this->sourceMirrors, $this->sourceReference, $this->sourceType); + } + /** * @param string $type */ @@ -281,6 +307,30 @@ class Package extends BasePackage return $this->distSha1Checksum; } + /** + * @param array|null $mirrors + */ + public function setDistMirrors($mirrors) + { + $this->distMirrors = $mirrors; + } + + /** + * {@inheritDoc} + */ + public function getDistMirrors() + { + return $this->distMirrors; + } + + /** + * {@inheritDoc} + */ + public function getDistUrls() + { + return $this->getUrls($this->distUrl, $this->distMirrors, $this->distReference, $this->distType); + } + /** * {@inheritDoc} */ @@ -528,4 +578,22 @@ class Package extends BasePackage $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; } + + protected function getUrls($url, $mirrors, $ref, $type) + { + $urls = array($url); + if ($mirrors) { + foreach ($mirrors as $mirror) { + $mirrorUrl = str_replace( + array('%package%', '%version%', '%reference%', '%type%'), + array($this->name, $this->version, $ref, $type), + $mirror['url'] + ); + $func = $mirror['preferred'] ? 'array_unshift' : 'array_push'; + $func($urls, $mirrorUrl); + } + } + + return $urls; + } } diff --git a/src/Composer/Package/PackageInterface.php b/src/Composer/Package/PackageInterface.php index 337a72a83..50553f9c4 100644 --- a/src/Composer/Package/PackageInterface.php +++ b/src/Composer/Package/PackageInterface.php @@ -115,6 +115,13 @@ interface PackageInterface */ public function getSourceUrl(); + /** + * Returns the repository urls of this package including mirrors, e.g. git://github.com/naderman/composer.git + * + * @return string + */ + public function getSourceUrls(); + /** * Returns the repository reference of this package, e.g. master, 1.0.0 or a commit hash for git * @@ -122,6 +129,13 @@ interface PackageInterface */ public function getSourceReference(); + /** + * Returns the source mirrors of this package + * + * @return array|null + */ + public function getSourceMirrors(); + /** * Returns the type of the distribution archive of this version, e.g. zip, tarball * @@ -136,6 +150,13 @@ interface PackageInterface */ public function getDistUrl(); + /** + * Returns the urls of the distribution archive of this version, including mirrors + * + * @return string + */ + public function getDistUrls(); + /** * Returns the reference of the distribution archive of this version, e.g. master, 1.0.0 or a commit hash for git * @@ -150,6 +171,13 @@ interface PackageInterface */ public function getDistSha1Checksum(); + /** + * Returns the dist mirrors of this package + * + * @return array|null + */ + public function getDistMirrors(); + /** * Returns the version of this package * diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 8ed6897c4..ba6087027 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -50,6 +50,8 @@ class ComposerRepository extends ArrayRepository implements StreamableRepository protected $rootAliases; protected $allowSslDowngrade = false; protected $eventDispatcher; + protected $sourceMirrors; + protected $distMirrors; private $rawData; private $minimalPackages; private $degradedMode = false; @@ -434,6 +436,17 @@ class ComposerRepository extends ArrayRepository implements StreamableRepository $this->searchUrl = $this->canonicalizeUrl($data['search']); } + if (!empty($data['mirrors'])) { + foreach ($data['mirrors'] as $mirror) { + if (!empty($mirror['source-url'])) { + $this->sourceMirrors[] = array('url' => $mirror['source-url'], 'preferred' => !empty($mirror['preferred'])); + } + if (!empty($mirror['dist-url'])) { + $this->distMirrors[] = array('url' => $mirror['dist-url'], 'preferred' => !empty($mirror['preferred'])); + } + } + } + if ($this->allowSslDowngrade) { $this->url = str_replace('https://', 'http://', $this->url); } @@ -548,6 +561,8 @@ class ComposerRepository extends ArrayRepository implements StreamableRepository } $package = $this->loader->load($data, 'Composer\Package\CompletePackage'); + $package->setSourceMirrors($this->sourceMirrors); + $package->setDistMirrors($this->distMirrors); $this->configurePackageTransportOptions($package); return $package; diff --git a/tests/Composer/Test/Downloader/FileDownloaderTest.php b/tests/Composer/Test/Downloader/FileDownloaderTest.php index 28714de4a..ffdbf997d 100644 --- a/tests/Composer/Test/Downloader/FileDownloaderTest.php +++ b/tests/Composer/Test/Downloader/FileDownloaderTest.php @@ -48,6 +48,10 @@ class FileDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getDistUrl') ->will($this->returnValue('url')) ; + $packageMock->expects($this->once()) + ->method('getDistUrls') + ->will($this->returnValue(array('url'))) + ; $path = tempnam(sys_get_temp_dir(), 'c'); @@ -87,7 +91,11 @@ class FileDownloaderTest extends \PHPUnit_Framework_TestCase $packageMock = $this->getMock('Composer\Package\PackageInterface'); $packageMock->expects($this->any()) ->method('getDistUrl') - ->will($this->returnValue('http://example.com/script.js')) + ->will($this->returnValue($distUrl = 'http://example.com/script.js')) + ; + $packageMock->expects($this->once()) + ->method('getDistUrls') + ->will($this->returnValue(array($distUrl))) ; $packageMock->expects($this->atLeastOnce()) ->method('getTransportOptions') @@ -163,7 +171,7 @@ class FileDownloaderTest extends \PHPUnit_Framework_TestCase $packageMock = $this->getMock('Composer\Package\PackageInterface'); $packageMock->expects($this->any()) ->method('getDistUrl') - ->will($this->returnValue('http://example.com/script.js')) + ->will($this->returnValue($distUrl = 'http://example.com/script.js')) ; $packageMock->expects($this->atLeastOnce()) ->method('getTransportOptions') @@ -173,6 +181,10 @@ class FileDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getDistSha1Checksum') ->will($this->returnValue('invalid')) ; + $packageMock->expects($this->once()) + ->method('getDistUrls') + ->will($this->returnValue(array($distUrl))) + ; $filesystem = $this->getMock('Composer\Util\Filesystem'); do { diff --git a/tests/Composer/Test/Downloader/GitDownloaderTest.php b/tests/Composer/Test/Downloader/GitDownloaderTest.php index 01142580e..194fc96c9 100644 --- a/tests/Composer/Test/Downloader/GitDownloaderTest.php +++ b/tests/Composer/Test/Downloader/GitDownloaderTest.php @@ -51,8 +51,8 @@ class GitDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('1234567890123456789012345678901234567890')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://example.com/composer/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://example.com/composer/composer'))); $packageMock->expects($this->any()) ->method('getPrettyVersion') ->will($this->returnValue('dev-master')); @@ -90,8 +90,8 @@ class GitDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://github.com/composer/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://github.com/composer/composer'))); $packageMock->expects($this->any()) ->method('getPrettyVersion') ->will($this->returnValue('1.0.0')); @@ -147,8 +147,8 @@ class GitDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://github.com/composer/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://github.com/composer/composer'))); $packageMock->expects($this->any()) ->method('getPrettyVersion') ->will($this->returnValue('1.0.0')); @@ -188,8 +188,8 @@ class GitDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://example.com/composer/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://example.com/composer/composer'))); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->at(0)) ->method('execute') @@ -227,8 +227,8 @@ class GitDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://github.com/composer/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://github.com/composer/composer'))); $packageMock->expects($this->any()) ->method('getPrettyVersion') ->will($this->returnValue('1.0.0')); @@ -273,8 +273,8 @@ class GitDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://github.com/composer/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://github.com/composer/composer'))); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $processExecutor->expects($this->at(0)) ->method('execute') diff --git a/tests/Composer/Test/Downloader/HgDownloaderTest.php b/tests/Composer/Test/Downloader/HgDownloaderTest.php index 37a895172..ab9ec28cd 100644 --- a/tests/Composer/Test/Downloader/HgDownloaderTest.php +++ b/tests/Composer/Test/Downloader/HgDownloaderTest.php @@ -48,8 +48,8 @@ class HgDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->once()) - ->method('getSourceUrl') - ->will($this->returnValue('https://mercurial.dev/l3l0/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://mercurial.dev/l3l0/composer'))); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $expectedGitCommand = $this->getCmd('hg clone \'https://mercurial.dev/l3l0/composer\' \'composerPath\''); @@ -93,8 +93,8 @@ class HgDownloaderTest extends \PHPUnit_Framework_TestCase ->method('getSourceReference') ->will($this->returnValue('ref')); $packageMock->expects($this->any()) - ->method('getSourceUrl') - ->will($this->returnValue('https://github.com/l3l0/composer')); + ->method('getSourceUrls') + ->will($this->returnValue(array('https://github.com/l3l0/composer'))); $processExecutor = $this->getMock('Composer\Util\ProcessExecutor'); $expectedHgCommand = $this->getCmd("hg st"); diff --git a/tests/Composer/Test/Downloader/ZipDownloaderTest.php b/tests/Composer/Test/Downloader/ZipDownloaderTest.php index 36b2c2296..58e0078b0 100644 --- a/tests/Composer/Test/Downloader/ZipDownloaderTest.php +++ b/tests/Composer/Test/Downloader/ZipDownloaderTest.php @@ -28,7 +28,11 @@ class ZipDownloaderTest extends \PHPUnit_Framework_TestCase $packageMock = $this->getMock('Composer\Package\PackageInterface'); $packageMock->expects($this->any()) ->method('getDistUrl') - ->will($this->returnValue('file://'.__FILE__)) + ->will($this->returnValue($distUrl = 'file://'.__FILE__)) + ; + $packageMock->expects($this->any()) + ->method('getDistUrls') + ->will($this->returnValue(array($distUrl))) ; $packageMock->expects($this->atLeastOnce()) ->method('getTransportOptions')