Add sync helper to give plugins utilities to work with async stuff more easily when one does not care about async
parent
7917a7e757
commit
431dc0d526
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?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 string $path the installation path
|
||||||
|
* @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