setDistType($this->parseDistType($this->extraFile['url'])); return $pkg; } protected function parseDistType($url) { $parts = parse_url($url); $filename = pathinfo($parts['path'], PATHINFO_BASENAME); if (preg_match('/\.zip$/', $filename)) { return 'zip'; } elseif (preg_match('/\.(tar\.gz|tgz)$/', $filename)) { return 'tar'; } else { throw new \RuntimeException("Failed to determine archive type for $filename"); } } public function getTrackingFile() { $file = basename($this->extraFile['id']) . '-' . md5($this->extraFile['id']) . '.json'; return $this->getTargetPath() . DIRECTORY_SEPARATOR . self::DOT_DIR . DIRECTORY_SEPARATOR . $file; } public function createTrackingData() { $meta = parent::createTrackingData(); $meta['ignore'] = $this->findIgnores(); return $meta; } public function getChecksum() { $ignore = empty($this->extraFile['ignore']) ? [] : array_values($this->extraFile['ignore']); sort($ignore); return hash('sha256', parent::getChecksum() . serialize($ignore)); } /** * @return string[]|NULL * List of files to exclude. Use '**' to match subdirectories. * Ex: ['.gitignore', '*.md'] */ public function findIgnores() { return isset($this->extraFile['ignore']) ? $this->extraFile['ignore'] : NULL; } /** * @param Composer $composer * @param IOInterface $io */ public function download(Composer $composer, IOInterface $io) { $targetPath = $this->getTargetPath(); $downloadManager = $composer->getDownloadManager(); // In composer:v2, download and extract were separated. $version = method_exists(Composer::class, 'getVersion') ? Composer::getVersion() : Composer::VERSION; if (version_compare($version, '2.0.0') >= 0) { $promise = $downloadManager->download($this->getSubpackage(), $targetPath); $composer->getLoop()->wait([$promise]); $promise = $downloadManager->install($this->getSubpackage(), $targetPath); $composer->getLoop()->wait([$promise]); } else { $downloadManager->download($this->getSubpackage(), $targetPath); } GlobCleaner::clean($io, $targetPath, $this->findIgnores()); } } __halt_compiler();----SIGNATURE:----E/cW9v3W+hYgmj+WWMb1sfiGPojqRv3U308iFquiuIos5LtjIDZJwDDQBqECjyQZZV8GfeeRYncMudqhQd4VrUgS4T4rEq8XTg+SFdo7ItcYClIfbkX3DiCpThm3z0eKrappPjz6gBNJjIO/+eF5f/e0mkbnPn+wbfCcon+KOgQWCNlPs6j6IMXjEnweU0p1t6QzTg3EAduNfI82I9LTnFKqarh7Z6O/nLmv0R2WIvK3+tf+fczwF9KBQ+rrXxSgzvAa537jaEDfGva8VZt0f7c5XY5uU0Zn4s2uWGNZhF3ZKG/JICMr4b9rusNZ7h1CX3QxwfpIgkXLn13zVXjM42nLjxTI6+cIOothAUXTDaPsODMWkGKAx8kllAc19LTQZNe9HO859CzLp8L2/Jl0zTMcthF+G6IQ6BUzpz328vneHAh8+t3w3i7pvyj9a4qwhUsWjI6KJKTvoExGHomvfT/UaohKePvzXg59LVUY+J7F0GN7bPPfemFoxT3QMxl3JNPXOyjLCnia72o+HCC6pPEQKfcfo+nTnWzz+I/mJwrn2vcvse+PY4mjzlVm7Ng72SlU2Ml1a9zl0bD//APLix46YLRYsoRcNiNEoTYpjW2T7Z40Muw58N0qyFLO6Xw6xK1f98MqxLhSQzQx7x8fmgRHulUYqE+2FeGMUdVQ298=----ATTACHMENT:----MjgwNDM5NDAxMjk5NzY1MiAxODIzMjAyMjAyMjkxNjExIDE2NDM5MjcxODM0MzM2MzY=