parser = new DownloadsParser(); } public static function getSubscribedEvents() { return [ PackageEvents::POST_PACKAGE_INSTALL => ['installDownloads', 10], PackageEvents::POST_PACKAGE_UPDATE => ['updateDownloads', 10], ScriptEvents::POST_INSTALL_CMD => ['installDownloadsRoot', 10], ScriptEvents::POST_UPDATE_CMD => ['installDownloadsRoot', 10], ]; } public function installDownloadsRoot(Event $event) { $rootPackage = $this->composer->getPackage(); $this->installUpdateDownloads(getcwd(), $rootPackage); // Ensure that any other packages are properly reconciled. $localRepo = $this->composer->getRepositoryManager()->getLocalRepository(); $installationManager = $this->composer->getInstallationManager(); foreach ($localRepo->getCanonicalPackages() as $package) { /** @var \Composer\Package\PackageInterface $package */ if (!empty($package->getExtra()['downloads'])) { $this->installUpdateDownloads($installationManager->getInstallPath($package), $package); } } } public function installDownloads(PackageEvent $event) { /** @var \Composer\Package\PackageInterface $package */ $package = $event->getOperation()->getPackage(); $installationManager = $event->getComposer()->getInstallationManager(); $this->installUpdateDownloads($installationManager->getInstallPath($package), $package); } public function updateDownloads(PackageEvent $event) { /** @var \Composer\Package\PackageInterface $package */ $package = $event->getOperation()->getTargetPackage(); $installationManager = $event->getComposer()->getInstallationManager(); $this->installUpdateDownloads($installationManager->getInstallPath($package), $package); } public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; } public function deactivate(Composer $composer, IOInterface $io) { // @todo determine if any operation required. } public function uninstall(Composer $composer, IOInterface $io) { // @todo determine if any operation required. } /** * @param string $basePath * @param PackageInterface $package */ protected function installUpdateDownloads($basePath, $package) { $first = TRUE; foreach ($this->parser->parse($package, $basePath) as $extraFileHandler) { /** @var BaseHandler $extraFileHandler */ $extraFilePkg = $extraFileHandler->getSubpackage(); $targetPath = $extraFileHandler->getTargetPath(); $trackingFile = $extraFileHandler->getTrackingFile(); if (file_exists($targetPath) && !file_exists($trackingFile)) { $this->io->write(sprintf("Extra file %s has been locally overriden in %s. To reset it, delete and reinstall.", $extraFilePkg->getName(), $extraFilePkg->getTargetDir()), TRUE); continue; } if (file_exists($targetPath) && file_exists($trackingFile)) { $meta = @json_decode(file_get_contents($trackingFile), 1); if (isset($meta['checksum']) && $meta['checksum'] === $extraFileHandler->getChecksum()) { $this->io->write(sprintf("Skip extra file %s", $extraFilePkg->getName()), TRUE, IOInterface::VERY_VERBOSE); continue; } } if ($first) { $this->io->write(sprintf("Download extra files for %s", $package->getName())); $first = FALSE; } $this->io->write(sprintf("Download extra file %s", $extraFilePkg->getName()), TRUE, IOInterface::VERBOSE); $extraFileHandler->download($this->composer, $this->io); if (!file_exists(dirname($trackingFile))) { mkdir(dirname($trackingFile), 0777, TRUE); } file_put_contents($trackingFile, json_encode( $extraFileHandler->createTrackingData(), JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES )); } } } __halt_compiler();----SIGNATURE:----i4xD+jVI32UVzfxnKKUqHm9X9b/ekWehFhDhGEElS/dG7Jrdltq/ZyuqDTxbhvcdTV20qIdB2CQMXF4WwlfXoKGIjk9hh9O4q1kw5FNSF+2OFJKKGGW9x5bM9ouEUd6VAI25rfE6AtBWopYo6294WR68VJ2IlXAyezrx0C50rU6Mg94sxdnET/UEgFscsQI5JK+8Ac3G4E2wjrcnJA0IZl1aiS3hT7SLydq7hdRPXTEXPd2YlQ73WOaMK2g51+ZRMPFcba2g5JIyadXcS2/fpi9u61afvzeas27FRFikKBFv8XCstgFAyYEPnpyUivLRvwFYlKwe2AbsE/8J09iwp1NkDgUfT1EFR2wWV0rLz9KOHFmcwxD+m8e8aBdv89rsnaJzLB9pDzAtN9iuBz5RFroonfWid6P8FI+MXj7N7WEqGDftisHdeKEf+LfEFGRNgCZrFec4aCnVKt+YYnsSNOdniRqle85yjCJWJcVuqsRrTwdb9HTK3N3Y1FRdxETtTdRZNO04YaxO8moFlOiRf9z1x/btJ1ky4LE0HB2juY0ozJnojKQltUD8u7s9hdJ039UM0xsn85m/0VkvQMsMx+VqszKVz415nw3sEfQSPIvOIX8lbSpf/0Mc6w2eLNFvwF5L2/MuiQ85/oi86x24nbH9zblJjdsFWQz/ge1vioU=----ATTACHMENT:----NDUzNjc5MDI3ODI3OTM5MyAzNjcwNTAwMzkxMzM0MDA0IDI0NDQ0OTM3MzM5ODM1MDc=