123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?php
- namespace Aws\Script\Composer;
- use Composer\Script\Event;
- use Symfony\Component\Filesystem\Exception\IOException;
- use Symfony\Component\Filesystem\Filesystem;
- class Composer
- {
- public static function removeUnusedServicesInDev(Event $event, Filesystem $filesystem = null)
- {
- self::removeUnusedServicesWithConfig($event, $filesystem, true);
- }
- public static function removeUnusedServices(Event $event, Filesystem $filesystem = null)
- {
- self::removeUnusedServicesWithConfig($event, $filesystem, false);
- }
- private static function removeUnusedServicesWithConfig(Event $event, Filesystem $filesystem = null, $isDev = false)
- {
- if ($isDev && !$event->isDevMode()){
- return;
- }
- $composer = $event->getComposer();
- $extra = $composer->getPackage()->getExtra();
- $listedServices = isset($extra['aws/aws-sdk-php'])
- ? $extra['aws/aws-sdk-php']
- : [];
- if ($listedServices) {
- $serviceMapping = self::buildServiceMapping();
- self::verifyListedServices($serviceMapping, $listedServices);
- $filesystem = $filesystem ?: new Filesystem();
- $vendorPath = $composer->getConfig()->get('vendor-dir');
- self::removeServiceDirs(
- $event,
- $filesystem,
- $serviceMapping,
- $listedServices,
- $vendorPath
- );
- } else {
- throw new \InvalidArgumentException(
- 'There are no services listed. Did you intend to use this script?'
- );
- }
- }
- public static function buildServiceMapping()
- {
- $serviceMapping = [];
- $manifest = require(__DIR__ . '/../../data/manifest.json.php');
- foreach ($manifest as $service => $attributes) {
- $serviceMapping[$attributes['namespace']] = $service;
- }
- return $serviceMapping;
- }
- private static function verifyListedServices($serviceMapping, $listedServices)
- {
- foreach ($listedServices as $serviceToKeep) {
- if (!isset($serviceMapping[$serviceToKeep])) {
- throw new \InvalidArgumentException(
- "'$serviceToKeep' is not a valid AWS service namespace. Please check spelling and casing."
- );
- }
- }
- }
- private static function removeServiceDirs(
- $event,
- $filesystem,
- $serviceMapping,
- $listedServices,
- $vendorPath
- ) {
- $unsafeForDeletion = ['Kms', 'S3', 'SSO', 'SSOOIDC', 'Sts'];
- if (in_array('DynamoDbStreams', $listedServices)) {
- $unsafeForDeletion[] = 'DynamoDb';
- }
- $clientPath = $vendorPath . '/aws/aws-sdk-php/src/';
- $modelPath = $clientPath . 'data/';
- $deleteCount = 0;
- foreach ($serviceMapping as $clientName => $modelName) {
- if (!in_array($clientName, $listedServices) &&
- !in_array($clientName, $unsafeForDeletion)
- ) {
- $clientDir = $clientPath . $clientName;
- $modelDir = $modelPath . $modelName;
- if ($filesystem->exists([$clientDir, $modelDir])) {
- $attempts = 3;
- $delay = 2;
- while ($attempts) {
- try {
- $filesystem->remove([$clientDir, $modelDir]);
- $deleteCount++;
- break;
- } catch (IOException $e) {
- $attempts--;
- if (!$attempts) {
- throw new IOException(
- "Removal failed after several attempts. Last error: " . $e->getMessage()
- );
- } else {
- sleep($delay);
- $event->getIO()->write(
- "Error encountered: " . $e->getMessage() . ". Retrying..."
- );
- $delay += 2;
- }
- }
- }
- }
- }
- }
- $event->getIO()->write(
- "Removed $deleteCount AWS service" . ($deleteCount === 1 ? '' : 's')
- );
- }
- }
|