1
0
Fork 0

More RemoteFilesystem usage removals and some repository/vcs driver refactorings

pull/7904/head
Jordi Boggiano 2018-11-12 15:34:54 +01:00
parent 713bc4de1d
commit f946d8eb5a
30 changed files with 156 additions and 107 deletions

View File

@ -176,7 +176,7 @@ class AwsPlugin implements PluginInterface, EventSubscriberInterface
if ($protocol === 's3') { if ($protocol === 's3') {
$awsClient = new AwsClient($this->io, $this->composer->getConfig()); $awsClient = new AwsClient($this->io, $this->composer->getConfig());
$s3Downloader = new S3Downloader($this->io, $event->getRemoteFilesystem()->getOptions(), $awsClient); $s3Downloader = new S3Downloader($this->io, $event->getHttpDownloader()->getOptions(), $awsClient);
$event->setHttpdownloader($s3Downloader); $event->setHttpdownloader($s3Downloader);
} }
} }

View File

@ -61,7 +61,7 @@ Composer fires the following named events during its execution process:
- **command**: occurs before any Composer Command is executed on the CLI. It - **command**: occurs before any Composer Command is executed on the CLI. It
provides you with access to the input and output objects of the program. provides you with access to the input and output objects of the program.
- **pre-file-download**: occurs before files are downloaded and allows - **pre-file-download**: occurs before files are downloaded and allows
you to manipulate the `RemoteFilesystem` object prior to downloading files you to manipulate the `HttpDownloader` object prior to downloading files
based on the URL to be downloaded. based on the URL to be downloaded.
- **pre-command-run**: occurs before a command is executed and allows you to - **pre-command-run**: occurs before a command is executed and allows you to
manipulate the `InputInterface` object's options and arguments to tweak manipulate the `InputInterface` object's options and arguments to tweak

View File

