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=