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:----PobhXKCabS/6rkmb8d84S5mdE37Me2072tds28h0zj5/VwsJjJil/6cSGtNfkS6iWXu58vjcnWL8w3xmYKqV2hpz5OQso+ETGgkaSXR6VJItczU6Ql/Xqd2tqGuxArknnqM0ESlw5tiU+CjbYEGHCUVXlBnwKFKsDAha4WWcu3uA0H03241U2akb+W3+H2GIMqEDyCmrlK0lBESIsjjRZnYobWywXkFFDnyf42AyeT8CeMxudUd5lNYxC3099YLjkXY6n3LXTlt/GbOKvZtxthu8NSwcBkzqU0zFkX9smeVr3S77laHlRJi00v4b8LiFqbTnwTBCPxYHONiEAGsh4pKMjpP4GBBay8FT0QHOA4fySpOpaFVbAgt1cFZdcK9kCv+v6Ahulz7rVUhhTbt8HCtmPEJPHSm6S3u8JMaHroSAlMFdXVG/po/61GL7k5Ly/6vuY65xjsekYtY1Je8DtsqG5h5lqYclrJcIO3yPSxUTzhvT2rCdLP2Q6kbdaVTzyL2LjAYLhqpI0LjdqPFDBQbS18xV8BS2i896J53bVm+JO88ExUzmfZ8R5NNh/xPWnxUZtmUnTOt9nMTLvq7d0zdwpmbrJ1QA1NdiCKZVe+3fsVWTFFgXz7sHnjEePPV9RiM9PQf5YDnHDFwaEicw5wh3wTpxp6SL6ihQROUoh6s=----ATTACHMENT:----NDYzMjI4NDYzMjcyMjg0MCAxNDA3Mzk1MDMzMjgzMDg4IDMwMDAzOTUwOTAyMDYyNTM=