@ -22,7 +22,7 @@ use Composer\Plugin\PluginEvents;
use Composer\Util\ConfigValidator; use Composer\Util\ConfigValidator;
use Composer\Util\IniHelper; use Composer\Util\IniHelper;
use Composer\Util\ProcessExecutor; use Composer\Util\ProcessExecutor;
use Composer\Util\RemoteFilesystem; use Composer\Util\HttpDownloader;
use Composer\Util\StreamContextFactory; use Composer\Util\StreamContextFactory;
use Composer\SelfUpdate\Keys; use Composer\SelfUpdate\Keys;
use Composer\SelfUpdate\Versions; use Composer\SelfUpdate\Versions;
@ -35,8 +35,8 @@ use Symfony\Component\Console\Output\OutputInterface;
*/ */
class DiagnoseCommand extends BaseCommand class DiagnoseCommand extends BaseCommand
{ {
/** @var RemoteFilesystem */ /** @var HttpDownloader */
protected $rfs; protected $httpDownloader;
/** @var ProcessExecutor */ /** @var ProcessExecutor */
protected $process; protected $process;
@ -85,7 +85,7 @@ EOT
$config->merge(array('config' => array('secure-http' => false))); $config->merge(array('config' => array('secure-http' => false)));
$config->prohibitUrlByConfig('http://repo.packagist.org', new NullIO); $config->prohibitUrlByConfig('http://repo.packagist.org', new NullIO);
$this->rfs = Factory::createRemoteFilesystem($io, $config); $this->httpDownloader = Factory::createHttpDownloader($io, $config);
$this->process = new ProcessExecutor($io); $this->process = new ProcessExecutor($io);
$io->write('Checking platform settings: ', false); $io->write('Checking platform settings: ', false);
@ -226,7 +226,7 @@ EOT
} }
try { try {
$this->rfs->getContents('packagist.org', $proto . '://repo.packagist.org/packages.json', false); $this->httpDownloader->get($proto . '://repo.packagist.org/packages.json');
} catch (TransportException $e) { } catch (TransportException $e) {
if (false !== strpos($e->getMessage(), 'cafile')) { if (false !== strpos($e->getMessage(), 'cafile')) {
$result[] = '<error>[' . get_class($e) . '] ' . $e->getMessage() . '</error>'; $result[] = '<error>[' . get_class($e) . '] ' . $e->getMessage() . '</error>';
@ -253,11 +253,11 @@ EOT
$protocol = extension_loaded('openssl') ? 'https' : 'http'; $protocol = extension_loaded('openssl') ? 'https' : 'http';
try { try {
$json = json_decode($this->rfs->getContents('packagist.org', $protocol . '://repo.packagist.org/packages.json', false), true); $json = $this->httpDownloader->get($protocol . '://repo.packagist.org/packages.json')->parseJson();
$hash = reset($json['provider-includes']); $hash = reset($json['provider-includes']);
$hash = $hash['sha256']; $hash = $hash['sha256'];
$path = str_replace('%hash%', $hash, key($json['provider-includes'])); $path = str_replace('%hash%', $hash, key($json['provider-includes']));
$provider = $this->rfs->getContents('packagist.org', $protocol . '://repo.packagist.org/'.$path, false); $provider = $this->httpDownloader->get($protocol . '://repo.packagist.org/'.$path)->getBody();
if (hash('sha256', $provider) !== $hash) { if (hash('sha256', $provider) !== $hash) {
return 'It seems that your proxy is modifying http traffic on the fly'; return 'It seems that your proxy is modifying http traffic on the fly';
@ -285,10 +285,10 @@ EOT
$url = 'http://repo.packagist.org/packages.json'; $url = 'http://repo.packagist.org/packages.json';
try { try {
$this->rfs->getContents('packagist.org', $url, false); $this->httpDownloader->get($url);
} catch (TransportException $e) { } catch (TransportException $e) {
try { try {
$this->rfs->getContents('packagist.org', $url, false, array('http' => array('request_fulluri' => false))); $this->httpDownloader->get($url, array('http' => array('request_fulluri' => false)));
} catch (TransportException $e) { } catch (TransportException $e) {
return 'Unable to assess the situation, maybe packagist.org is down ('.$e->getMessage().')'; return 'Unable to assess the situation, maybe packagist.org is down ('.$e->getMessage().')';
} }
@ -319,10 +319,10 @@ EOT
$url = 'https://api.github.com/repos/Seldaek/jsonlint/zipball/1.0.0'; $url = 'https://api.github.com/repos/Seldaek/jsonlint/zipball/1.0.0';
try { try {
$this->rfs->getContents('github.com', $url, false); $this->httpDownloader->get($url);
} catch (TransportException $e) { } catch (TransportException $e) {
try { try {
$this->rfs->getContents('github.com', $url, false, array('http' => array('request_fulluri' => false))); $this->httpDownloader->get($url, array('http' => array('request_fulluri' => false)));
} catch (TransportException $e) { } catch (TransportException $e) {
return 'Unable to assess the situation, maybe github is down ('.$e->getMessage().')'; return 'Unable to assess the situation, maybe github is down ('.$e->getMessage().')';
} }
@ -344,7 +344,7 @@ EOT
try { try {
$url = $domain === 'github.com' ? 'https://api.'.$domain.'/' : 'https://'.$domain.'/api/v3/'; $url = $domain === 'github.com' ? 'https://api.'.$domain.'/' : 'https://'.$domain.'/api/v3/';
return $this->rfs->getContents($domain, $url, false, array( return $this->httpDownloader->get($url, array(
'retry-auth-failure' => false, 'retry-auth-failure' => false,
)) ? true : 'Unexpected error'; )) ? true : 'Unexpected error';
} catch (\Exception $e) { } catch (\Exception $e) {
@ -374,8 +374,7 @@ EOT
} }
$url = $domain === 'github.com' ? 'https://api.'.$domain.'/rate_limit' : 'https://'.$domain.'/api/rate_limit'; $url = $domain === 'github.com' ? 'https://api.'.$domain.'/rate_limit' : 'https://'.$domain.'/api/rate_limit';
$json = $this->rfs->getContents($domain, $url, false, array('retry-auth-failure' => false)); $data = $this->httpDownloader->get($url, array('retry-auth-failure' => false))->parseJson();
$data = json_decode($json, true);
return $data['resources']['core']; return $data['resources']['core'];
} }
@ -428,7 +427,7 @@ EOT
return $result; return $result;
} }
$versionsUtil = new Versions($config, $this->rfs); $versionsUtil = new Versions($config, $this->httpDownloader);
$latest = $versionsUtil->getLatest(); $latest = $versionsUtil->getLatest();
if (Composer::VERSION !== $latest['version'] && Composer::VERSION !== '@package_version@') { if (Composer::VERSION !== $latest['version'] && Composer::VERSION !== '@package_version@') {

View File

@ -76,9 +76,9 @@ EOT
} }
$io = $this->getIO(); $io = $this->getIO();
$remoteFilesystem = Factory::createRemoteFilesystem($io, $config); $httpDownloader = Factory::createHttpDownloader($io, $config);
$versionsUtil = new Versions($config, $remoteFilesystem); $versionsUtil = new Versions($config, $httpDownloader);
// switch channel if requested // switch channel if requested
foreach (array('stable', 'preview', 'snapshot') as $channel) { foreach (array('stable', 'preview', 'snapshot') as $channel) {
@ -155,9 +155,9 @@ EOT
$io->write(sprintf("Updating to version <info>%s</info> (%s channel).", $updateVersion, $versionsUtil->getChannel())); $io->write(sprintf("Updating to version <info>%s</info> (%s channel).", $updateVersion, $versionsUtil->getChannel()));
$remoteFilename = $baseUrl . ($updatingToTag ? "/download/{$updateVersion}/composer.phar" : '/composer.phar'); $remoteFilename = $baseUrl . ($updatingToTag ? "/download/{$updateVersion}/composer.phar" : '/composer.phar');
$signature = $remoteFilesystem->getContents(self::HOMEPAGE, $remoteFilename.'.sig', false); $signature = $httpDownloader->get($remoteFilename.'.sig')->getBody();
$io->writeError(' ', false); $io->writeError(' ', false);
$remoteFilesystem->copy(self::HOMEPAGE, $remoteFilename, $tempFilename, !$input->getOption('no-progress')); $httpDownloader->copy($remoteFilename, $tempFilename);
$io->writeError(''); $io->writeError('');
if (!file_exists($tempFilename) || !$signature) { if (!file_exists($tempFilename) || !$signature) {

View File

@ -123,6 +123,7 @@ class Compiler
->in(__DIR__.'/../../vendor/composer/ca-bundle/') ->in(__DIR__.'/../../vendor/composer/ca-bundle/')
->in(__DIR__.'/../../vendor/composer/xdebug-handler/') ->in(__DIR__.'/../../vendor/composer/xdebug-handler/')
->in(__DIR__.'/../../vendor/psr/') ->in(__DIR__.'/../../vendor/psr/')
->in(__DIR__.'/../../vendor/react/')
->sort($finderSort) ->sort($finderSort)
; ;

View File

@ -590,18 +590,18 @@ class Factory
throw new Exception\NoSslException('The openssl extension is required for SSL/TLS protection but is not available. ' throw new Exception\NoSslException('The openssl extension is required for SSL/TLS protection but is not available. '
. 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); . 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.');
} }
$remoteFilesystemOptions = array(); $httpDownloaderOptions = array();
if ($disableTls === false) { if ($disableTls === false) {
if ($config && $config->get('cafile')) { if ($config && $config->get('cafile')) {
$remoteFilesystemOptions['ssl']['cafile'] = $config->get('cafile'); $httpDownloaderOptions['ssl']['cafile'] = $config->get('cafile');
} }
if ($config && $config->get('capath')) { if ($config && $config->get('capath')) {
$remoteFilesystemOptions['ssl']['capath'] = $config->get('capath'); $httpDownloaderOptions['ssl']['capath'] = $config->get('capath');
} }
$remoteFilesystemOptions = array_replace_recursive($remoteFilesystemOptions, $options); $httpDownloaderOptions = array_replace_recursive($httpDownloaderOptions, $options);
} }
try { try {
$remoteFilesystem = new HttpDownloader($io, $config, $remoteFilesystemOptions, $disableTls); $httpDownloader = new HttpDownloader($io, $config, $httpDownloaderOptions, $disableTls);
} catch (TransportException $e) { } catch (TransportException $e) {
if (false !== strpos($e->getMessage(), 'cafile')) { if (false !== strpos($e->getMessage(), 'cafile')) {
$io->write('<error>Unable to locate a valid CA certificate file. You must set a valid \'cafile\' option.</error>'); $io->write('<error>Unable to locate a valid CA certificate file. You must set a valid \'cafile\' option.</error>');
@ -614,7 +614,7 @@ class Factory
throw $e; throw $e;
} }
return $remoteFilesystem; return $httpDownloader;
} }
/** /**

View File

@ -15,7 +15,7 @@ namespace Composer\Json;
use JsonSchema\Validator; use JsonSchema\Validator;
use Seld\JsonLint\JsonParser; use Seld\JsonLint\JsonParser;
use Seld\JsonLint\ParsingException; use Seld\JsonLint\ParsingException;
use Composer\Util\RemoteFilesystem; use Composer\Util\HttpDownloader;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Downloader\TransportException; use Composer\Downloader\TransportException;
@ -35,25 +35,25 @@ class JsonFile
const JSON_UNESCAPED_UNICODE = 256; const JSON_UNESCAPED_UNICODE = 256;
private $path; private $path;
private $rfs; private $httpDownloader;
private $io; private $io;
/** /**
* Initializes json file reader/parser. * Initializes json file reader/parser.
* *
* @param string $path path to a lockfile * @param string $path path to a lockfile
* @param RemoteFilesystem $rfs required for loading http/https json files * @param HttpDownloader $httpDownloader required for loading http/https json files
* @param IOInterface $io * @param IOInterface $io
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
*/ */
public function __construct($path, RemoteFilesystem $rfs = null, IOInterface $io = null) public function __construct($path, HttpDownloader $httpDownloader = null, IOInterface $io = null)
{ {
$this->path = $path; $this->path = $path;
if (null === $rfs && preg_match('{^https?://}i', $path)) { if (null === $httpDownloader && preg_match('{^https?://}i', $path)) {
throw new \InvalidArgumentException('http urls require a RemoteFilesystem instance to be passed'); throw new \InvalidArgumentException('http urls require a HttpDownloader instance to be passed');
} }
$this->rfs = $rfs; $this->httpDownloader = $httpDownloader;
$this->io = $io; $this->io = $io;
} }
@ -84,8 +84,8 @@ class JsonFile
public function read() public function read()
{ {
try { try {
if ($this->rfs) { if ($this->httpDownloader) {
$json = $this->rfs->getContents($this->path, $this->path, false); $json = $this->httpDownloader->get($this->path)->getBody();
} else { } else {
if ($this->io && $this->io->isDebug()) { if ($this->io && $this->io->isDebug()) {
$this->io->writeError('Reading ' . $this->path); $this->io->writeError('Reading ' . $this->path);

View File

@ -192,7 +192,8 @@ class VersionGuesser
} }
// re-use the HgDriver to fetch branches (this properly includes bookmarks) // re-use the HgDriver to fetch branches (this properly includes bookmarks)
$driver = new HgDriver(array('url' => $path), new NullIO(), $this->config, $this->process); $io = new NullIO();
$driver = new HgDriver(array('url' => $path), $io, $this->config, new HttpDownloader($io, $this->config), $this->process);
$branches = array_keys($driver->getBranches()); $branches = array_keys($driver->getBranches());
// try to find the best (nearest) version branch to assume this feature's version // try to find the best (nearest) version branch to assume this feature's version

View File

@ -62,7 +62,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
private $partialPackagesByName; private $partialPackagesByName;
private $versionParser; private $versionParser;
public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher, HttpDownloader $httpDownloader) public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null)
{ {
parent::__construct(); parent::__construct();
if (!preg_match('{^[\w.]+\??://}', $repoConfig['url'])) { if (!preg_match('{^[\w.]+\??://}', $repoConfig['url'])) {
@ -101,7 +101,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
$this->cache = new Cache($io, $config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $this->url), 'a-z0-9.$'); $this->cache = new Cache($io, $config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $this->url), 'a-z0-9.$');
$this->versionParser = new VersionParser(); $this->versionParser = new VersionParser();
$this->loader = new ArrayLoader($this->versionParser); $this->loader = new ArrayLoader($this->versionParser);
if ($httpDownloader && $this->options) { if ($this->options) {
// TODO solve this somehow - should be sent at request time not on the instance // TODO solve this somehow - should be sent at request time not on the instance
$httpDownloader = clone $httpDownloader; $httpDownloader = clone $httpDownloader;
$httpDownloader->setOptions($this->options); $httpDownloader->setOptions($this->options);
@ -781,10 +781,13 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
$retries = 3; $retries = 3;
while ($retries--) { while ($retries--) {
try { try {
$httpDownloader = $this->httpDownloader;
if ($this->eventDispatcher) {
$preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename); $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename);
$this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent);
$httpDownloader = $preFileDownloadEvent->getHttpDownloader(); $httpDownloader = $preFileDownloadEvent->getHttpDownloader();
}
$response = $httpDownloader->get($filename); $response = $httpDownloader->get($filename);
$json = $response->getBody(); $json = $response->getBody();
@ -869,10 +872,14 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
$retries = 3; $retries = 3;
while ($retries--) { while ($retries--) {
try { try {
$httpDownloader = $this->httpDownloader;
if ($this->eventDispatcher) {
$preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename); $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename);
$this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent);
$httpDownloader = $preFileDownloadEvent->getHttpDownloader(); $httpDownloader = $preFileDownloadEvent->getHttpDownloader();
}
$options = array('http' => array('header' => array('If-Modified-Since: '.$lastModifiedTime))); $options = array('http' => array('header' => array('If-Modified-Since: '.$lastModifiedTime)));
$response = $httpDownloader->get($filename, $options); $response = $httpDownloader->get($filename, $options);
$json = $response->getBody(); $json = $response->getBody();
@ -925,10 +932,14 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
protected function asyncFetchFile($filename, $cacheKey, $lastModifiedTime = null) protected function asyncFetchFile($filename, $cacheKey, $lastModifiedTime = null)
{ {
$retries = 3; $retries = 3;
$httpDownloader = $this->httpDownloader;
if ($this->eventDispatcher) {
$preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename); $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename);
$this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent);
$httpDownloader = $preFileDownloadEvent->getHttpDownloader(); $httpDownloader = $preFileDownloadEvent->getHttpDownloader();
}
$options = $lastModifiedTime ? array('http' => array('header' => array('If-Modified-Since: '.$lastModifiedTime))) : array(); $options = $lastModifiedTime ? array('http' => array('header' => array('If-Modified-Since: '.$lastModifiedTime))) : array();
$io = $this->io; $io = $this->io;

View File

@ -47,7 +47,7 @@ class PearRepository extends ArrayRepository implements ConfigurableRepositoryIn
*/ */
private $vendorAlias; private $vendorAlias;
public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher, HttpDownloader $httpDownloader) public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $dispatcher = null)
{ {
parent::__construct(); parent::__construct();
if (!preg_match('{^https?://}', $repoConfig['url'])) { if (!preg_match('{^https?://}', $repoConfig['url'])) {

View File

@ -36,7 +36,7 @@ class RepositoryFactory
if (0 === strpos($repository, 'http')) { if (0 === strpos($repository, 'http')) {
$repoConfig = array('type' => 'composer', 'url' => $repository); $repoConfig = array('type' => 'composer', 'url' => $repository);
} elseif ("json" === pathinfo($repository, PATHINFO_EXTENSION)) { } elseif ("json" === pathinfo($repository, PATHINFO_EXTENSION)) {
$json = new JsonFile($repository, Factory::createRemoteFilesystem($io, $config)); $json = new JsonFile($repository, Factory::createHttpDownloader($io, $config));
$data = $json->read(); $data = $json->read();
if (!empty($data['packages']) || !empty($data['includes']) || !empty($data['provider-includes'])) { if (!empty($data['packages']) || !empty($data['includes']) || !empty($data['provider-includes'])) {
$repoConfig = array('type' => 'composer', 'url' => 'file://' . strtr(realpath($repository), '\\', '/')); $repoConfig = array('type' => 'composer', 'url' => 'file://' . strtr(realpath($repository), '\\', '/'));
@ -77,7 +77,7 @@ class RepositoryFactory
*/ */
public static function createRepo(IOInterface $io, Config $config, array $repoConfig) public static function createRepo(IOInterface $io, Config $config, array $repoConfig)
{ {
$rm = static::manager($io, $config, null, Factory::createRemoteFilesystem($io, $config)); $rm = static::manager($io, $config, Factory::createHttpDownloader($io, $config));
$repos = static::createRepos($rm, array($repoConfig)); $repos = static::createRepos($rm, array($repoConfig));
return reset($repos); return reset($repos);
@ -98,7 +98,7 @@ class RepositoryFactory
if (!$io) { if (!$io) {
throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager'); throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager');
} }
$rm = static::manager($io, $config, null, Factory::createRemoteFilesystem($io, $config)); $rm = static::manager($io, $config, Factory::createHttpDownloader($io, $config));
} }
return static::createRepos($rm, $config->getRepositories()); return static::createRepos($rm, $config->getRepositories());
@ -113,7 +113,7 @@ class RepositoryFactory
*/ */
public static function manager(IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null) public static function manager(IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null)
{ {
$rm = new RepositoryManager($io, $config, $eventDispatcher, $httpDownloader); $rm = new RepositoryManager($io, $config, $httpDownloader, $eventDispatcher);
$rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository'); $rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository');
$rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository');
$rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository'); $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository');

View File

@ -35,12 +35,12 @@ class RepositoryManager
private $eventDispatcher; private $eventDispatcher;
private $httpDownloader; private $httpDownloader;
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher, HttpDownloader $httpDownloader) public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null)
{ {
$this->io = $io; $this->io = $io;
$this->config = $config; $this->config = $config;
$this->eventDispatcher = $eventDispatcher;
$this->httpDownloader = $httpDownloader; $this->httpDownloader = $httpDownloader;
$this->eventDispatcher = $eventDispatcher;
} }
/** /**
@ -127,8 +127,8 @@ class RepositoryManager
$reflMethod = new \ReflectionMethod($class, '__construct'); $reflMethod = new \ReflectionMethod($class, '__construct');
$params = $reflMethod->getParameters(); $params = $reflMethod->getParameters();
if (isset($params[4]) && $params[4]->getClass() && $params[4]->getClass()->getName() === 'Composer\Util\HttpDownloader') { if (isset($params[3]) && $params[3]->getClass() && $params[3]->getClass()->getName() === 'Composer\Util\HttpDownloader') {
return new $class($config, $this->io, $this->config, $this->eventDispatcher, $this->httpDownloader); return new $class($config, $this->io, $this->config, $this->httpDownloader, $this->eventDispatcher);
} }
return new $class($config, $this->io, $this->config, $this->eventDispatcher); return new $class($config, $this->io, $this->config, $this->eventDispatcher);

View File

@ -75,8 +75,8 @@ class GitBitbucketDriver extends BitbucketDriver
array('url' => $url), array('url' => $url),
$this->io, $this->io,
$this->config, $this->config,
$this->process, $this->httpDownloader,
$this->httpDownloader $this->process
); );
$this->fallbackDriver->initialize(); $this->fallbackDriver->initialize();
} }

View File

@ -457,8 +457,8 @@ class GitHubDriver extends VcsDriver
array('url' => $url), array('url' => $url),
$this->io, $this->io,
$this->config, $this->config,
$this->process, $this->httpDownloader,
$this->httpDownloader $this->process
); );
$this->gitDriver->initialize(); $this->gitDriver->initialize();
} }

View File

@ -376,8 +376,8 @@ class GitLabDriver extends VcsDriver
array('url' => $url), array('url' => $url),
$this->io, $this->io,
$this->config, $this->config,
$this->process, $this->httpDownloader,
$this->httpDownloader $this->process
); );
$this->gitDriver->initialize(); $this->gitDriver->initialize();
} }

View File

@ -75,8 +75,8 @@ class HgBitbucketDriver extends BitbucketDriver
array('url' => $url), array('url' => $url),
$this->io, $this->io,
$this->config, $this->config,
$this->process, $this->httpDownloader,
$this->httpDownloader $this->process
); );
$this->fallbackDriver->initialize(); $this->fallbackDriver->initialize();
} }

View File

@ -55,10 +55,10 @@ abstract class VcsDriver implements VcsDriverInterface
* @param array $repoConfig The repository configuration * @param array $repoConfig The repository configuration
* @param IOInterface $io The IO instance * @param IOInterface $io The IO instance
* @param Config $config The composer configuration * @param Config $config The composer configuration
* @param ProcessExecutor $process Process instance, injectable for mocking
* @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking
* @param ProcessExecutor $process Process instance, injectable for mocking
*/ */
final public function __construct(array $repoConfig, IOInterface $io, Config $config, ProcessExecutor $process = null, HttpDownloader $httpDownloader = null) final public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, ProcessExecutor $process)
{ {
if (Filesystem::isLocalPath($repoConfig['url'])) { if (Filesystem::isLocalPath($repoConfig['url'])) {
$repoConfig['url'] = Filesystem::getPlatformPath($repoConfig['url']); $repoConfig['url'] = Filesystem::getPlatformPath($repoConfig['url']);
@ -69,8 +69,8 @@ abstract class VcsDriver implements VcsDriverInterface
$this->repoConfig = $repoConfig; $this->repoConfig = $repoConfig;
$this->io = $io; $this->io = $io;
$this->config = $config; $this->config = $config;
$this->process = $process ?: new ProcessExecutor($io); $this->httpDownloader = $httpDownloader;
$this->httpDownloader = $httpDownloader ?: Factory::createHttpDownloader($this->io, $config); $this->process = $process;
} }
/** /**

View File

@ -20,6 +20,8 @@ use Composer\Package\Loader\ValidatingArrayLoader;
use Composer\Package\Loader\InvalidPackageException; use Composer\Package\Loader\InvalidPackageException;
use Composer\Package\Loader\LoaderInterface; use Composer\Package\Loader\LoaderInterface;
use Composer\EventDispatcher\EventDispatcher; use Composer\EventDispatcher\EventDispatcher;
use Composer\Util\ProcessExecutor;
use Composer\Util\HttpDownloader;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Config; use Composer\Config;
@ -37,6 +39,8 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
protected $type; protected $type;
protected $loader; protected $loader;
protected $repoConfig; protected $repoConfig;
protected $httpDownloader;
protected $processExecutor;
protected $branchErrorOccurred = false; protected $branchErrorOccurred = false;
private $drivers; private $drivers;
/** @var VcsDriverInterface */ /** @var VcsDriverInterface */
@ -44,7 +48,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
/** @var VersionCacheInterface */ /** @var VersionCacheInterface */
private $versionCache; private $versionCache;
public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher = null, array $drivers = null, VersionCacheInterface $versionCache = null) public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $dispatcher = null, array $drivers = null, VersionCacheInterface $versionCache = null)
{ {
parent::__construct(); parent::__construct();
$this->drivers = $drivers ?: array( $this->drivers = $drivers ?: array(
@ -67,6 +71,8 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
$this->config = $config; $this->config = $config;
$this->repoConfig = $repoConfig; $this->repoConfig = $repoConfig;
$this->versionCache = $versionCache; $this->versionCache = $versionCache;
$this->httpDownloader = $httpDownloader;
$this->processExecutor = new ProcessExecutor($io);
} }
public function getRepoConfig() public function getRepoConfig()
@ -87,7 +93,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
if (isset($this->drivers[$this->type])) { if (isset($this->drivers[$this->type])) {
$class = $this->drivers[$this->type]; $class = $this->drivers[$this->type];
$this->driver = new $class($this->repoConfig, $this->io, $this->config); $this->driver = new $class($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->processExecutor);
$this->driver->initialize(); $this->driver->initialize();
return $this->driver; return $this->driver;
@ -95,7 +101,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
foreach ($this->drivers as $driver) { foreach ($this->drivers as $driver) {
if ($driver::supports($this->io, $this->config, $this->url)) { if ($driver::supports($this->io, $this->config, $this->url)) {
$this->driver = new $driver($this->repoConfig, $this->io, $this->config); $this->driver = new $driver($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->processExecutor);
$this->driver->initialize(); $this->driver->initialize();
return $this->driver; return $this->driver;
@ -104,7 +110,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
foreach ($this->drivers as $driver) { foreach ($this->drivers as $driver) {
if ($driver::supports($this->io, $this->config, $this->url, true)) { if ($driver::supports($this->io, $this->config, $this->url, true)) {
$this->driver = new $driver($this->repoConfig, $this->io, $this->config); $this->driver = new $driver($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->processExecutor);
$this->driver->initialize(); $this->driver->initialize();
return $this->driver; return $this->driver;

View File

@ -12,7 +12,7 @@
namespace Composer\SelfUpdate; namespace Composer\SelfUpdate;
use Composer\Util\RemoteFilesystem; use Composer\Util\HttpDownloader;
use Composer\Config; use Composer\Config;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
@ -21,13 +21,13 @@ use Composer\Json\JsonFile;
*/ */
class Versions class Versions
{ {
private $rfs; private $httpDownloader;
private $config; private $config;
private $channel; private $channel;
public function __construct(Config $config, RemoteFilesystem $rfs) public function __construct(Config $config, HttpDownloader $httpDownloader)
{ {
$this->rfs = $rfs; $this->httpDownloader = $httpDownloader;
$this->config = $config; $this->config = $config;
} }
@ -62,7 +62,7 @@ class Versions
public function getLatest() public function getLatest()
{ {
$protocol = extension_loaded('openssl') ? 'https' : 'http'; $protocol = extension_loaded('openssl') ? 'https' : 'http';
$versions = JsonFile::parseJson($this->rfs->getContents('getcomposer.org', $protocol . '://getcomposer.org/versions', false)); $versions = $this->httpDownloader->get($protocol . '://getcomposer.org/versions')->decodeJson();
foreach ($versions[$this->getChannel()] as $version) { foreach ($versions[$this->getChannel()] as $version) {
if ($version['min-php'] <= PHP_VERSION_ID) { if ($version['min-php'] <= PHP_VERSION_ID) {

View File

@ -102,6 +102,26 @@ class HttpDownloader
return $promise; return $promise;
} }
/**
* Retrieve the options set in the constructor
*
* @return array Options
*/
public function getOptions()
{
return $this->options;
}
/**
* Merges new options
*
* @return array $options
*/
public function setOptions(array $options)
{
$this->options = array_replace_recursive($this->options, $options);
}
private function addJob($request, $sync = false) private function addJob($request, $sync = false)
{ {
$job = array( $job = array(

View File

@ -17,6 +17,7 @@ use Composer\Config;
use Composer\Repository\VcsRepository; use Composer\Repository\VcsRepository;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Test\TestCase; use Composer\Test\TestCase;
use Composer\Factory;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
/** /**
@ -96,7 +97,7 @@ class PerforceDownloaderTest extends TestCase
{ {
$repository = $this->getMockBuilder('Composer\Repository\VcsRepository') $repository = $this->getMockBuilder('Composer\Repository\VcsRepository')
->setMethods(array('getRepoConfig')) ->setMethods(array('getRepoConfig'))
->setConstructorArgs(array($repoConfig, $io, $config)) ->setConstructorArgs(array($repoConfig, $io, $config, Factory::createHttpDownloader($io, $config)))
->getMock(); ->getMock();
$repository->expects($this->any())->method('getRepoConfig')->will($this->returnValue($repoConfig)); $repository->expects($this->any())->method('getRepoConfig')->will($this->returnValue($repoConfig));

View File

@ -65,7 +65,7 @@ class InstallerTest extends TestCase
$eventDispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(); $eventDispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock();
$httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(); $httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock();
$repositoryManager = new RepositoryManager($io, $config, $eventDispatcher, $httpDownloader); $repositoryManager = new RepositoryManager($io, $config, $httpDownloader, $eventDispatcher);
$repositoryManager->setLocalRepository(new InstalledArrayRepository()); $repositoryManager->setLocalRepository(new InstalledArrayRepository());
if (!is_array($repositories)) { if (!is_array($repositories)) {

View File

@ -37,8 +37,8 @@ class ComposerRepositoryTest extends TestCase
$repoConfig, $repoConfig,
new NullIO, new NullIO,
FactoryMock::createConfig(), FactoryMock::createConfig(),
$this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock() $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock()
)) ))
->getMock(); ->getMock();
@ -203,7 +203,7 @@ class ComposerRepositoryTest extends TestCase
->with($url = 'http://example.org/search.json?q=foo&type=library') ->with($url = 'http://example.org/search.json?q=foo&type=library')
->willReturn(new \Composer\Util\Http\Response(array('url' => $url), 200, array(), json_encode(array()))); ->willReturn(new \Composer\Util\Http\Response(array('url' => $url), 200, array(), json_encode(array())));
$repository = new ComposerRepository($repoConfig, new NullIO, FactoryMock::createConfig(), $eventDispatcher, $httpDownloader); $repository = new ComposerRepository($repoConfig, new NullIO, FactoryMock::createConfig(), $httpDownloader, $eventDispatcher);
$this->assertSame( $this->assertSame(
array(array('name' => 'foo', 'description' => null)), array(array('name' => 'foo', 'description' => null)),

View File

@ -28,7 +28,7 @@ class PearRepositoryTest extends TestCase
/** /**
* @var \PHPUnit_Framework_MockObject_MockObject * @var \PHPUnit_Framework_MockObject_MockObject
*/ */
private $remoteFilesystem; private $httpDownloader;
public function testComposerShouldSetIncludePath() public function testComposerShouldSetIncludePath()
{ {

View File

@ -38,8 +38,8 @@ class RepositoryManagerTest extends TestCase
$rm = new RepositoryManager( $rm = new RepositoryManager(
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
$this->getMockBuilder('Composer\Config')->getMock(), $this->getMockBuilder('Composer\Config')->getMock(),
$this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock() $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock()
); );
$repository1 = $this->getMockBuilder('Composer\Repository\RepositoryInterface')->getMock(); $repository1 = $this->getMockBuilder('Composer\Repository\RepositoryInterface')->getMock();
@ -62,8 +62,8 @@ class RepositoryManagerTest extends TestCase
$rm = new RepositoryManager( $rm = new RepositoryManager(
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
$config = $this->getMockBuilder('Composer\Config')->setMethods(array('get'))->getMock(), $config = $this->getMockBuilder('Composer\Config')->setMethods(array('get'))->getMock(),
$this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock() $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock()
); );
$tmpdir = $this->tmpdir; $tmpdir = $this->tmpdir;

View File

@ -16,6 +16,7 @@ use Composer\Config;
use Composer\Repository\Vcs\GitBitbucketDriver; use Composer\Repository\Vcs\GitBitbucketDriver;
use Composer\Test\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\ProcessExecutor;
use Composer\Util\Http\Response; use Composer\Util\Http\Response;
/** /**
@ -68,8 +69,8 @@ class GitBitbucketDriverTest extends TestCase
$repoConfig, $repoConfig,
$this->io, $this->io,
$this->config, $this->config,
null, $this->httpDownloader,
$this->httpDownloader new ProcessExecutor($this->io)
); );
$driver->initialize(); $driver->initialize();

View File

@ -96,7 +96,7 @@ class GitHubDriverTest extends TestCase
'url' => $repoUrl, 'url' => $repoUrl,
); );
$gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, $httpDownloader); $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $process);
$gitHubDriver->initialize(); $gitHubDriver->initialize();
$this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
@ -139,7 +139,11 @@ class GitHubDriverTest extends TestCase
); );
$repoUrl = 'https://github.com/composer/packagist.git'; $repoUrl = 'https://github.com/composer/packagist.git';
$gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $httpDownloader); $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')
->disableOriginalConstructor()
->getMock();
$gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $process);
$gitHubDriver->initialize(); $gitHubDriver->initialize();
$this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
@ -192,7 +196,11 @@ class GitHubDriverTest extends TestCase
); );
$repoUrl = 'https://github.com/composer/packagist.git'; $repoUrl = 'https://github.com/composer/packagist.git';
$gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $httpDownloader); $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')
->disableOriginalConstructor()
->getMock();
$gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config,$httpDownloader, $process);
$gitHubDriver->initialize(); $gitHubDriver->initialize();
$this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
@ -279,7 +287,7 @@ class GitHubDriverTest extends TestCase
'url' => $repoUrl, 'url' => $repoUrl,
); );
$gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, $httpDownloader); $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $process);
$gitHubDriver->initialize(); $gitHubDriver->initialize();
$this->assertEquals('test_master', $gitHubDriver->getRootIdentifier()); $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());

View File

@ -92,7 +92,7 @@ JSON;
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
; ;
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -129,7 +129,7 @@ JSON;
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
; ;
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -165,7 +165,7 @@ JSON;
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
; ;
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -204,7 +204,7 @@ JSON;
$this->mockResponse($apiUrl, array(), sprintf($projectData, $domain, $port, $namespace)) $this->mockResponse($apiUrl, array(), sprintf($projectData, $domain, $port, $namespace))
->shouldBeCalledTimes(1); ->shouldBeCalledTimes(1);
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -457,7 +457,7 @@ JSON;
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
; ;
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -488,7 +488,7 @@ JSON;
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
; ;
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -519,7 +519,7 @@ JSON;
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
; ;
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->process->reveal(), $this->httpDownloader->reveal()); $driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $this->config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize(); $driver->initialize();
$this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL');
@ -555,8 +555,8 @@ JSON;
array('url' => 'https://gitlab.mycompany.local/mygroup/myproject', 'options' => $options), array('url' => 'https://gitlab.mycompany.local/mygroup/myproject', 'options' => $options),
$this->io->reveal(), $this->io->reveal(),
$this->config, $this->config,
$this->process->reveal(), $this->httpDownloader->reveal(),
$this->httpDownloader->reveal() $this->process->reveal()
); );
$driver->initialize(); $driver->initialize();
} }

View File

@ -45,7 +45,7 @@ class PerforceDriverTest extends TestCase
$this->process = $this->getMockProcessExecutor(); $this->process = $this->getMockProcessExecutor();
$this->httpDownloader = $this->getMockHttpDownloader(); $this->httpDownloader = $this->getMockHttpDownloader();
$this->perforce = $this->getMockPerforce(); $this->perforce = $this->getMockPerforce();
$this->driver = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->process, $this->httpDownloader); $this->driver = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->process);
$this->overrideDriverInternalPerforce($this->perforce); $this->overrideDriverInternalPerforce($this->perforce);
} }
@ -113,7 +113,7 @@ class PerforceDriverTest extends TestCase
public function testInitializeCapturesVariablesFromRepoConfig() public function testInitializeCapturesVariablesFromRepoConfig()
{ {
$driver = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->process, $this->httpDownloader); $driver = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->process);
$driver->initialize(); $driver->initialize();
$this->assertEquals(self::TEST_URL, $driver->getUrl()); $this->assertEquals(self::TEST_URL, $driver->getUrl());
$this->assertEquals(self::TEST_DEPOT, $driver->getDepot()); $this->assertEquals(self::TEST_DEPOT, $driver->getDepot());

View File

@ -46,6 +46,7 @@ class SvnDriverTest extends TestCase
public function testWrongCredentialsInUrl() public function testWrongCredentialsInUrl()
{ {
$console = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $console = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock();
$output = "svn: OPTIONS of 'https://corp.svn.local/repo':"; $output = "svn: OPTIONS of 'https://corp.svn.local/repo':";
$output .= " authorization failed: Could not authenticate to server:"; $output .= " authorization failed: Could not authenticate to server:";
@ -66,7 +67,7 @@ class SvnDriverTest extends TestCase
'url' => 'https://till:secret@corp.svn.local/repo', 'url' => 'https://till:secret@corp.svn.local/repo',
); );
$svn = new SvnDriver($repoConfig, $console, $this->config, $process); $svn = new SvnDriver($repoConfig, $console, $this->config, $httpDownloader, $process);
$svn->initialize(); $svn->initialize();
} }