commit
aac1a25ee3
|
@ -165,6 +165,14 @@ class AwsPlugin implements PluginInterface, EventSubscriberInterface
|
||||||
$this->io = $io;
|
$this->io = $io;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function deactivate(Composer $composer, IOInterface $io)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function uninstall(Composer $composer, IOInterface $io)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public static function getSubscribedEvents()
|
public static function getSubscribedEvents()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
|
@ -179,9 +187,7 @@ class AwsPlugin implements PluginInterface, EventSubscriberInterface
|
||||||
$protocol = parse_url($event->getProcessedUrl(), PHP_URL_SCHEME);
|
$protocol = parse_url($event->getProcessedUrl(), PHP_URL_SCHEME);
|
||||||
|
|
||||||
if ($protocol === 's3') {
|
if ($protocol === 's3') {
|
||||||
$awsClient = new AwsClient($this->io, $this->composer->getConfig());
|
// ...
|
||||||
$s3Downloader = new S3Downloader($this->io, $event->getHttpDownloader()->getOptions(), $awsClient);
|
|
||||||
$event->setHttpdownloader($s3Downloader);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -282,6 +288,12 @@ local project plugins are loaded.
|
||||||
> installed plugins. This may be particularly helpful if any of the plugins
|
> installed plugins. This may be particularly helpful if any of the plugins
|
||||||
> causes errors and you wish to update or uninstall it.
|
> causes errors and you wish to update or uninstall it.
|
||||||
|
|
||||||
|
## Plugin Helpers
|
||||||
|
|
||||||
|
As of Composer 2, due to the fact that DownloaderInterface can sometimes return Promises
|
||||||
|
and have been split up in more steps than they used to, we provide a [SyncHelper][11]
|
||||||
|
to make downloading and installing packages easier.
|
||||||
|
|
||||||
[1]: ../04-schema.md#type
|
[1]: ../04-schema.md#type
|
||||||
[2]: ../04-schema.md#extra
|
[2]: ../04-schema.md#extra
|
||||||
[3]: https://github.com/composer/composer/blob/master/src/Composer/Plugin/PluginInterface.php
|
[3]: https://github.com/composer/composer/blob/master/src/Composer/Plugin/PluginInterface.php
|
||||||
|
@ -292,3 +304,4 @@ local project plugins are loaded.
|
||||||
[8]: https://github.com/composer/composer/blob/master/src/Composer/Plugin/Capable.php
|
[8]: https://github.com/composer/composer/blob/master/src/Composer/Plugin/Capable.php
|
||||||
[9]: https://github.com/composer/composer/blob/master/src/Composer/Plugin/Capability/CommandProvider.php
|
[9]: https://github.com/composer/composer/blob/master/src/Composer/Plugin/Capability/CommandProvider.php
|
||||||
[10]: https://symfony.com/doc/current/components/console.html
|
[10]: https://symfony.com/doc/current/components/console.html
|
||||||
|
[11]: https://github.com/composer/composer/blob/master/src/Composer/Util/SyncHelper.php
|
||||||
|
|
|
@ -591,6 +591,8 @@ class Factory
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* If you are calling this in a plugin, you probably should instead use $composer->getLoop()->getHttpDownloader()
|
||||||
|
*
|
||||||
* @param IOInterface $io IO instance
|
* @param IOInterface $io IO instance
|
||||||
* @param Config $config Config instance
|
* @param Config $config Config instance
|
||||||
* @param array $options Array of options passed directly to HttpDownloader constructor
|
* @param array $options Array of options passed directly to HttpDownloader constructor
|
||||||
|
|
|
@ -21,22 +21,40 @@ use Symfony\Component\Console\Helper\ProgressBar;
|
||||||
*/
|
*/
|
||||||
class Loop
|
class Loop
|
||||||
{
|
{
|
||||||
|
/** @var HttpDownloader */
|
||||||
private $httpDownloader;
|
private $httpDownloader;
|
||||||
|
/** @var ProcessExecutor|null */
|
||||||
private $processExecutor;
|
private $processExecutor;
|
||||||
|
/** @var Promise[]|null */
|
||||||
private $currentPromises;
|
private $currentPromises;
|
||||||
|
|
||||||
public function __construct(HttpDownloader $httpDownloader = null, ProcessExecutor $processExecutor = null)
|
public function __construct(HttpDownloader $httpDownloader, ProcessExecutor $processExecutor = null)
|
||||||
{
|
{
|
||||||
$this->httpDownloader = $httpDownloader;
|
$this->httpDownloader = $httpDownloader;
|
||||||
if ($this->httpDownloader) {
|
$this->httpDownloader->enableAsync();
|
||||||
$this->httpDownloader->enableAsync();
|
|
||||||
}
|
|
||||||
$this->processExecutor = $processExecutor;
|
$this->processExecutor = $processExecutor;
|
||||||
if ($this->processExecutor) {
|
if ($this->processExecutor) {
|
||||||
$this->processExecutor->enableAsync();
|
$this->processExecutor->enableAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return HttpDownloader
|
||||||
|
*/
|
||||||
|
public function getHttpDownloader()
|
||||||
|
{
|
||||||
|
return $this->httpDownloader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ProcessExecutor|null
|
||||||
|
*/
|
||||||
|
public function getProcessExecutor()
|
||||||
|
{
|
||||||
|
return $this->processExecutor;
|
||||||
|
}
|
||||||
|
|
||||||
public function wait(array $promises, ProgressBar $progress = null)
|
public function wait(array $promises, ProgressBar $progress = null)
|
||||||
{
|
{
|
||||||
/** @var \Exception|null */
|
/** @var \Exception|null */
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Composer\Util;
|
||||||
|
|
||||||
|
use Composer\Downloader\DownloaderInterface;
|
||||||
|
use Composer\Package\PackageInterface;
|
||||||
|
use React\Promise\PromiseInterface;
|
||||||
|
|
||||||
|
class SyncHelper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Helps you download + install a single package in a synchronous way
|
||||||
|
*
|
||||||
|
* This executes all the required steps and waits for promises to complete
|
||||||
|
*
|
||||||
|
* @param Loop $loop Loop instance which you can get from $composer->getLoop()
|
||||||
|
* @param DownloaderInterface $downloader Downloader instance you can get from $composer->getDownloadManager()->getDownloader('zip') for example
|
||||||
|
* @param string $path the installation path for the package
|
||||||
|
* @param PackageInterface $package the package to install
|
||||||
|
* @param PackageInterface|null $prevPackage the previous package if this is an update and not an initial installation
|
||||||
|
*/
|
||||||
|
public static function downloadAndInstallPackageSync(Loop $loop, DownloaderInterface $downloader, $path, PackageInterface $package, PackageInterface $prevPackage = null)
|
||||||
|
{
|
||||||
|
$type = $prevPackage ? 'update' : 'install';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self::await($loop, $downloader->download($package, $path, $prevPackage));
|
||||||
|
|
||||||
|
self::await($loop, $downloader->prepare($type, $package, $path, $prevPackage));
|
||||||
|
|
||||||
|
if ($type === 'update') {
|
||||||
|
self::await($loop, $downloader->update($package, $path, $prevPackage));
|
||||||
|
} else {
|
||||||
|
self::await($loop, $downloader->install($package, $path, $prevPackage));
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
self::await($loop, $downloader->cleanup($type, $package, $path, $prevPackage));
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
|
||||||
|
self::await($loop, $downloader->cleanup($type, $package, $path, $prevPackage));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Waits for a promise to resolve
|
||||||
|
*
|
||||||
|
* @param Loop $loop Loop instance which you can get from $composer->getLoop()
|
||||||
|
* @param PromiseInterface|null $promise
|
||||||
|
*/
|
||||||
|
public static function await(Loop $loop, PromiseInterface $promise = null)
|
||||||
|
{
|
||||||
|
if ($promise) {
|
||||||
|
$loop->wait(array($promise));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue