From 431dc0d52634a11af3df6c3b49ab84d42442ad48 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 13 Oct 2020 10:54:20 +0200 Subject: [PATCH] Add sync helper to give plugins utilities to work with async stuff more easily when one does not care about async --- src/Composer/Factory.php | 2 ++ src/Composer/Util/SyncHelper.php | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/Composer/Util/SyncHelper.php diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 5d7790d2f..3862ee78d 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.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 Config $config Config instance * @param array $options Array of options passed directly to HttpDownloader constructor diff --git a/src/Composer/Util/SyncHelper.php b/src/Composer/Util/SyncHelper.php new file mode 100644 index 000000000..9b230781f --- /dev/null +++ b/src/Composer/Util/SyncHelper.php @@ -0,0 +1,54 @@ +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)); + } + } +}