Avoid doing too many loads of the remotefilesystem
parent
fc4d94f160
commit
c1cc6bfecf
|
@ -17,6 +17,7 @@ use Composer\Cache;
|
||||||
use Composer\EventDispatcher\EventDispatcher;
|
use Composer\EventDispatcher\EventDispatcher;
|
||||||
use Composer\Package\PackageInterface;
|
use Composer\Package\PackageInterface;
|
||||||
use Composer\Util\ProcessExecutor;
|
use Composer\Util\ProcessExecutor;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
use Composer\IO\IOInterface;
|
use Composer\IO\IOInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,10 +29,10 @@ class GzipDownloader extends ArchiveDownloader
|
||||||
{
|
{
|
||||||
protected $process;
|
protected $process;
|
||||||
|
|
||||||
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null)
|
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$this->process = $process ?: new ProcessExecutor($io);
|
$this->process = $process ?: new ProcessExecutor($io);
|
||||||
parent::__construct($io, $config, $eventDispatcher, $cache);
|
parent::__construct($io, $config, $eventDispatcher, $cache, $rfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function extract($file, $path)
|
protected function extract($file, $path)
|
||||||
|
|
|
@ -16,6 +16,7 @@ use Composer\Config;
|
||||||
use Composer\Cache;
|
use Composer\Cache;
|
||||||
use Composer\EventDispatcher\EventDispatcher;
|
use Composer\EventDispatcher\EventDispatcher;
|
||||||
use Composer\Util\ProcessExecutor;
|
use Composer\Util\ProcessExecutor;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
use Composer\IO\IOInterface;
|
use Composer\IO\IOInterface;
|
||||||
use RarArchive;
|
use RarArchive;
|
||||||
|
|
||||||
|
@ -30,10 +31,10 @@ class RarDownloader extends ArchiveDownloader
|
||||||
{
|
{
|
||||||
protected $process;
|
protected $process;
|
||||||
|
|
||||||
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null)
|
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$this->process = $process ?: new ProcessExecutor($io);
|
$this->process = $process ?: new ProcessExecutor($io);
|
||||||
parent::__construct($io, $config, $eventDispatcher, $cache);
|
parent::__construct($io, $config, $eventDispatcher, $cache, $rfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function extract($file, $path)
|
protected function extract($file, $path)
|
||||||
|
|
|
@ -37,7 +37,7 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
|
||||||
$this->io = $io;
|
$this->io = $io;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->process = $process ?: new ProcessExecutor($io);
|
$this->process = $process ?: new ProcessExecutor($io);
|
||||||
$this->filesystem = $fs ?: new Filesystem;
|
$this->filesystem = $fs ?: new Filesystem($this->process);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -17,6 +17,7 @@ use Composer\Cache;
|
||||||
use Composer\EventDispatcher\EventDispatcher;
|
use Composer\EventDispatcher\EventDispatcher;
|
||||||
use Composer\Package\PackageInterface;
|
use Composer\Package\PackageInterface;
|
||||||
use Composer\Util\ProcessExecutor;
|
use Composer\Util\ProcessExecutor;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
use Composer\IO\IOInterface;
|
use Composer\IO\IOInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,11 +30,11 @@ class XzDownloader extends ArchiveDownloader
|
||||||
{
|
{
|
||||||
protected $process;
|
protected $process;
|
||||||
|
|
||||||
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null)
|
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$this->process = $process ?: new ProcessExecutor($io);
|
$this->process = $process ?: new ProcessExecutor($io);
|
||||||
|
|
||||||
parent::__construct($io, $config, $eventDispatcher, $cache);
|
parent::__construct($io, $config, $eventDispatcher, $cache, $rfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function extract($file, $path)
|
protected function extract($file, $path)
|
||||||
|
|
|
@ -16,6 +16,7 @@ use Composer\Config;
|
||||||
use Composer\Cache;
|
use Composer\Cache;
|
||||||
use Composer\EventDispatcher\EventDispatcher;
|
use Composer\EventDispatcher\EventDispatcher;
|
||||||
use Composer\Util\ProcessExecutor;
|
use Composer\Util\ProcessExecutor;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
use Composer\IO\IOInterface;
|
use Composer\IO\IOInterface;
|
||||||
use ZipArchive;
|
use ZipArchive;
|
||||||
|
|
||||||
|
@ -26,10 +27,10 @@ class ZipDownloader extends ArchiveDownloader
|
||||||
{
|
{
|
||||||
protected $process;
|
protected $process;
|
||||||
|
|
||||||
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null)
|
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$this->process = $process ?: new ProcessExecutor($io);
|
$this->process = $process ?: new ProcessExecutor($io);
|
||||||
parent::__construct($io, $config, $eventDispatcher, $cache);
|
parent::__construct($io, $config, $eventDispatcher, $cache, $rfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function extract($file, $path)
|
protected function extract($file, $path)
|
||||||
|
|
|
@ -19,6 +19,7 @@ use Composer\Package\Archiver;
|
||||||
use Composer\Package\Version\VersionGuesser;
|
use Composer\Package\Version\VersionGuesser;
|
||||||
use Composer\Repository\RepositoryManager;
|
use Composer\Repository\RepositoryManager;
|
||||||
use Composer\Repository\WritableRepositoryInterface;
|
use Composer\Repository\WritableRepositoryInterface;
|
||||||
|
use Composer\Util\Filesystem;
|
||||||
use Composer\Util\ProcessExecutor;
|
use Composer\Util\ProcessExecutor;
|
||||||
use Composer\Util\RemoteFilesystem;
|
use Composer\Util\RemoteFilesystem;
|
||||||
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
||||||
|
@ -162,7 +163,7 @@ class Factory
|
||||||
throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager');
|
throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager');
|
||||||
}
|
}
|
||||||
$factory = new static;
|
$factory = new static;
|
||||||
$rm = $factory->createRepositoryManager($io, $config);
|
$rm = $factory->createRepositoryManager($io, $config, null, self::createRemoteFilesystem($io, $config));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($config->getRepositories() as $index => $repo) {
|
foreach ($config->getRepositories() as $index => $repo) {
|
||||||
|
@ -262,12 +263,14 @@ class Factory
|
||||||
$io->loadConfiguration($config);
|
$io->loadConfiguration($config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$rfs = self::createRemoteFilesystem($io, $config);
|
||||||
|
|
||||||
// initialize event dispatcher
|
// initialize event dispatcher
|
||||||
$dispatcher = new EventDispatcher($composer, $io);
|
$dispatcher = new EventDispatcher($composer, $io);
|
||||||
$composer->setEventDispatcher($dispatcher);
|
$composer->setEventDispatcher($dispatcher);
|
||||||
|
|
||||||
// initialize repository manager
|
// initialize repository manager
|
||||||
$rm = $this->createRepositoryManager($io, $config, $dispatcher);
|
$rm = $this->createRepositoryManager($io, $config, $dispatcher, $rfs);
|
||||||
$composer->setRepositoryManager($rm);
|
$composer->setRepositoryManager($rm);
|
||||||
|
|
||||||
// load local repository
|
// load local repository
|
||||||
|
@ -292,7 +295,7 @@ class Factory
|
||||||
|
|
||||||
if ($fullLoad) {
|
if ($fullLoad) {
|
||||||
// initialize download manager
|
// initialize download manager
|
||||||
$dm = $this->createDownloadManager($io, $config, $dispatcher);
|
$dm = $this->createDownloadManager($io, $config, $dispatcher, $rfs);
|
||||||
$composer->setDownloadManager($dm);
|
$composer->setDownloadManager($dm);
|
||||||
|
|
||||||
// initialize autoload generator
|
// initialize autoload generator
|
||||||
|
@ -336,9 +339,9 @@ class Factory
|
||||||
* @param EventDispatcher $eventDispatcher
|
* @param EventDispatcher $eventDispatcher
|
||||||
* @return Repository\RepositoryManager
|
* @return Repository\RepositoryManager
|
||||||
*/
|
*/
|
||||||
protected function createRepositoryManager(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
|
protected function createRepositoryManager(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$rm = new RepositoryManager($io, $config, $eventDispatcher);
|
$rm = new RepositoryManager($io, $config, $eventDispatcher, $rfs);
|
||||||
$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');
|
||||||
|
@ -391,7 +394,7 @@ class Factory
|
||||||
* @param EventDispatcher $eventDispatcher
|
* @param EventDispatcher $eventDispatcher
|
||||||
* @return Downloader\DownloadManager
|
* @return Downloader\DownloadManager
|
||||||
*/
|
*/
|
||||||
public function createDownloadManager(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
|
public function createDownloadManager(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$cache = null;
|
$cache = null;
|
||||||
if ($config->get('cache-files-ttl') > 0) {
|
if ($config->get('cache-files-ttl') > 0) {
|
||||||
|
@ -412,18 +415,21 @@ class Factory
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$dm->setDownloader('git', new Downloader\GitDownloader($io, $config));
|
$executor = new ProcessExecutor($io);
|
||||||
$dm->setDownloader('svn', new Downloader\SvnDownloader($io, $config));
|
$fs = new Filesystem($executor);
|
||||||
$dm->setDownloader('hg', new Downloader\HgDownloader($io, $config));
|
|
||||||
|
$dm->setDownloader('git', new Downloader\GitDownloader($io, $config, $executor, $fs));
|
||||||
|
$dm->setDownloader('svn', new Downloader\SvnDownloader($io, $config, $executor, $fs));
|
||||||
|
$dm->setDownloader('hg', new Downloader\HgDownloader($io, $config, $executor, $fs));
|
||||||
$dm->setDownloader('perforce', new Downloader\PerforceDownloader($io, $config));
|
$dm->setDownloader('perforce', new Downloader\PerforceDownloader($io, $config));
|
||||||
$dm->setDownloader('zip', new Downloader\ZipDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('zip', new Downloader\ZipDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs));
|
||||||
$dm->setDownloader('rar', new Downloader\RarDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('rar', new Downloader\RarDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs));
|
||||||
$dm->setDownloader('tar', new Downloader\TarDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('tar', new Downloader\TarDownloader($io, $config, $eventDispatcher, $cache, $rfs));
|
||||||
$dm->setDownloader('gzip', new Downloader\GzipDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('gzip', new Downloader\GzipDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs));
|
||||||
$dm->setDownloader('xz', new Downloader\XzDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('xz', new Downloader\XzDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs));
|
||||||
$dm->setDownloader('phar', new Downloader\PharDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('phar', new Downloader\PharDownloader($io, $config, $eventDispatcher, $cache, $rfs));
|
||||||
$dm->setDownloader('file', new Downloader\FileDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('file', new Downloader\FileDownloader($io, $config, $eventDispatcher, $cache, $rfs));
|
||||||
$dm->setDownloader('path', new Downloader\PathDownloader($io, $config, $eventDispatcher, $cache));
|
$dm->setDownloader('path', new Downloader\PathDownloader($io, $config, $eventDispatcher, $cache, $rfs));
|
||||||
|
|
||||||
return $dm;
|
return $dm;
|
||||||
}
|
}
|
||||||
|
@ -515,9 +521,13 @@ class Factory
|
||||||
*/
|
*/
|
||||||
public static function createRemoteFilesystem(IOInterface $io, Config $config = null, $options = array())
|
public static function createRemoteFilesystem(IOInterface $io, Config $config = null, $options = array())
|
||||||
{
|
{
|
||||||
|
static $warned = false;
|
||||||
$disableTls = false;
|
$disableTls = false;
|
||||||
if (isset($config) && $config->get('disable-tls') === true) {
|
if (isset($config) && $config->get('disable-tls') === true) {
|
||||||
|
if (!$warned) {
|
||||||
$io->write('<warning>You are running Composer with SSL/TLS protection disabled.</warning>');
|
$io->write('<warning>You are running Composer with SSL/TLS protection disabled.</warning>');
|
||||||
|
}
|
||||||
|
$warned = true;
|
||||||
$disableTls = true;
|
$disableTls = true;
|
||||||
} elseif (!extension_loaded('openssl')) {
|
} elseif (!extension_loaded('openssl')) {
|
||||||
throw new \RuntimeException('The openssl extension is required for SSL/TLS protection but is not available. '
|
throw new \RuntimeException('The openssl extension is required for SSL/TLS protection but is not available. '
|
||||||
|
|
|
@ -59,7 +59,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
||||||
private $degradedMode = false;
|
private $degradedMode = false;
|
||||||
private $rootData;
|
private $rootData;
|
||||||
|
|
||||||
public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
|
public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
if (!preg_match('{^[\w.]+\??://}', $repoConfig['url'])) {
|
if (!preg_match('{^[\w.]+\??://}', $repoConfig['url'])) {
|
||||||
// assume http as the default protocol
|
// assume http as the default protocol
|
||||||
|
@ -90,7 +90,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
||||||
$this->io = $io;
|
$this->io = $io;
|
||||||
$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->loader = new ArrayLoader();
|
$this->loader = new ArrayLoader();
|
||||||
$this->rfs = Factory::createRemoteFilesystem($this->io, $this->config, $this->options);
|
$this->rfs = $rfs ?: Factory::createRemoteFilesystem($this->io, $this->config, $this->options);
|
||||||
$this->eventDispatcher = $eventDispatcher;
|
$this->eventDispatcher = $eventDispatcher;
|
||||||
$this->repoConfig = $repoConfig;
|
$this->repoConfig = $repoConfig;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ use Composer\IO\IOInterface;
|
||||||
use Composer\Config;
|
use Composer\Config;
|
||||||
use Composer\EventDispatcher\EventDispatcher;
|
use Composer\EventDispatcher\EventDispatcher;
|
||||||
use Composer\Package\PackageInterface;
|
use Composer\Package\PackageInterface;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Repositories manager.
|
* Repositories manager.
|
||||||
|
@ -32,12 +33,14 @@ class RepositoryManager
|
||||||
private $io;
|
private $io;
|
||||||
private $config;
|
private $config;
|
||||||
private $eventDispatcher;
|
private $eventDispatcher;
|
||||||
|
private $rfs;
|
||||||
|
|
||||||
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
|
public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null)
|
||||||
{
|
{
|
||||||
$this->io = $io;
|
$this->io = $io;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->eventDispatcher = $eventDispatcher;
|
$this->eventDispatcher = $eventDispatcher;
|
||||||
|
$this->rfs = $rfs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -102,7 +105,7 @@ class RepositoryManager
|
||||||
|
|
||||||
$class = $this->repositoryClasses[$type];
|
$class = $this->repositoryClasses[$type];
|
||||||
|
|
||||||
return new $class($config, $this->io, $this->config, $this->eventDispatcher);
|
return new $class($config, $this->io, $this->config, $this->eventDispatcher, $this->rfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,7 +33,7 @@ class FactoryMock extends Factory
|
||||||
return $config;
|
return $config;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addLocalRepository(RepositoryManager $rm, $vendorDir)
|
protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, $vendorDir)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue